Stratégie d'inversion de la moyenne mobile double


Date de création: 2023-12-25 13:24:14 Dernière modification: 2023-12-25 13:24:14
Copier: 1 Nombre de clics: 575
1
Suivre
1621
Abonnés

Stratégie d’inversion de la moyenne mobile double

Aperçu

La stratégie de réversion de la double moyenne mobile est une stratégie de trading quantitatif qui utilise une double moyenne mobile pour identifier les tendances à court et à long terme. La stratégie combine une moyenne mobile simple de 10 jours et une moyenne mobile simple de 200 jours pour capturer des opportunités de reprise à court terme dans une tendance haussière à long terme.

Principe de stratégie

La stratégie d’inversion des moyennes mobiles doubles est basée principalement sur les hypothèses suivantes:

  1. La moyenne mobile simple de 200 jours permet de reconnaître la direction de la tendance à long terme du marché. Lorsque le prix est supérieur à la ligne de 200 jours, il représente le gros de la bourse dans une tendance à la hausse à long terme.

  2. Les moyennes mobiles simples à 10 jours permettent d’identifier un revirement à court terme du marché. Lorsque le prix est inférieur à la ligne à 10 jours, il représente un revirement à court terme.

  3. Dans une tendance à la hausse à long terme, toute reprise à court terme peut être considérée comme une opportunité de faible absorption qui peut être capturée efficacement.

Sur la base des hypothèses ci-dessus, la logique de génération de signaux de transaction de cette stratégie est la suivante:

  1. Lorsque le cours de clôture traverse la ligne de 200 jours et la ligne de 10 jours en même temps, cela représente une tendance à la hausse à long terme et une reprise à court terme, ce qui génère un signal d’achat.

  2. Lorsqu’une position est détenue, si le cours de clôture refait le passage de la ligne de 10 jours, ce qui représente un renversement de tendance à court terme, il faut immédiatement arrêter la perte. En outre, si le cours de l’action a une baisse plus importante qui entraîne une perte jusqu’à la ligne de perte prédéfinie, il faut également arrêter activement la perte.

  3. Lorsqu’il y a une baisse significative de l’ensemble du marché, le moment d’acheter peut être considéré comme une occasion de faible absorption, en utilisant un seuil de baisse prédéfini.

Grâce à cette conception, il est possible d’effectuer efficacement des retraits à faible absorption et de régler les arrêts de perte pour contrôler le risque dans le cas d’une tendance haussière à long terme.

Avantages stratégiques

Les stratégies d’inversion des moyennes mobiles doubles présentent les avantages suivants:

  1. Les stratégies sont claires, simples, faciles à comprendre et à mettre en œuvre.
  2. Les filtres à double moyenne mobile permettent d’identifier efficacement les tendances à court et à long terme de la masse et des actions.
  3. Une meilleure efficacité dans le temps. Une meilleure efficacité dans l’utilisation des fonds peut être obtenue en capturant des retournements à court terme.
  4. Le système d’arrêt de perte intégré permet de contrôler la perte de chaque position.
  5. Les paramètres sont flexibles et s’appliquent à des indices à grande échelle et à des actions populaires.

Risque stratégique

Malgré les avantages évidents d’une stratégie d’inversion des moyennes mobiles doubles, les risques sont les suivants:

  1. La position du gros disque dans le long cours peut générer de faux signaux, ce qui peut affecter la performance de la stratégie. La stratégie doit être suspendue jusqu’à ce qu’une tendance claire soit activée.
  2. Le simple fait de se fier aux moyennes mobiles pour déterminer les tendances et générer des signaux risque d’oublier d’autres caractéristiques utiles. L’introduction de plus d’indicateurs peut être envisagée pour l’optimisation de la combinaison.
  3. Il est possible de tester différents types de mécanismes d’arrêt des pertes, mais une seule méthode d’arrêt des pertes peut être trop rigide.
  4. Les paramètres de la stratégie doivent être adaptés et optimisés pour les différents paramètres, sinon la stabilité est compromise.

Orientation de l’optimisation de la stratégie

La stratégie d’inversion des moyennes mobiles doubles peut être optimisée dans les domaines suivants:

  1. Tester des combinaisons de moyennes mobiles de différentes longueurs pour trouver le paramètre optimal.
  2. Ajout d’autres indicateurs auxiliaires pour former un signal plus stable, tels que le volume de trafic, l’indicateur de secousse, etc.
  3. Tester les différents types de stop loss, tels que le stop tracking, le stop time, etc.
  4. Optimiser les paramètres d’achat et de stop-loss pour s’adapter à l’évolution du marché.
  5. Ajout d’algorithmes d’apprentissage automatique pour optimiser les paramètres avec plus de données historiques.

Résumer

La stratégie d’inversion des moyennes mobiles doubles est une stratégie quantitative très pratique dans l’ensemble. Elle utilise les avantages des moyennes mobiles pour effectuer des arrêts et des pertes faibles dans des transactions à plusieurs têtes sur des lignes longues, ce qui permet d’obtenir des gains élevés sur une seule manche. Elle possède également une certaine capacité d’identification des grands paris et de contrôle des risques.

Code source de la stratégie
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Gold_D_Roger
//note: spreading 1 statement over multiple lines needs 1 apce + 1 tab | multi line function is 1 tab
//Recommended tickers: SPY (D), QQQ (D) and big indexes, AAPL (4H)

//@version=5
strategy("Davin's 10/200MA Pullback on SPY Strategy v2.0",
     overlay=true,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10, // 10% of equity on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.1) //Insert your broker's rate, IB is 0.005USD or tiered

//Best parameters
// SPY D
// Stop loss 0.15
// commission of 0.005 USD using Interactive brokers
// Exit on lower close 
// Buy more when x% down --> 14%
// DO NOT include stop condition using MA crossover

// Get User Input
i_ma1           = input.int(title="MA Length 1", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA 200")
i_ma2           = input.int(title="MA Length 2", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA 10")
i_ma3           = input.int(title="MA Length 3", defval=50, step=1, group="Strategy Parameters", tooltip="MA for crossover signals`")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.15, step=0.01, group="Strategy Parameters", tooltip="Hard stop loss of 10%")
i_startTime     = input(title="Start filter", defval=timestamp("01 Jan 2013 13:30 +0000"), group="Time filter", tooltip="Start date and time to begin")
i_endTime       = input(title="End filter", defval=timestamp("01 Jan 2099 19:30 +0000"), group="Time filter", tooltip="End date and time to stop")
i_lowerClose    = input.bool(title="Exit on lower close", defval=true, group="Strategy Parameters", tooltip="Wait for lower close after above 10SMA before exiting") // optimise exit strat, boolean type creates tickbox type inputs
i_contrarianBuyTheDip = input.bool(title="Buy whenever more than x% drawdown", defval=true, group="Strategy Parameters", tooltip="Buy the dip! Whenever x% or more drawdown on SPY")
i_contrarianTrigger = input.int(title="Trigger % drop to buy the dip", defval=14, step=1, group="Strategy Parameters", tooltip="% drop to trigger contrarian Buy the Dip!") 
//14% to be best for SPY 1D
//20% best for AMZN 1D
i_stopByCrossover_MA2_3 = input.bool(title="Include stop condition using MA crossover", defval=false, group="Strategy Parameters", tooltip="Sell when crossover of MA2/1 happens")

// Get indicator values
ma1 = ta.sma(close,i_ma1) //param 1
ma2 = ta.sma(close,i_ma2) //param 2
ma3 = ta.sma(close,i_ma3) //param 3
ma_9 = ta.ema(close,9) //param 2
ma_20 = ta.ema(close,20) //param 3

// Check filter(s)
f_dateFilter = true //make sure date entries are within acceptable range

// Highest price of the prev 52 days: https://www.tradingcode.net/tradingview/largest-maximum-value/#:~:text=()%20versus%20ta.-,highest(),max()%20and%20ta.
highest52 = ta.highest(high,52)
overall_change = ((highest52 - close[0]) / highest52) * 100

// Check buy/sell conditions
var float buyPrice = 0 //intialise buyPrice, this will change when we enter a trade ; float = decimal number data type 0.0
buyCondition  = (close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter) or (strategy.position_size == 0 and i_contrarianBuyTheDip==true and overall_change > i_contrarianTrigger and f_dateFilter) // higher than 200sma, lower than short term ma (pullback) + avoid pyramiding positions
sellCondition = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])  //check if we already in trade + close above 10MA; 
// third condition: EITHER i_lowerClose not turned on OR closing price has to be < previous candle's LOW [1]

stopDistance  = strategy.position_size > 0 ? ((buyPrice - close)/close) : na // check if in trade > calc % drop dist from entry, if not na
stopPrice     = strategy.position_size > 0 ? (buyPrice - (buyPrice * i_stopPercent)) : na // calc SL price if in trade, if not, na
stopCondition = (strategy.position_size > 0 and stopDistance > i_stopPercent) or (strategy.position_size > 0 and (i_stopByCrossover_MA2_3==true and ma3 < ma1))


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

    
if buyCondition[1] // if buyCondition is true prev candle
    buyPrice := open // entry price = current bar opening price

// Exit position
if sellCondition or stopCondition 
    strategy.close(id="Long", comment = "Exit" + (stopCondition ? "Stop loss=true" : "")) // if condition? "Value for true" : "value for false"
    buyPrice := na //reset buyPrice

// Plot
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) //defval=200
plot(ma2, color=color.white) //defval=10
plot(ma3, color=color.yellow) // defval=50