Estratégia de média móvel suavizada Otimização de portfólio


Data de criação: 2024-01-26 14:57:08 última modificação: 2024-01-26 14:57:08
cópia: 1 Cliques: 583
1
focar em
1617
Seguidores

Estratégia de média móvel suavizada Otimização de portfólio

Visão geral

A estratégia é baseada em uma combinação de médias móveis suaves e indicadores estocásticos, com o objetivo de capturar mais oportunidades em uma tendência. Ela usa principalmente médias móveis de indicadores de dois períodos diferentes para formar sinais de estratégia, combinando o cruzamento das linhas K e D nos indicadores estocásticos como uma escolha de tempo de entrada para obter uma maior taxa de ganho em uma tendência.

Princípio da estratégia

A estratégia usa duas médias móveis lisas de 12 e 26 períodos. Quando a linha rápida atravessa a linha lenta de baixo para cima, faça mais; Quando a linha rápida atravessa a linha lenta de cima para baixo, faça vazio. Para filtrar o falso sinal, ela requer que a linha rápida e a linha lenta estejam alinhadas, a linha rápida só pode fazer mais acima da linha lenta e a linha rápida só pode fazer vazio abaixo da linha lenta.

A linha K no indicador estocástico cruza com a linha D como uma opção de entrada. Quando a linha K cruza a linha D na direção abaixo da linha de superaquecimento, faça mais; Quando a linha K cruza a linha D na direção abaixo da zona de superaquecimento, faça vazio.

A média móvel lisa determina a direção da tendência, o indicador estocástico filtra o ruído e seleciona o momento de entrada. A combinação deles pode obter mais oportunidades de lucro na tendência.

Vantagens estratégicas

  • A estratégia de média móvel lisa é caracterizada pela sua própria tendência de fluxo e é fácil de acompanhar
  • Filtração de ruído com indicadores estocásticos para aumentar a probabilidade de lucro
  • Combinação de linha média rápida e lenta, quando a linha rápida é desviada para a linha lenta e volta a entrar, há uma melhor chance de jogar
  • A combinação cruzada de linha K e linha D no indicador estocástico permite uma melhor escolha de pontos de entrada

Assim, a estratégia pode ser gradual e seletiva para aproveitar as oportunidades e, assim, obter maiores taxas de lucro.

Análise de Riscos

  • Risco de saída em curto prazo. Quando a linha rápida é reiniciada para a linha lenta, o sinal pode ser negado ou bloqueado
  • Devido às suas características de tendência, não pode se adaptar rapidamente quando a situação se reverte drasticamente, podendo causar grandes perdas.

Para reduzir esses riscos, podemos definir um stop loss ou usar uma combinação de parâmetros de média móvel mais flexível.

Direção de otimização

A estratégia pode ser melhorada em alguns aspectos:

  1. Teste diferentes combinações de parâmetros de média móvel para encontrar o melhor
  2. Testar combinações de diferentes parâmetros estocásticos
  3. Aumentar a estratégia de stop loss
  4. Aumento do stop loss dinâmico baseado na volatilidade
  5. Teste de combinações de otimização de diferentes variedades com diferentes parâmetros de ciclo
  6. Parâmetros de otimização para testar algoritmos de aprendizagem de máquina

Testando diferentes combinações de parâmetros, é possível encontrar um parâmetro mais forte; ao mesmo tempo, a criação de uma estratégia de parada de perda pode reduzir o risco e aumentar a estabilidade da estratégia.

Resumir

A estratégia integra os benefícios da média móvel e do indicador estocástico, pode acompanhar tendências e escolher melhores momentos de entrada. É fácil de operar, pode controlar o risco e tem grande valor prático. O seu desempenho pode ser ainda melhorado por meio de testes e otimização contínuos.

Código-fonte da estratégia
/*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")