Estratégia RSI de Momentum Dinâmico

Autora:ChaoZhang, Data: 2023-10-07 15:47:42
Tags:

Resumo

A ideia central desta estratégia é tornar o período de suavização do indicador RSI dinâmico, ajustando-o automaticamente com base na correlação entre preço e momento, melhorando assim a utilidade do indicador RSI.

Estratégia lógica

A estratégia calcula primeiro o momento do preço, em seguida, calcula o coeficiente de correlação entre o preço e o momento. Quando o coeficiente de correlação está perto de 1, isso significa que o preço e o momento estão altamente correlacionados positivamente. Quando o coeficiente de correlação está perto de -1, isso significa que o preço e o momento estão altamente correlacionados negativamente.

Com base na correlação entre o preço e o momento, o período de suavização do indicador RSI pode ser ajustado. Quando a correlação é alta, um período RSI mais curto é usado. Quando a correlação é baixa, um período RSI mais longo é usado.

Especificamente, esta estratégia define o intervalo de período do RSI para ser de 20-50 por padrão.

Isso permite que os parâmetros do RSI sejam ajustados automaticamente com base nas condições do mercado. Quando as mudanças de preço estão fortemente correlacionadas com mudanças de momento, um RSI de período mais curto é usado para torná-lo mais sensível. Quando a correlação é fraca, um RSI de período mais longo é usado para reduzir o impacto do ruído no sinal.

Análise das vantagens

  • Ajuste dinâmico dos parâmetros adapta-se às alterações do mercado
  • Evitar limitações dos indicadores de período fixo
  • Período de suavização é otimizado automaticamente, não é necessário selecionar manualmente o melhor parâmetro
  • Funções de intervalo de período do RSI configurável para diferentes produtos

Análise de riscos

  • O próprio cálculo de correlação introduz atraso, pode perder pontos de virada de preços
  • Considerando apenas a correlação preço-momento é demasiado simplista, ignorando outros fatores
  • Intervalo de período RSI padrão pode não ser adequado para todos os produtos, precisa de otimização
  • Considerar a incorporação de outros fatores como a volatilidade para ajustar o período do RSI

Orientações de otimização

  • Tente diferentes métodos de cálculo de correlação para reduzir o atraso
  • Considere mais fatores, não apenas correlação, para determinar o período do RSI
  • Backtest em diferentes produtos para encontrar o intervalo de período RSI padrão ideal
  • Pode definir ponderações de fatores de correlação, em vez de mapeamento puramente linear
  • Adicionar filtros para evitar períodos de RSI inadequados em determinados ambientes de mercado

Resumo

A ideia de ajustar dinamicamente o período de suavização do RSI vale a pena aprender, mas a implementação específica tem muito espaço para melhoria. A chave é identificar os fatores decisivos que afetam a seleção do parâmetro do RSI e convertê-los em indicadores quantificáveis. Além disso, não confie puramente no modelo, é necessária otimização empírica de intervalos de parâmetros.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")



Mais.