Stochastic Momentum-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-22 10:13:23
Tags:

img

Übersicht

Die Stochastic Momentum Strategy ist eine quantitative Handelsstrategie, die den Stochastic Momentum Index (SMI) und den Relative Strength Index (RSI) kombiniert.

Strategieprinzipien

Stochastic Momentum Index

Der Stochastic Momentum Index (SMI) ist ein allgemeiner technischer Indikator, der im quantitativen Handel verwendet wird und die Stärken von Momentum- und Oszillationsindikatoren kombiniert.

Insbesondere wird der SMI berechnet:

SMI = (nahe - (HH + LL) /2)/(0,5*(HH - LL)) * 100

wobei HH der höchste Preis in den letzten N Tagen und LL der niedrigste Preis ist.

Der SMI beinhaltet also sowohl das trendfolgende Urteil der Dynamik als auch das umgekehrte Urteil der Oszillation. Werte über 80 gelten als überkauft, während Werte unter 20 als überverkauft gelten.

Schnelle RSI

Der Relative Strength Index (RSI) ist ein Standard-Indikator für Überkauf/Überverkauf.

Bei Messungen unter 20 gelten als überverkauft, während bei Messungen über 80 als übergekauft angesehen wird.

Körperfilter

Die Strategie implementiert auch einen Körperfilter, indem sie die Körpergröße des Kerzenhalters überprüft, um bestimmte Signale zu filtern.

Dies filtert einige falsche Signale aus und erhöht die Zuverlässigkeit.

Vorteile

Kombination aus mehreren Indikatoren

Dieser Ansatz kombiniert SMI, schnelle RSI und Körperfilter zu einem robusten 3-teiligen System.

Nachweis von Überkauf/Überverkauf

Sowohl der SMI als auch der schnelle RSI eignen sich hervorragend zur Erkennung erschöpfter Trends.

Zwei-Wege-Handel

Die Fähigkeit, sowohl Tiefgänge als auch kurze Rallyes zu kaufen, maximiert die Chancen unter Marktbedingungen.

Risikokontrolle

Der Körperfilter vermeidet Whipsaws, indem er in schwierigen Bedingungen Signalen mit geringer Überzeugung ablehnt.

Risiken

Schleudersägen

Häufige lange/kurze Umschaltungen bringen das Whipsaw-Risiko mit sich.

Überfüllte Branchen

Die Signalübertragung kann Marktteilnehmer zusammenführen und schnelle Umkehrungen beim Eintritt auslösen.

Schwarze Schwäne

Extreme Ereignisse können alle Modelle auf den Kopf stellen. Intelligente Stop-Loss sind notwendig, um systematische Risiken zu kontrollieren.

Verbesserungen

Optimierung der Parameter

Durch die Prüfung verschiedener SMI/RSI-Perioden und Körperfilterschwellenwerte könnten optimale Werte für höhere Renditen ermittelt werden.

Dynamische Haltestellen

Die Einbeziehung von volatilitätsbasierten oder ATR-Stopps würde besser das Positions- und Portfoliorisiko enthalten.

Maschinelles Lernen

Modelle, die zukünftige Indikatorniveaus vorhersagen, könnten Wendepunkte früher identifizieren.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass diese Strategie durch die Integration von SMI, schnellerem RSI und Körperfilter ein ziemlich umfassendes Überkauf/Überverkaufssystem geschaffen hat.


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Mehr