La estrategia de negociación de media móvil cruzada es una estrategia de negociación cuantitativa relativamente común. Esta estrategia genera señales de negociación mediante el cálculo de medias móviles de diferentes períodos y de acuerdo con sus situaciones de cruce. Específicamente, calcula las medias móviles exponenciales (EMA) de 4 períodos, 8 períodos y 20 períodos. Cuando la EMA a corto plazo cruza por encima de la EMA a largo plazo, vaya largo; cuando la EMA a corto plazo cruza por debajo de la EMA a largo plazo, vaya corto.
La lógica central de esta estrategia es la siguiente:
A través de este método, aprovechamos el cruce entre diferentes promedios móviles de período para juzgar las señales del mercado, y utilizamos la dirección de la media móvil de período más largo para filtrar las señales falsas, construyendo una estrategia comercial estable.
Las principales ventajas de esta estrategia son las siguientes:
También hay algunos riesgos con esta estrategia:
Las principales soluciones son:
La estrategia se puede optimizar en los siguientes aspectos:
Optimización del período: Determinar la combinación óptima de períodos de MA según las diferentes variedades.
Optimización de pérdidas de parada: Establezca razonablemente puntos de pérdida de parada para controlar pérdidas individuales.
Optimización de parámetros: Optimiza dinámicamente los parámetros utilizando algoritmos genéticos, cadenas de Markov, etc.
Fusión de modelos: se integra con LSTM, RNN y otros modelos de aprendizaje profundo para extraer más alfa.
Optimización de la cartera: Combinar con otras estrategias de indicadores técnicos para construir carteras de estrategias.
En general, la estrategia de cruce de promedios móviles es una estrategia comercial cuantitativa relativamente clásica y comúnmente utilizada. Esta estrategia tiene una lógica simple y es fácil de entender e implementar, con cierta estabilidad. Pero también hay algunos problemas, como generar señales falsas, incapacidad para adaptarse a los cambios del mercado, etc. Estos problemas se pueden mejorar a través de la optimización de parámetros, optimización de pérdidas, fusión de modelos y otros métodos. En general, la estrategia de promedios móviles se puede usar como un módulo básico en la caja de herramientas de estrategia, combinada con estrategias más complejas para construir estrategias complejas robustas.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //future strategy //strategy(title = "stub", default_qty_type = strategy.fixed, default_qty_value = 1, overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2.05) //stock strategy strategy(title = "stub", overlay = true) //forex strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) //crypto strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true, commission_type=strategy.commission.percent,commission_value=.0,default_qty_value=10000) testStartYear = input(1900, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testEndYear = input(2018, "Backtest Start Year") testEndMonth = input(12, "Backtest Start Month") testEndDay = input(1, "Backtest Start Day") testPeriodEnd = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testPeriod() => true ema1 = ema(close,4) ema2 = ema(close,8) ema3 = ema(close,20) go_long = ema1[0] > ema2[0] and ema3[0] > ema3[1] exit_long = ema1[0] < ema2[0] or ema3[0] < ema3[1] go_short = ema1[0] < ema2[0] and ema3[0] < ema3[1] exit_short = ema1[0] > ema2[0] or ema3[0] > ema3[1] if testPeriod() strategy.entry("simpleBuy", strategy.long, when=go_long) strategy.exit("simpleBuy", "simpleSell",when=exit_long) strategy.entry("simpleSell", strategy.short,when=go_short) strategy.exit("simpleSell", "simpleSell",when=exit_short)