Stratégie RSI dynamique

Auteur:ChaoZhang est là., Date: 2023-10-07 15:47:42 Je vous en prie.
Les étiquettes:

Résumé

L'idée de base de cette stratégie est de rendre dynamique la période de lissage de l'indicateur RSI, en l'ajustant automatiquement en fonction de la corrélation entre prix et dynamique, améliorant ainsi l'utilité de l'indicateur RSI.

La logique de la stratégie

La stratégie calcule d'abord l'élan du prix, puis calcule le coefficient de corrélation entre le prix et l'élan. Lorsque le coefficient de corrélation est proche de 1, cela signifie que le prix et l'élan sont fortement corrélés positivement. Lorsque le coefficient de corrélation est proche de -1, cela signifie que le prix et l'élan sont fortement corrélés négativement.

En fonction de la corrélation entre le prix et la dynamique, la période de lissage de l'indicateur RSI peut être ajustée.

Plus précisément, cette stratégie définit la plage de période du RSI à 20 à 50 par défaut. Après avoir calculé le coefficient de corrélation entre le prix et l'élan, elle utilise une cartographie linéaire pour cartographier le coefficient de corrélation à la plage de 20 à 50 comme la période de lissage finale du RSI.

Cela permet d'ajuster automatiquement les paramètres du RSI en fonction des conditions du marché. Lorsque les changements de prix sont fortement corrélés avec les changements de momentum, un RSI à courte période est utilisé pour le rendre plus sensible. Lorsque la corrélation est faible, un RSI à plus longue période est utilisé pour réduire l'impact du bruit sur le signal.

Analyse des avantages

  • L'ajustement dynamique des paramètres s'adapte aux changements du marché
  • Éviter les limites des indicateurs à période fixe
  • Période d'aplatissement est optimisée automatiquement, pas besoin de sélectionner manuellement le meilleur paramètre
  • Fonctionnement de la plage de périodes RSI configurable pour différents produits

Analyse des risques

  • Le calcul de la corrélation lui-même introduit un décalage, peut manquer les points tournants des prix
  • Il est trop simpliste de considérer uniquement la corrélation prix-élan, en ignorant d'autres facteurs
  • La fourchette de périodes RSI par défaut peut ne pas convenir à tous les produits, nécessite une optimisation
  • Envisager d' incorporer d' autres facteurs tels que la volatilité pour ajuster la période de l' RSI

Directions d'optimisation

  • Essayez différentes méthodes de calcul de la corrélation pour réduire le retard
  • Considérez d'autres facteurs, pas seulement la corrélation, pour déterminer la période de l'ISR
  • Test de retour sur différents produits pour trouver la plage optimale de périodes RSI par défaut
  • Peut définir des poids de facteur de corrélation, au lieu d'une cartographie purement linéaire
  • Ajouter des filtres pour éviter des périodes de RSI inappropriées dans certains environnements de marché

Résumé

L'idée d'ajuster dynamiquement la période de lissage du RSI vaut la peine d'être apprise, mais la mise en œuvre spécifique a beaucoup de marge d'amélioration. La clé est d'identifier les facteurs décisifs affectant la sélection des paramètres du RSI et de les convertir en indicateurs quantifiables.


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



Plus de