La Estrategia de Comercio de Momentum de Tendencia Cuantitativa de JiaYiBing es una estrategia de comercio cuantitativa larga y corta que combina el seguimiento de tendencias, indicadores de momento y canales de Bollinger Bands. La estrategia utiliza el cruce de promedios móviles rápidos y lentos para determinar la dirección de la tendencia y confirma las señales de entrada basadas en canales de Bollinger Bands e indicadores de momento. La estrategia también incluye medidas de control de riesgos como tomar ganancias, stop loss, trailing stop y posicionamiento de tamaño.
El principio básico de esta estrategia es capturar oportunidades de mercado aprovechando las tendencias de precios y los efectos de impulso. Específicamente, la estrategia utiliza dos promedios móviles con períodos diferentes (rápidos y lentos) para determinar la dirección de la tendencia del precio. Cuando el promedio móvil rápido cruza por encima del promedio móvil lento, indica una tendencia al alza y la estrategia genera una señal larga; por el contrario, cuando el promedio móvil rápido cruza por debajo del promedio móvil lento, indica una tendencia a la baja y la estrategia genera una señal corta.
Para confirmar aún más la tendencia y el momento de entrada, la estrategia también incorpora Bandas de Bollinger e indicadores de impulso. Las Bandas de Bollinger consisten en tres líneas: la línea media es el promedio móvil, mientras que las bandas superior e inferior son un cierto número de desviaciones estándar por encima y por debajo de la línea media. Cuando el precio se rompe por encima de la Banda de Bollinger superior, indica un fuerte impulso ascendente y la estrategia será larga; cuando el precio se rompe por debajo de la Banda de Bollinger inferior, indica un fuerte impulso descendente y la estrategia será corta.
Además, la estrategia también introduce un indicador de impulso, que mide la velocidad de los cambios de precios comparando el precio actual con el precio de hace cierto período.
En cuanto al tamaño de la posición, la estrategia permite establecer el tamaño de la posición en función de la equidad de la cuenta y la preferencia de riesgo.
En general, la Estrategia de Comercio de Momentum de Tendencia Cuantitativa de JiaYiBing busca captar las oportunidades de mercado de tendencia al tiempo que controla estrictamente el riesgo a través de múltiples dimensiones como el seguimiento de tendencias, la confirmación de impulso y la gestión de riesgos, con el fin de lograr rendimientos estables de la inversión.
Seguimiento de tendencias: la estrategia utiliza el cruce de medias móviles rápidas y lentas para capturar oportunidades de precios de tendencia, lo que le permite ir largo en tendencias alcistas y corto en tendencias bajistas, adaptándose a diferentes condiciones de mercado.
Confirmación del impulso: la introducción del indicador de impulso como confirmación secundaria de la tendencia ayuda a filtrar las señales falsas y mejorar la calidad de entrada.
Las bandas de Bollinger pueden reflejar el rango de volatilidad de los precios, y las rupturas de las bandas de Bollinger se pueden ver como señales de aceleración de la tendencia o fluctuaciones anormales de los precios, proporcionando una referencia para la entrada.
Posicionamiento: la estrategia emplea un método de posicionamiento basado en un porcentaje del capital de la cuenta y un límite máximo, lo que permite un control flexible del capital empleado en cada operación, tanto utilizando plenamente los fondos como evitando una exposición excesiva al riesgo.
Tome ganancias y detenga pérdidas: los conjuntos de estrategias toman ganancias, stop loss y niveles de stop loss, que pueden proteger las ganancias cuando el precio se mueve en la dirección esperada, y cortar decisivamente las pérdidas cuando el precio se invierte, controlando efectivamente la pérdida máxima de cada operación.
Optimización de múltiples parámetros: La estrategia incluye múltiples parámetros ajustables, como los períodos de promedio móvil, los parámetros de bandas de Bollinger, los porcentajes de toma de ganancias y de pérdidas, etc., que se pueden optimizar para mejorar la adaptabilidad y la robustez de la estrategia.
Comercio frecuente: La estrategia genera señales de entrada basadas en cruces de promedios móviles y rupturas de la banda de Bollinger.
Sensibilidad de parámetros: La estrategia incluye múltiples parámetros, como períodos de promedio móvil, períodos de impulso, parámetros de bandas de Bollinger, etc. La elección de diferentes parámetros puede tener un impacto significativo en el rendimiento de la estrategia.
Reconocimiento de tendencias rezagadas: las medias móviles son indicadores rezagados, especialmente cuando el período de la media móvil es largo, la velocidad de identificación de las inversiones de tendencia será más lenta y el mejor momento de entrada puede faltar.
Riesgo de stop loss: Aunque la estrategia establece medidas de stop loss, en condiciones extremas de mercado (como brechas rápidas), el precio puede cruzar directamente el nivel de stop loss, lo que resulta en pérdidas reales que superan las expectativas.
Riesgo de posición concentrado: si la estrategia genera continuamente señales en la misma dirección durante un determinado período, puede dar lugar a una concentración excesiva de posiciones en una sola dirección, lo que conlleva un mayor riesgo de posición.
Riesgo de liquidez: el rendimiento de la estrategia en las pruebas de retroceso y las operaciones en vivo puede verse afectado por la liquidez del mercado, especialmente cuando se trata de fondos grandes, que pueden enfrentar problemas de deslizamiento y volumen de operaciones insuficiente.
Introducir más indicadores técnicos: sobre la base de los promedios móviles, el impulso y las bandas de Bollinger actuales, se pueden introducir más indicadores técnicos como el RSI y el MACD para mejorar la confiabilidad de las señales a través de la confirmación de múltiples indicadores.
Optimizar los mecanismos de entrada y salida: se pueden introducir más condiciones en el juicio de entrada y salida, tales como exigir un cierto volumen de operaciones antes de las rupturas de precios, el uso de cierre escalonado de la posición o el retraso de las ganancias para las salidas, para mejorar la flexibilidad y la rentabilidad de la estrategia.
Ajuste dinámico de parámetros: para períodos de medias móviles, períodos de impulso, parámetros de bandas de Bollinger, etc., se puede diseñar un conjunto de mecanismos de adaptación de parámetros para ajustar dinámicamente los valores de los parámetros en función de diferentes estados de mercado y niveles de volatilidad, mejorando la adaptabilidad de la estrategia.
Mejorar el tamaño de las posiciones: sobre la base del tamaño actual de las posiciones, se pueden introducir métodos de gestión de dinero más avanzados, como el criterio Kelly, la relación fija, el capital dinámico, etc., para mejorar los rendimientos y los riesgos del saldo.
Combinar con el análisis fundamental: Las estrategias de análisis técnico puro pueden enfrentar el riesgo de ineficiencia o fracaso del mercado. Si algunos factores fundamentales, como los datos macroeconómicos y las tendencias de la industria, pueden combinarse para filtrar y confirmar las señales técnicas, puede mejorar el rendimiento de la estrategia.
Mejorar la consistencia de la prueba de retroceso y el comercio en vivo: El rendimiento de la estrategia en la prueba de retroceso y el comercio en vivo puede diferir. Es necesario centrarse en la calidad de ejecución de la prueba de retroceso y el comercio en vivo, incluidos factores como el precio de ejecución, el deslizamiento y la latencia, para garantizar la consistencia del rendimiento en vivo con los resultados de la prueba de retroceso.
La estrategia de trading de tendencia cuantitativa de JiaYiBing es una estrategia de trading cuantitativa que integra múltiples métodos de análisis técnico.
/*backtest start: 2024-02-01 00:00:00 end: 2024-02-29 23:59:59 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('甲易炳', overlay=true) // Parameters trendPeriod = input(50, 'Trend Period') momentumPeriod = input(14, 'Momentum Period') bbPeriod = input(20, 'Bollinger Bands Period') bbDeviation = input(2, 'Bollinger Bands Deviation') fastMALen = input(23, 'Fast SMA Length') slowMALen = input(50, 'Slow SMA Length') longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01 shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01 stopLossPerc = input.float(0.5, 'Stop Loss %', minval=0.05, step=0.05) * 0.01 enableTrailing = input.bool(true, 'Enable Trailing') trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01 trailingStopLossPerc = input.float(0.5, 'Trailing Stop Loss %', minval=0.05, step=0.05) * 0.01 qty_percent = input.int(20, 'Position Size %', step=1) qty_cap = input.int(10000, 'Max Position Size', step=1000) beast_mode = input.bool(false, 'Beast Mode') set_cap = input.bool(true, 'Cap Position Size') strategy.initial_capital = 50000 // Calculate position size qty1 = (strategy.initial_capital + strategy.netprofit) * qty_percent / 10 / close qty = (set_cap and qty1 > qty_cap) ? qty_cap : qty1 // Calculate moving averages fastMA = ta.sma(close, fastMALen) slowMA = ta.sma(close, slowMALen) // Bollinger Bands [upperBB, middleBB, lowerBB] = ta.bb(close, bbPeriod, bbDeviation) // Entry conditions buySignal = ta.crossover(close, fastMA) and close > upperBB sellSignal = ta.crossunder(close, fastMA) and close < lowerBB // Rampage mode entry conditions if beast_mode buySignal := buySignal and fastMA > fastMA[2] sellSignal := sellSignal and fastMA < fastMA[2] // Active positions longIsActive = buySignal or strategy.position_size > 0 shortIsActive = sellSignal or strategy.position_size < 0 // Declare take profit and stop loss variables var float longTakeProfitPrice = na var float shortTakeProfitPrice = na // Take profit and stop loss calculation if longIsActive if buySignal and not (strategy.position_size > 0) longTakeProfitPrice := close * (1 + longTakeProfitPerc) else longTakeProfitPrice := nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc)) if shortIsActive if sellSignal and not (strategy.position_size < 0) shortTakeProfitPrice := close * (1 - shortTakeProfitPerc) else shortTakeProfitPrice := nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPerc)) longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick longTrailingStopLossPrice = close * (1 - trailingStopLossPerc) shortTrailingStopLossPrice = close * (1 + trailingStopLossPerc) // Entries and exits if strategy.position_size == 0 strategy.entry('Long Entry', qty=qty, direction=strategy.long, when=buySignal, alert_message='Long Entry') strategy.entry('Short Entry', qty=qty, direction=strategy.short, when=sellSignal, alert_message='Short Entry') strategy.exit('Long Take Profit', 'Long Entry', loss=close * stopLossPerc / syminfo.mintick, limit=enableTrailing ? na : longTakeProfitPrice, trail_price=enableTrailing ? longTakeProfitPrice : na, trail_offset=enableTrailing ? longTrailingTakeProfitStepTicks : na, when=longIsActive, alert_message='Long Take Profit') strategy.exit('Short Take Profit', 'Short Entry', loss=close * stopLossPerc / syminfo.mintick, limit=enableTrailing ? na : shortTakeProfitPrice, trail_price=enableTrailing ? shortTakeProfitPrice : na, trail_offset=enableTrailing ? shortTrailingTakeProfitStepTicks : na, when=shortIsActive, alert_message='Short Take Profit') else if longIsActive strategy.exit('Long Stop Loss', 'Long Entry', stop=longTrailingStopLossPrice, when=longIsActive) if shortIsActive strategy.exit('Short Stop Loss', 'Short Entry', stop=shortTrailingStopLossPrice, when=shortIsActive) // Plotting plot(fastMA, 'Fast SMA', color=color.blue, linewidth=1, style=plot.style_line) plot(slowMA, 'Slow SMA', color=color.orange, linewidth=1, style=plot.style_line) plot(upperBB, 'Upper BB', color=color.green, linewidth=1, style=plot.style_line) plot(lowerBB, 'Lower BB', color=color.red, linewidth=1, style=plot.style_line)