Estrategia de negociación cuantitativa de medias móviles dobles

El autor:¿ Qué pasa?, Fecha: 2023-12-29 11:03:14
Las etiquetas:

img

Resumen general

Esta estrategia está diseñada sobre la base de los indicadores técnicos de la media móvil y el volumen de negociación para una estrategia cuantitativa de tendencia a largo plazo. Cuando el precio de cierre se sitúa por encima de la línea de la media móvil de 20 días y el volumen de compra del día es mayor que el volumen de venta y el volumen de negociación promedio durante los últimos n días, se considera que el mercado está en un estado alcista y es hora de comprar. Cuando el precio de cierre se rompe por debajo de la línea inferior y el volumen de venta del día es mayor que el volumen de compra y el volumen promedio de negociación durante los últimos n días, se considera que el mercado está en un estado bajista y es hora de vender.

Principio de la estrategia

La estrategia se basa principalmente en dos indicadores de evaluación:

  1. Líneas de media móvil doble: Calcular la línea de 20 días y la línea de 60 días. Cuando la línea de 20 días cruza por encima de la línea de 60 días, se considera que el mercado está en una tendencia alcista. Cuando la línea de 20 días cruza por debajo de la línea de 60 días, se considera que el mercado está en una tendencia bajista.

  2. Volumen de negociación: Calcula el volumen diario de compra y el volumen diario de venta. Si el volumen de compra es mayor que el volumen de venta y mayor que el volumen promedio de negociación en los últimos n días, se determina que el mercado es alcista. Si el volumen de venta es mayor que el volumen de compra y mayor que el volumen promedio de negociación en los últimos n días, se determina que el mercado es bajista.

La estrategia y la lógica de negociación específicas son las siguientes:

Cuando el precio de cierre está por encima de la línea de la media móvil de 20 días y el volumen de compra del día es mayor que el volumen de venta y el volumen promedio de negociación en los últimos n días, el mercado se considera alcista.

Cuando el precio de cierre se rompe por debajo de la línea inferior y el volumen de venta del día es mayor que el volumen de compra y el volumen promedio de operaciones en los últimos n días, el mercado se considera bajista.

Toma de ganancias y stop loss: Establece niveles razonables de toma de ganancias y stop loss para bloquear las ganancias o reducir las pérdidas. Por ejemplo, cuando el precio sube un 5% por encima del precio de entrada, toma ganancias; cuando la pérdida alcanza el 10%, stop loss; o cuando el precio alcanza un nuevo máximo reciente y luego retrocede en cierta medida, toma ganancias.

Análisis de ventajas

La estrategia tiene las siguientes ventajas:

  1. La combinación de dos líneas de media móvil e indicadores de volumen de negociación evita los puntos ciegos del juicio sobre un único indicador técnico.

  2. El uso de bandas de Bollinger con diferentes parámetros determina precios de entrada más precisos.

  3. La estrategia de toma de ganancias y stop loss es razonable, lo que ayuda a fijar las ganancias y controlar los riesgos.

  4. Los buenos resultados de backtesting con rendimientos estables, que pueden aplicarse realmente al comercio cuantitativo.

Análisis de riesgos

La estrategia también tiene algunos riesgos:

  1. Las estrategias de medias móviles dobles tienden a producir señales falsas y deben filtrarse por indicadores de volumen.

  2. Los parámetros de las bandas de Bollinger que se establezcan incorrectamente pueden dar lugar a entradas demasiado frecuentes o escasas.

  3. Los puntos de obtención de ganancias fijas e interrupción de pérdidas incorrectos pueden afectar a los rendimientos de la estrategia.

  4. Se requiere una gran cantidad de datos históricos para la backtesting, y aún pueden ocurrir pérdidas inesperadas en el comercio en vivo.

Dirección de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Optimizar los parámetros del sistema de medias móviles para encontrar la combinación óptima de medias móviles.

  2. Optimizar los parámetros de las bandas de Bollinger para una entrada más precisa.

  3. Ajuste dinámico de los puntos de toma de ganancias y stop loss de acuerdo con las condiciones del mercado para establecer ratios razonables de riesgo-recompensa.

  4. Aumentar el juicio de otros indicadores técnicos como MACD, KD, etc. para mejorar la precisión de la estrategia.

  5. Utilice métodos de aprendizaje automático para encontrar automáticamente parámetros óptimos para hacer que las estrategias sean más robustas.

Resumen de las actividades

En general, esta es una estrategia de trading cuantitativa muy práctica con un buen rendimiento de backtesting. Es fácil de implementar, con riesgos controlables, y es una estrategia estable adecuada para el trading en vivo, lo que vale la pena aprender para los traders cuantitativos.


/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
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/
// © KAIST291

//@version=4
strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true)
// SETTING //
length1=input(1)
length3=input(3)
length7=input(7)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=(close>Supper and BV>SV and BV>Davgvol)
bull2=(close>ma20  and BV>SV and BV>Davgvol)
bux =(close<Supper and close>Slower and volume<Wavgvol)
bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol)
hi=highest(exit,10)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>ma3 and ma20>ma60 and rsi<70)
    strategy.entry("Long",strategy.long,0.1)

if (strategy.position_avg_price*1.05<close)
    strategy.close("Long",0.1)

else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long",0.1)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////


Más.