Estrategia cuantitativa de media móvil adaptativa

El autor:¿ Qué pasa?, Fecha: 2023-11-17 17:14:36
Las etiquetas:

Resumen general

Esta estrategia se basa en promedios móviles, puede ajustar automáticamente los parámetros y es adecuada para mercados ondulados en marcos de tiempo altos.

Estrategia lógica

Esta estrategia utiliza un promedio móvil adaptativo como señal de negociación. Primero calcula el promedio móvil simple (CMA) del período especificado (inicio). Luego prueba los parámetros del CMA alrededor del período, juzgando qué combinación tiene menos toques por cuerpo y mecha del candelabro. Finalmente utiliza el CMA con menos toques como la línea de señal.

Específicamente, la estrategia prueba el CMA con el período más 1 (CMA_P1) y menos 1 (CMA_M1), cuenta el número de toques por cuerpo y mecha. Si CMA tiene menos toques que CMA_P1 y CMA_M1, entonces mantenga el período actual; si CMA_P1 tiene menos toques, entonces aumente el período en 1; si CMA_M1 tiene menos toques, entonces disminuya el período en 1. Esto encuentra un CMA relativamente suave como la línea de señal.

Cuando el precio rompe el CMA hacia arriba, se genera una señal de compra; cuando el precio rompe el CMA hacia abajo, se genera una señal de venta.

Análisis de ventajas

Esta estrategia de media móvil adaptativa tiene las siguientes ventajas:

  1. No es necesario seleccionar manualmente el período de media móvil, la estrategia probará diferentes períodos y encontrará el óptimo.

  2. Reduce las señales falsas: en comparación con la MA de período fijo, la MA adaptativa puede filtrar más ruido y reducir muchas señales falsas.

  3. Adaptarse a los cambios del mercado. Cuando el mercado cambia de rango a tendencia, el período de MA aumentará automáticamente para generar señales; cuando el mercado cambia de tendencia a rango, el período de MA disminuirá automáticamente. Así que la estrategia puede adaptarse dinámicamente a los cambios del mercado.

  4. Este método adaptable puede simplificar todo el sistema de negociación sin optimización manual de parámetros.

  5. El concepto se puede aplicar a otros indicadores como bandas de Bollinger adaptativas, KD adaptativa, etc.

Análisis de riesgos

También hay algunos riesgos a tener en cuenta para esta estrategia:

  1. Riesgo de opción de compra. Cuando el mercado tiene un patrón de opción de compra, el cuerpo de la vela puede no romper la línea MA, lo que resulta en señales erróneas.

  2. Riesgo de ruptura fallida. La ruptura de MA no siempre continúa, pueden ocurrir algunas rupturas fallidas. Se necesita validación de ruptura para garantizar una alta tasa de éxito.

  3. Riesgo de reversión de tendencia. La reversión de tendencia después de entrar en la tendencia debe cambiarse a tiempo, de lo contrario puede causar pérdidas. Se debe establecer un stop loss para controlar la pérdida.

  4. El riesgo de optimización de parámetros. Los parámetros ajustados adaptativos pueden caer en la optimización local, lo que resulta en MA redundantes.

  5. Riesgo de sobreajuste. El ajuste excesivo de parámetros puede conducir a un sobreajuste y perder la capacidad de generalización del modelo. Se necesita una verificación prolongada en diferentes entornos de mercado, no solo depender de los resultados de las pruebas de retroceso.

Direcciones de mejora

Algunas direcciones para mejorar esta estrategia de AM adaptativa:

  1. Añadir la validación de la ruptura de tendencia a través de rupturas consecutivas para filtrar las rupturas falsas.

  2. Aumentar la estrategia de stop loss, stop loss cuando el precio vuelve al otro lado de MA.

  3. Añadir un filtro de opción para evitar señales incorrectas cuando aparece la opción de llamada.

  4. Introduzca métricas de evaluación como IC, LIC, SIC, etc. para restringir el ajuste de parámetros y evitar el sobreajuste.

  5. Extensión a otros indicadores como estrategia de cruz de oro adaptativa, bandas de Bollinger adaptativas, etc.

  6. Optimizar el cálculo de la MA utilizando la MA ponderada, la MA exponencial, etc. para obtener una MA más suave.

Resumen de las actividades

Esta estrategia genera señales comerciales ajustando adaptativamente el período de MA para encontrar parámetros óptimos. En comparación con los parámetros fijos, puede reducir muchas señales falsas y adaptarse a los cambios del mercado. Pero también debemos tener cuidado con los riesgos potenciales y hacer verificación y optimización de marcha adelante antes de aplicarlo en el comercio en vivo para obtener ganancias constantes.

[/trans] ¿Qué quieres decir?


/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


Más.