Dynamische RSI-Momentumsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-07 15:47:42
Tags:

Übersicht

Die Kernidee dieser Strategie besteht darin, die Glättungsphase des RSI-Indikators dynamisch zu gestalten und automatisch anhand der Korrelation zwischen Preis und Dynamik anzupassen, wodurch die Nützlichkeit des RSI-Indikators verbessert wird.

Strategie Logik

Die Strategie berechnet zuerst den Momentum des Preises, berechnet dann den Korrelationskoeffizienten zwischen Preis und Momentum. Wenn der Korrelationskoeffizient nahe an 1 liegt, bedeutet dies, dass Preis und Momentum stark positiv korreliert sind. Wenn der Korrelationskoeffizient nahe an -1 liegt, bedeutet dies, dass Preis und Momentum stark negativ korreliert sind.

Auf der Grundlage der Korrelation zwischen Preis und Momentum kann die Glättungsperiode des RSI-Indikators angepasst werden.

Nach Berechnung des Korrelationskoeffizienten zwischen Preis und Momentum verwendet sie eine lineare Kartierung, um den Korrelationskoeffizienten als endgültige RSI-Gleichungsphase auf den 20-50-Bereich abzubilden.

Dies ermöglicht es, die RSI-Parameter automatisch anhand der Marktbedingungen anzupassen. Wenn Preisänderungen stark mit Impulsänderungen korrelieren, wird ein kürzerfristiger RSI verwendet, um ihn empfindlicher zu machen. Wenn die Korrelation schwach ist, wird ein längerfristiger RSI verwendet, um die Auswirkungen von Lärm auf das Signal zu reduzieren.

Analyse der Vorteile

  • Dynamische Anpassung der Parameter an Marktveränderungen
  • Vermeidet Einschränkungen von Festzeitrahmenindikatoren
  • Glättungsperiode automatisch optimiert, keine Notwendigkeit, manuell den besten Parameter auszuwählen
  • Konfigurierbarer RSI-Periodenbereich für verschiedene Produkte

Risikoanalyse

  • Die Korrelationsberechnung selbst führt zu Verzögerungen, kann Preiswendepunkte verpassen
  • Nur die Korrelation zwischen Preis und Momentum zu betrachten ist zu vereinfacht und ignoriert andere Faktoren.
  • Standard-RSI-Periodenbereich ist möglicherweise nicht für alle Produkte geeignet, muss optimiert werden
  • Überlegen Sie, andere Faktoren wie Volatilität einzubeziehen, um den RSI-Periode anzupassen.

Optimierungsrichtlinien

  • Versuche verschiedene Korrelationsberechnungsmethoden, um die Verzögerung zu reduzieren
  • Betrachten Sie mehr Faktoren, nicht nur Korrelation, um die RSI-Periode zu bestimmen
  • Backtest auf verschiedenen Produkten zur Ermittlung des optimalen Standard-RSI-Periodenbereichs
  • Kann Korrelationsfaktorgewichte anstelle einer rein linearen Kartierung festlegen
  • Hinzufügen von Filtern, um ungeeignete RSI-Perioden in bestimmten Marktumgebungen zu vermeiden

Zusammenfassung

Die Idee der dynamischen Anpassung des RSI-Gleichungszeitraums lohnt sich zu lernen, aber die spezifische Implementierung bietet viel Raum für Verbesserungen. Der Schlüssel besteht darin, die entscheidenden Faktoren zu identifizieren, die die Auswahl der RSI-Parameter beeinflussen, und sie in quantifizierbare Indikatoren umzuwandeln. Auch verlassen Sie sich nicht nur auf das Modell, empirische Optimierung der Parameterbereiche ist erforderlich. Insgesamt ist dies eine sehr innovative Idee mit praktischem Potenzial nach weiteren Optimierungen und Verbesserungen.


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



Mehr