EMA de preços com otimização estocástica baseada em aprendizagem de máquina

Autora:ChaoZhang, Data: 2024-01-26 14:57:08
Tags:

img

Resumo

Esta estratégia combina a média móvel suave com o indicador estocástico para capturar mais oportunidades nas tendências. usa principalmente duas médias móveis exponenciais com períodos diferentes para gerar sinais de negociação, juntamente com o cruzamento da linha K e da linha D no indicador estocástico para seleção de tempo de entrada, a fim de obter maior lucratividade nas tendências.

Princípio da estratégia

A estratégia usa médias móveis suaves de 12 períodos e 26 períodos. Quando a linha rápida cruza acima da linha lenta da parte inferior, vá longo. Quando a linha rápida cruza abaixo da linha lenta da parte superior, vá curto. Para filtrar sinais falsos, requer que as linhas rápidas e lentas estejam na mesma direção, com a linha rápida acima da linha lenta para longa e a linha rápida abaixo da linha lenta para curta.

O cruzamento da linha K e da linha D no indicador estocástico é usado para seleção de tempo de entrada. Quando a linha K cruza acima da linha D abaixo da linha de sobrecompra, vá longo. Quando a linha K cruza abaixo da linha D acima da linha de sobrevenda, vá curto.

A média móvel suave determina a direção da tendência, enquanto o indicador estocástico filtra o ruído e seleciona o tempo de entrada.

Vantagens da estratégia

  • A média móvel suave em si tem a característica de seguir tendências, fácil de rastrear tendências
  • Utilize o Stochastic para filtrar ruído e melhorar a lucratividade
  • A combinação de MA rápidas e lentas permite entrar quando a MA rápida se retira para a MA lenta, obtendo um melhor risco-recompensa
  • O cruzamento da linha K e da linha D proporciona uma otimização adicional do tempo

Por conseguinte, esta estratégia poderia seguir a tendência de forma selectiva para captar oportunidades, obtendo uma maior rentabilidade.

Análise de riscos

  • Alto risco de saída prematura a curto prazo. Os sinais podem ser negados ou presos quando a MA rápida retira para a MA lenta
  • Como segue a tendência, não pode adaptar-se rapidamente a uma inversão drástica da tendência, levando a grandes perdas.

Para reduzir esses riscos, poderíamos definir stop loss, ou adotar parâmetros MA mais moderados.

Orientações de otimização

A estratégia poderá ser melhorada a partir dos seguintes aspectos:

  1. Teste diferentes combinações de parâmetros de MA para encontrar o parâmetro ideal
  2. Teste diferentes combinações de parâmetros estocásticos
  3. Adicionar estratégia de stop loss
  4. Adicionar stop loss dinâmico com base na volatilidade
  5. Optimização dos parâmetros de ensaio em diferentes produtos e prazos
  6. Utilize algoritmos de aprendizagem de máquina para otimizar parâmetros

Além disso, as estratégias de stop loss poderiam efetivamente reduzir o risco e melhorar a estabilidade.

Conclusão

A estratégia integra os pontos fortes da média móvel suave e estocástica para seguir tendências, selecionando um melhor momento de entrada. É fácil de operar, com risco controlado e grande valor prático. Seu desempenho pode ser melhorado através de testes e otimização contínuos. Ele fornece aos comerciantes quant um modelo de rastreamento de tendências eficiente e estável.


/*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")

Mais.