Stratégie de rupture de l'élan

Auteur:ChaoZhang est là., Date: 2023-11-15 11h09 et 21 min
Les étiquettes:

img

Résumé

La stratégie de rupture de l'élan est une stratégie de trading quantitative qui suit les tendances du marché. Elle calcule l'indicateur d'élan basé sur les prix historiques pour déterminer la tendance et la force des mouvements des prix du marché, dans le but de capturer les tendances à moyen et long terme du marché.

La logique de la stratégie

Le noyau de cette stratégie est basé sur l'indicateur de dynamique. L'indicateur de dynamique est le prix de clôture de la période en cours moins le prix de clôture il y a N périodes. Lorsque la dernière barre de clôture est supérieure à N périodes, la dynamique est positive, indiquant une tendance à la hausse; lorsque la dernière barre de clôture est inférieure à N périodes, la dynamique est négative, indiquant une tendance à la baisse.

La stratégie calcule d'abord la dynamique de 18 périodes, qui est la fermeture actuelle moins la fermeture il y a 18 périodes, stockée dans mom0. Elle calcule ensuite la dynamique de 1 période de mom0, stockée dans mom1.

Lorsque mom0>0 et mom1>0, un signal long est généré, indiquant une forte dynamique haussière.

La stratégie enregistre l'heure des signaux longs et courts les plus récents. Lorsque le temps de signal long est plus récent que le temps de signal court, elle détient une position longue. Lorsque le temps de signal court est plus récent que le temps de signal long, elle détient une position courte.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. La logique est simple et facile à comprendre, adaptée aux débutants dans le trading quantitatif.

  2. Les indicateurs de dynamique peuvent capturer les tendances et la force du marché avec des taux de réussite relativement élevés lors du suivi des tendances à moyen et à long terme.

  3. Le double filtre de momentum aide à éviter les pertes de fausses éruptions.

  4. Il ajoute des positions après un signal pour établir des positions tendance et obtenir des rendements excédentaires pendant les marchés tendance.

  5. Une sortie stop loss en temps opportun contrôle la taille des pertes d'une seule transaction et évite de grosses pertes dues à des renversements.

Analyse des risques

Certains risques de cette stratégie à noter:

  1. Une sortie de stop loss pendant les revirements à court terme dans une tendance haussière, incapable de capturer l'ensemble de la tendance.

  2. Les transactions ouvertes et fermées fréquentes sur des marchés variés augmentent les coûts liés aux commissions et aux slippages.

  3. Les détentions continuées dans la direction initiale après un renversement de tendance augmentent les pertes.

  4. Les paramètres doivent être ajustés pour les différents marchés.

Directions d'optimisation

Quelques façons d'optimiser la stratégie:

  1. Optimiser les paramètres de momentum en ajustant le calcul de la longueur de momentum en fonction du délai et du marché.

  2. Ajoutez d'autres filtres d'indicateurs comme MACD, KD pour éviter les pertes liées aux renversements de tendance.

  3. Optimiser la stratégie de stop loss en élargissant les stops dans les tendances et en resserrant les stops sur les marchés non en tendance.

  4. Ajouter des règles de dimensionnement des positions pour diminuer la taille des positions non tendance et augmenter la taille des positions tendance afin d'obtenir plus de bénéfices.

  5. Optimiser les paramètres séparément pour les différents produits afin d'améliorer l'adaptabilité.

  6. Incorporer des algorithmes d'apprentissage automatique pour optimiser dynamiquement les paramètres.

Conclusion

La stratégie Momentum Breakout est un système intuitif de suivi des tendances. Elle peut capturer efficacement les tendances à moyen et long terme et réaliser de bons bénéfices pendant les marchés en tendance. La gestion des risques par l'optimisation des stop-loss et l'utilisation d'autres indicateurs pour juger de la tendance sont également importantes. Avec une optimisation continue, cette stratégie peut être développée en un système de trading quantitatif générateur de bénéfices stable.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)

Plus de