Stratégie de dynamique stochastique

Auteur:ChaoZhang est là., Date: 2024-01-22 10:13:23 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de dynamique stochastique est une stratégie de trading quantitative qui combine l'indice de dynamique stochastique (SMI) et l'indice de force relative (RSI).

Principes de stratégie

Indice de dynamique stochastique

L'indice de dynamique stochastique (SMI) est un indicateur technique courant utilisé dans le trading quantitatif qui combine les forces des indicateurs de dynamique et d'oscillation.

Plus précisément, l'IMC est calculé comme suit:

SMI = (près - (HH + LL) /2)/(0,5*(HH - LL)) * 100

où HH est le prix le plus élevé au cours des N derniers jours et LL est le prix le plus bas.

La stratégie SMI est basée sur le fait que les valeurs supérieures à 80 sont considérées comme surachetées, tandis que les valeurs inférieures à 20 sont considérées comme survendues.

RSI rapide

L'indice de force relative (RSI) est un indicateur standard de surachat/survente. Cette stratégie utilise un RSI rapide avec une période de 7 pour juger des conditions de surachat/survente à court terme.

Les valeurs inférieures à 20 sont considérées comme survendues, tandis que celles supérieures à 80 sont considérées comme surachetées selon le RSI rapide.

Filtre du corps

La stratégie implémente également un filtre de corps en vérifiant la taille du corps du chandelier pour filtrer certains signaux.

Cela filtre certains faux signaux et augmente la fiabilité.

Les avantages

Combinaison de plusieurs indicateurs

Cette approche combine le SMI, le RSI rapide et le filtre de carrosserie dans un système robuste en 3 parties.

Détection de surachat/survente

L'indice de volatilité moyen (SMI) et l'indice de volatilité rapide (RSI) sont tous deux excellents pour détecter les tendances épuisées.

Commerce dans les deux sens

La capacité d'acheter à la fois des baisses et des hausses courtes maximise les opportunités dans toutes les conditions du marché.

Contrôle des risques

Le filtre de la carrosserie évite les scies en rejetant les signaux de faible conviction dans des conditions de choc.

Les risques

Des piqûres

Les changements fréquents entre long et court entraînent un risque de piqûre.

Des commerces surpeuplés

Les signaux peuvent regrouper les acteurs du marché et provoquer des retours rapides à l'entrée.

Les cygnes noirs

Les événements extrêmes peuvent renverser tous les modèles.

Améliorations

Optimisation des paramètres

En testant différentes périodes SMI/RSI et seuils de filtrage de carrosserie, des valeurs optimales pour des rendements plus élevés pourraient être détectées.

Arrêt dynamique

L'inclusion de stops basés sur la volatilité ou ATR devrait mieux contenir le risque de position et de portefeuille.

Apprentissage automatique

Les modèles qui prédisent les niveaux d'indicateurs futurs pourraient identifier les points tournants plus tôt.

Conclusion

En résumé, en intégrant le SMI, le RSI rapide et le filtre corporel, cette stratégie a créé un système de surachat/survente assez complet. L'approche multi-signal améliore la précision, tandis que la capacité de négociation bidirectionnelle et les contrôles des risques contribuent à l'équilibre.


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

Plus de