Optimización de cartera con estrategia de media móvil suavizada


Fecha de creación: 2024-01-26 14:57:08 Última modificación: 2024-01-26 14:57:08
Copiar: 1 Número de Visitas: 324
1
Seguir
1166
Seguidores

Optimización de cartera con estrategia de media móvil suavizada

Descripción general

La estrategia se basa en una combinación de medias móviles suaves con indicadores estocásticos, con el objetivo de capturar más oportunidades en la tendencia. Se basa principalmente en la utilización de dos medias móviles de diferentes períodos para formar una señal de estrategia, combinada con el cruce de la línea K y la línea D en los indicadores estocásticos como una opción de entrada en el momento de la oportunidad, con la esperanza de obtener una mayor rentabilidad en la tendencia.

Principio de estrategia

La estrategia utiliza dos promedios móviles lisos de 12 y 26 periodos. Cuando la línea rápida atraviesa la línea lenta desde abajo, haga más; cuando la línea rápida atraviesa la línea lenta desde arriba, haga vacío. Para filtrar las señales falsas, requiere que la línea rápida y la línea lenta sean homogéneas, la línea rápida solo puede hacer más por encima de la línea lenta y la línea rápida solo puede hacer vacío por debajo de la línea lenta.

La línea K en el indicador estocástico se cruza con la línea D como una opción de entrada. Cuando la línea K cruza la línea D desde la dirección inferior de la línea de sobreventa, se hace más; cuando la línea K cruza la línea D desde la dirección inferior de la zona de sobreventa, se hace vacío.

Las medias móviles suaves determinan la dirección de la tendencia, los indicadores estocásticos filtran el ruido y seleccionan el momento de entrada. Su combinación puede obtener más oportunidades de ganar en la tendencia.

Ventajas estratégicas

  • La estrategia de las medias móviles lisas se caracteriza por ser un movimiento por sí mismo y es fácil de seguir
  • Filtración de ruido con indicadores estocásticos para aumentar la probabilidad de ganancias
  • Combinación de línea media rápida y lenta, para obtener mejores oportunidades de juego cuando la línea rápida regresa a la línea lenta
  • La combinación cruzada de la línea K y la línea D en el indicador estocástico permite una mejor selección de puntos de entrada

Por lo tanto, la estrategia puede aprovecharse de manera selectiva y aleatoria para obtener mayores tasas de ganancia.

Análisis de riesgos

  • El riesgo de salir de la cancha en el corto plazo es mayor. Cuando la línea rápida se vuelve a la línea lenta, la señal puede ser rechazada o bloqueada
  • Debido a sus características de fluctuación, no puede adaptarse rápidamente cuando la situación cambia drásticamente, lo que puede causar grandes pérdidas

Para reducir estos riesgos, podemos establecer un stop loss o una combinación de parámetros de media móvil más flexible.

Dirección de optimización

La estrategia puede ser mejorada en los siguientes aspectos:

  1. Prueba diferentes combinaciones de parámetros de la media móvil para encontrar el mejor
  2. Prueba de diferentes combinaciones de parámetros estocásticos
  3. Aumentar las estrategias de alto riesgo
  4. Aumento del deterioro dinámico basado en la volatilidad
  5. Optimización de combinaciones para diferentes parámetros de ciclo en diferentes variedades
  6. Parámetros de optimización para la prueba de algoritmos de aprendizaje automático

Se puede encontrar un parámetro más fuerte probando diferentes combinaciones de parámetros; al mismo tiempo, la creación de una estrategia de stop loss puede reducir el riesgo de manera efectiva y mejorar la estabilidad de la estrategia.

Resumir

La estrategia integra las ventajas de las medias móviles lisas con los indicadores estocásticos, permite seguir la tendencia de manera progresiva y elegir el mejor momento de entrada. Es fácil de operar, el riesgo es controlado y tiene un gran valor práctico. Su rendimiento se puede mejorar aún más a través de pruebas y optimizaciones continuas.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")