Estrategia de RSI de impulso dinámico

El autor:¿ Qué pasa?, Fecha: 2023-10-07 15:47:42
Las etiquetas:

Resumen general

La idea central de esta estrategia es hacer dinámico el período de suavización del indicador RSI, ajustándolo automáticamente en función de la correlación entre el precio y el impulso, mejorando así la utilidad del indicador RSI.

Estrategia lógica

La estrategia primero calcula el momento del precio, luego calcula el coeficiente de correlación entre el precio y el momento. Cuando el coeficiente de correlación está cerca de 1, significa que el precio y el momento están altamente correlacionados positivamente. Cuando el coeficiente de correlación está cerca de -1, significa que el precio y el momento están altamente correlacionados negativamente.

Basado en la correlación entre el precio y el impulso, el período de suavización del indicador RSI se puede ajustar. Cuando la correlación es alta, se utiliza un período RSI más corto. Cuando la correlación es baja, se utiliza un período RSI más largo.

Específicamente, esta estrategia establece el intervalo de período del RSI como 20-50 por defecto. Después de calcular el coeficiente de correlación entre precio e impulso, utiliza un mapeo lineal para asignar el coeficiente de correlación al intervalo de 20-50 como el período de suavizado final del RSI.

Esto permite que los parámetros del RSI se ajusten automáticamente en función de las condiciones del mercado. Cuando los cambios de precio están fuertemente correlacionados con los cambios de impulso, se utiliza un RSI de período más corto para hacerlo más sensible. Cuando la correlación es débil, se utiliza un RSI de período más largo para reducir el impacto del ruido en la señal.

Análisis de ventajas

  • El ajuste dinámico de los parámetros se adapta a los cambios del mercado
  • Evita las limitaciones de los indicadores de período fijo
  • Período de suavizado se optimiza automáticamente, no es necesario seleccionar manualmente el mejor parámetro
  • Intervalo de periodos del RSI configurable para diferentes productos

Análisis de riesgos

  • El cálculo de la correlación en sí introduce retraso, puede perder los puntos de inflexión del precio
  • Considerar sólo la correlación precio-momento es demasiado simplista, ignora otros factores
  • El rango de período de RSI predeterminado puede no ser adecuado para todos los productos, necesita optimización
  • Considere la posibilidad de incorporar otros factores como la volatilidad para ajustar el período del RSI.

Direcciones de optimización

  • Pruebe diferentes métodos de cálculo de correlación para reducir el retraso
  • Considere más factores, no sólo la correlación, para determinar el período del RSI
  • Prueba de retroceso en diferentes productos para encontrar el rango óptimo de período de RSI por defecto
  • Puede establecer ponderaciones de factores de correlación, en lugar de un mapeo puramente lineal
  • Añadir filtros para evitar períodos de RSI inadecuados en determinados entornos de mercado

Resumen de las actividades

La idea de ajustar dinámicamente el período de suavizado del RSI vale la pena aprender, pero la implementación específica tiene mucho margen de mejora. La clave es identificar los factores decisivos que afectan la selección de parámetros del RSI y convertirlos en indicadores cuantificables. Además, no confíe únicamente en el modelo, se necesita una optimización empírica de rangos de parámetros. En general, esta es una idea muy innovadora, con potencial práctico después de nuevas optimizaciones y mejoras.


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



Más.