Stratégie d'inversion de tendance basée sur des moyennes mobiles

Auteur:ChaoZhang est là., Date: le 21 février 2024 à 17h03
Les étiquettes:

img

Résumé

L'idée principale de cette stratégie est de négocier des retraits à court terme dans la direction de la tendance à long terme. Plus précisément, la moyenne mobile simple de 200 jours est utilisée pour déterminer la direction de la tendance à long terme et la moyenne mobile simple de 10 jours est utilisée pour déterminer la direction de la tendance à court terme. Lorsque le prix est au-dessus de la ligne de 200 jours, c'est un marché haussier. Lorsque le prix est en dessous de la ligne de 200 jours, c'est un marché baissier.

La logique de la stratégie

Cette stratégie utilise la moyenne mobile simple de 200 jours et la moyenne mobile simple de 10 jours pour déterminer la tendance du marché. Lorsque le prix dépasse la ligne de 200 jours, il est considéré comme entrant sur un marché haussier. Lorsque le prix dépasse la ligne de 200 jours, il est considéré comme entrant sur un marché baissier. Dans un marché haussier, si le prix tombe autour de la ligne de 10 jours, cela signifie une correction à court terme. À ce moment-là, allez long, en ciblant la poursuite de la tendance haussière à long terme. Dans un marché baissier, si le prix monte autour de la ligne de 10 jours, cela signifie rencontrer un rebond à court terme. À ce moment-là, allez court, en ciblant la poursuite de la tendance baissière à long terme.

En particulier, lorsque les conditions suivantes sont remplies, allez long pour entrer sur le marché: le prix est au-dessus de la ligne de 200 jours, le prix est au-dessous de la ligne de 10 jours et il n'y avait pas de position précédente. Lorsque les conditions suivantes sont remplies, fermez la position pour sortir du marché: le prix est au-dessus de la ligne de 10 jours et il y avait une position longue précédente. Pour éviter d'énormes pertes, un stop loss FAILSAFE est défini. Si le retracement depuis le point le plus élevé dépasse 10%, arrêtez directement la perte pour sortir.

On peut voir que la logique de négociation de cette stratégie est principalement basée sur la croix d'or et la croix de la mort des moyennes mobiles.

Analyse des avantages

L'avantage le plus important de cette stratégie est le suivi des tendances à faible coût afin de poursuivre des rendements excédentaires.

  1. L'utilisation d'une combinaison de moyennes mobiles à long terme et à court terme pour déterminer la direction des tendances primaires et secondaires permet de bloquer efficacement les opportunités de tendance à moyen et à long terme et d'éviter d'être induit en erreur par les mouvements de marché à court terme.

  2. En entrant sur la base de retraits à court terme, le coût d'entrée peut être réduit au minimum pour obtenir un potentiel de profit relativement élevé.

  3. Le mécanisme d'arrêt des pertes FAILSAFE peut contrôler efficacement les pertes uniques pour protéger les fonds du compte.

  4. En autorisant les sorties de suivi de tendance, les opportunités de tendance à moyen et long terme pour des rendements excédentaires alpha peuvent être pleinement exploitées.

  5. L'adoption d'une méthode de négociation entièrement automatisée évite l'impact émotionnel subjectif et facilite la mise en œuvre de la stratégie.

Analyse des risques

Les principaux risques de cette stratégie sont les suivants:

  1. Les conditions réelles du marché peuvent différer des données historiques, ce qui entraîne une diminution des performances réelles des transactions.

  2. Le risque de faux écarts: la probabilité d'un renversement des prix près des moyennes mobiles est relativement élevée, ce qui peut facilement entraîner de petites pertes accumulées.

  3. Risque de renversement de tendance: les renversements soudains des tendances à moyen et à long terme sont fréquents, ce qui peut facilement entraîner des pertes relativement importantes lors de la détention de positions.

Les contre-mesures sont les suivantes:

  1. Augmenter la taille de l'échantillon et utiliser davantage de données historiques pour les essais de robustesse afin d'assurer des résultats fiables.

  2. Optimiser les paramètres en ajustant la combinaison des paramètres du système de moyenne mobile pour assurer la qualité du signal.

  3. Élargir les lignes d'arrêt de perte de manière appropriée afin de permettre certaines retracements de prix afin d'éviter des arrêts de perte trop sensibles.

Directions d'optimisation

Cette stratégie peut être encore optimisée dans les domaines suivants:

  1. Ajouter des conditions de filtrage telles que le filtrage du volume pour réduire efficacement les transactions inutiles causées par de fausses ruptures.

  2. Incorporer d'autres indicateurs tels que KDJ et MACD pour former des signaux combinés afin d'améliorer la qualité des signaux de trading.

  3. Tester différentes périodes de détention et optimiser les stratégies de prise de profit et de stop-loss pour améliorer davantage le ratio Sharpe, etc.

  4. Ajustez dynamiquement les paramètres en fonction des conditions du marché pour former un mécanisme d'optimisation adaptatif des paramètres afin de rendre la stratégie plus robuste.

  5. Ajouter des modules de trading algorithmique utilisant l'apprentissage automatique, etc. pour générer automatiquement des signaux de trading afin de réduire l'intervention humaine.

Résumé

La logique générale de cette stratégie est claire et facile à mettre en œuvre pour un suivi peu coûteux des tendances à moyen et long terme afin d'obtenir un alpha stable. Mais il existe également des risques de se retrouver du mauvais côté de la tendance qui nécessite une optimisation supplémentaire pour améliorer la robustesse.


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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © irfanp056
// @version=5

strategy("Simple Pullback Strategy", 
     overlay=true, 
     initial_capital=100000,
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=1000, // 100% of balance invested on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.005) // Interactive Brokers rate

// Get user input
i_ma1           = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA")
i_ma2           = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline")
i_lowerClose    = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2")
i_startTime     = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime       = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Get indicator values
ma1 = ta.sma(close, i_ma1)
ma2 = ta.sma(close, i_ma2)

// Check filter(s)
f_dateFilter = true

// Check buy/sell conditions
var float buyPrice = 0
buyCondition    = close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter
sellCondition   = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])
stopDistance    = strategy.position_size > 0 ? ((buyPrice - close) / close) : na
stopPrice       = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na
stopCondition   = strategy.position_size > 0 and stopDistance > i_stopPercent

// Enter positions
if buyCondition
    strategy.entry(id="Long", direction=strategy.long)

if buyCondition[1]
    buyPrice := open

// Exit positions
if sellCondition or stopCondition
    strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
    buyPrice := na

// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)
plot(ma1, color=color.blue)
plot(ma2, color=color.orange)

Plus de