Estratégia RSI Correlacionada com Momentum


Data de criação: 2023-10-07 15:47:42 última modificação: 2023-10-07 15:47:42
cópia: 0 Cliques: 483
1
focar em
1218
Seguidores

Visão geral

A ideia central da estratégia é tornar o ciclo de suavização do RSI dinâmico, ajustando-se automaticamente de acordo com a correlação entre o preço e a dinâmica, melhorando a praticidade do RSI.

Princípio da estratégia

A estratégia primeiro calcula a dinâmica dos preços e, em seguida, calcula o coeficiente de correlação entre preço e dinâmica. Quando o coeficiente de correlação é próximo a 1, o preço e a dinâmica estão altamente correlacionados; quando o coeficiente de correlação é próximo a 1, o preço e a dinâmica estão altamente correlacionados.

De acordo com a correlação entre o preço e a dinâmica, pode-se ajustar o comprimento do ciclo de smoothing do indicador RSI. Quando a correlação é alta, use um ciclo RSI mais curto; Quando a correlação é baixa, use um ciclo RSI mais longo.

Especificamente, esta estratégia define o comprimento do ciclo RSI como um intervalo de 20 a 50 por defeito. Após calcular os coeficientes relevantes de preço e dinâmica, os coeficientes relevantes são mapeados para o intervalo de 20 a 50 por meio do método de mapeamento linear como o comprimento do ciclo de smoothing final do RSI.

Isso permite ajustar automaticamente os parâmetros do indicador RSI de acordo com as condições do mercado, usando um RSI mais curto para torná-lo mais sensível quando há uma forte correlação entre a mudança de preço e a mudança de momentum; e, quando a correlação não é forte, usando um RSI mais longo para reduzir o impacto do ruído no sinal.

Análise de vantagens

  • Parâmetros de ajuste dinâmico para adaptação às mudanças do mercado
  • Evite as limitações do uso de indicadores de ciclo fixo
  • Otimização automática do ciclo de alisamento, sem necessidade de seleção manual dos melhores parâmetros
  • Rango de ciclo RSI configurável para diferentes variedades

Análise de Riscos

  • O cálculo da correlação, por si só, introduziu um atraso que pode ter perdido o ponto de inflexão do preço.
  • A correlação entre o preço e a dinâmica é demasiado monotônica e ignora outros fatores
  • O intervalo de ciclo RSI padrão pode não ser adequado para todas as variedades e precisa ser otimizado
  • Considerações podem ser feitas para ajustar o ciclo do RSI em combinação com outros fatores, como a volatilidade.

Direção de otimização

  • Tente diferentes métodos de cálculo de Related para reduzir o atraso
  • Considere a introdução de mais fatores para determinar o ciclo do RSI, e não depender apenas da correlação
  • Testes de retorno em diferentes variedades para encontrar o melhor intervalo de ciclo RSI padrão
  • Pode-se definir o peso do fator de correlação, em vez de depender totalmente do mapeamento linear
  • Adição de condições de filtragem para evitar o uso de períodos RSI inapropriados para um determinado cenário de mercado

Resumir

A estratégia vale a pena aprender a idéia de ajustar dinamicamente o ciclo de suavização do RSI, mas há muito espaço para melhoria na implementação concreta. A chave é encontrar os fatores decisivos que afetam a escolha dos parâmetros do RSI e traduzi-los em indicadores quantificáveis. Ao mesmo tempo, não se baseie exclusivamente no modelo e também otimizar o alcance dos parâmetros com base na experiência e no feedback.

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