La estrategia cuantitativa de cruce de promedios móviles es una estrategia de comercio cuantitativa a medio y largo plazo. Determina la dirección de tendencia del mercado a través del cruce de promedios móviles rápidos y lentos, y entra en el mercado bajo la premisa de identificar una tendencia efectiva. Al mismo tiempo, esta estrategia también establece un promedio móvil de ciclo más largo como filtro de tendencia, de modo que las señales comerciales válidas solo pueden generarse cuando los precios rompen ese promedio móvil.
Esta estrategia se basa principalmente en el principio de cruce de promedios móviles. Específicamente, se calculan dos promedios móviles con períodos diferentes, generalmente establecidos en líneas de 20 días y 50 días. Se genera una señal de compra cuando la línea de 20 días se rompe por encima de la línea de 50 días desde abajo hacia arriba, y se genera una señal de venta cuando la línea de 20 días rompe la línea de 50 días desde arriba hacia abajo.
Además, la estrategia también establece un promedio móvil de 200 días como el punto de referencia general de la tendencia. Solo cuando el precio rompe la línea de 200 días, las señales cruzadas simples mencionadas anteriormente se consideran válidas. Esto constituye un mecanismo de filtrado de tendencias para evitar generar muchas señales inválidas en un mercado limitado por el rango.
La frecuencia de negociación a medio y largo plazo evita una negociación excesiva, reduciendo los costes de negociación y los riesgos de deslizamiento.
La determinación de la media móvil cruzada es clara y fácil de entender e implementar.
El mecanismo de filtrado de tendencias puede filtrar la mayoría de las señales inválidas y mejorar la tasa de ganancia.
El ajuste flexible de los parámetros de la media móvil es aplicable a diferentes variedades y ciclos de tiempo.
El stop loss y el take profit se pueden configurar para controlar un solo beneficio y pérdida.
Cuando el precio oscila alrededor de los promedios móviles, se pueden generar múltiples señales inválidas que resultan en una sobre negociación.
Los promedios móviles de ciclo largo pueden quedarse rezagados con respecto al mercado, por lo que se pierden los puntos de inversión de tendencia.
Se requieren datos históricos relativamente largos para establecer medias móviles de referencia, por lo que no se pueden aplicar nuevas variedades o ciclos cortos.
Los parámetros de la estrategia necesitan pruebas y optimización repetidas, la configuración incorrecta puede causar el fracaso de la estrategia.
Mitigación de riesgos:
Adoptar promedios móviles de ciclo más largo o aumentar las condiciones de filtración de tendencias.
Incorporar otros indicadores para determinar la tendencia principal, tales como indicadores de energía, indicadores de volatilidad, etc.
Mejorar la capacidad de adaptación de los parámetros del ciclo de la media móvil.
Mejorar la optimización de parámetros y los mecanismos de retroalimentación para ajustar dinámicamente los parámetros de la estrategia.
Pruebe diferentes tipos de promedios móviles, como la media móvil ponderada lineal.
Aumentar la funcionalidad del ciclo de la media móvil adaptativa.
Incorporar indicadores de volatilidad para determinar las etapas de tendencia, mejorando la validez de los cruces de las medias móviles.
Introducir algoritmos de aprendizaje automático para optimizar automáticamente los parámetros de la estrategia.
Explorar estrategias de combinación de activos múltiples utilizando correlaciones entre activos para obtener ganancias.
La estrategia de cruce de promedio móvil de filtro de tendencia es en general una estrategia cuantitativa de mediano a largo plazo simple y práctica. Determina la tendencia de mediano a largo plazo a través del cruce de promedio móvil, y luego utiliza el filtrado de tendencias para reducir las señales inválidas. Esta estrategia tiene la ventaja de ser fácil de entender e implementar, adecuada para principiantes en el comercio cuantitativo. Las áreas potenciales de mejora se encuentran en la optimización de los promedios móviles, así como en la integración con otros indicadores y algoritmos de aprendizaje automático.
/*backtest start: 2023-11-23 00:00:00 end: 2023-11-30 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //////////////////////////////////////////////////////////////////////////////// // Booz Strategy // Developed for Godstime // Version 1.1 // 11/28/2021 //////////////////////////////////////////////////////////////////////////////// //@version=4 strategy("Booz Strategy", "", true) // ----------------------------- Inputs ------------------------------------- // source_ma_type = input("EMA", "Source MA Type", options=["SMA", "EMA"]) source_ma_length = input(50, "Source MA Length") fast_ma_length = input(20, "Fast MA Length") slow_ma_length = input(50, "Slow MA Length") use_trend_filter = input(true, "Trend Filter") trend_filter_ma_type = input("EMA", "Trend Filter MA Type", options=["SMA", "EMA"]) trend_filter_ma_length = input(200, "Trend Filter MA Period") show_mas = input(true, "Show MAs") swing_trading_mode = input(false, "Swing Trading") // -------------------------- Calculations ---------------------------------- // fast_ma = ema(close, fast_ma_length) slow_ma = ema(close, slow_ma_length) source_ma = source_ma_type == "EMA"? ema(close, source_ma_length): sma(close, source_ma_length) trend_filter_ma = trend_filter_ma_type == "EMA"? ema(close, trend_filter_ma_length): sma(close, trend_filter_ma_length) // --------------------------- Conditions ----------------------------------- // uptrend = not use_trend_filter or close > trend_filter_ma buy_cond = crossover(fast_ma, slow_ma) and uptrend downtrend = not use_trend_filter or close < trend_filter_ma sell_cond = crossunder(fast_ma, slow_ma) and downtrend // ---------------------------- Plotting ------------------------------------ // bgcolor(use_trend_filter and downtrend? color.red: use_trend_filter? color.green: na) plot(show_mas? fast_ma: na, "Fast MA", color.green) plot(show_mas? slow_ma: na, "Slow MA", color.red) plot(show_mas? source_ma: na, "Source MA", color.purple) plot(show_mas? trend_filter_ma: na, "Trend Filter MA", color.blue) // ---------------------------- Trading ------------------------------------ // // Inputs sl_perc = input(1.0, "Stop Loss (in %)", group="Backtest Control")/100 tp_perc = input(1.0, "Take Profit (in %)", group="Backtest Control")/100 leverage = input(10, "Leverage", maxval=100, group="Backtest Control") bt_start_time = input(timestamp("2021 01 01"), "Backtest Start Time", input.time, group="Backtest Control") bt_end_time = input(timestamp("2021 12 31"), "Backtest End Time", input.time, group="Backtest Control") // Trading Window in_trading_window = true trade_qty = 1 // Long Side strategy.entry("Long Entry", strategy.long, trade_qty, when=buy_cond and in_trading_window) long_tp = strategy.position_avg_price * (1 + tp_perc) long_sl = strategy.position_avg_price * (1 - sl_perc) if not swing_trading_mode strategy.exit("Long Exit", "Long Entry", limit=long_tp, stop=long_sl) // Short Side strategy.entry("Short Entry", strategy.short, trade_qty, when=sell_cond and in_trading_window) short_tp = strategy.position_avg_price * (1 - tp_perc) short_sl = strategy.position_avg_price * (1 + sl_perc) if not swing_trading_mode strategy.exit("Short Exit", "Short Entry", limit=short_tp, stop=short_sl) // End of trading window close strategy.close_all(when=not in_trading_window)