Stratégie de négociation de moyenne mobile à régression linéaire

Auteur:ChaoZhang est là., Date: 2023-10-25 10:58:02 Je vous en prie.
Les étiquettes:

img

Résumé

La stratégie de négociation de la moyenne mobile de régression linéaire génère des signaux d'achat et de vente basés sur les croisements entre une ligne de régression linéaire et la moyenne mobile du prix de l'action.

La logique de la stratégie

La stratégie calcule d'abord une ligne de régression linéaire n-day et une moyenne mobile m-day du prix de l'action.

Lorsque la moyenne mobile traverse au-dessus de la ligne de régression, elle signale un renforcement de l'élan à la hausse et génère un signal d'achat.

Plus précisément, la stratégie suit les étapes suivantes pour déterminer les signaux commerciaux:

  1. Calculer la ligne de régression linéaire des prix n jours

  2. Calculer la moyenne mobile simple en m jours de lrLine appelée lrMA

  3. Calculer la moyenne mobile exponentielle des prix en m jours appelée EMA

  4. Lorsque l'EMA dépasse l'IRMA, générer un signal d'achat longEntrée

  5. Lorsque l'EMA dépasse l'IRMA, générer un signal de vente longExit

  6. Considérez uniquement les signaux d'achat lorsque le marché est haussier

  7. Exécuter des transactions basées sur les signaux

En utilisant le croisement entre la régression et les moyennes mobiles pour déterminer les entrées, la stratégie peut filtrer efficacement les fausses ruptures et identifier les renversements pour acheter bas et vendre haut.

Les avantages

  • Combine l'analyse de tendance et de régression pour une identification précise du signal
  • La ligne de régression est simple à calculer et à mettre en œuvre
  • Utilise le filtrage du marché pour éviter les transactions défavorables
  • Paramètres personnalisables pour l'ajustement de la stratégie
  • Achète à bas prix et vend à haut prix pour réaliser un profit

Les risques

  • Des croisements fréquents pendant la volatilité peuvent générer de faux signaux
  • Des filtres de marché inexacts conduisent à des entrées imprécises
  • Un mauvais réglage des paramètres affecte les performances de la stratégie
  • Une fréquence de négociation élevée entraîne des coûts plus élevés

Les paramètres doivent être ajustés pour augmenter les périodes de moyenne mobile et de ligne de régression et réduire la fréquence des transactions. Des stop-loss raisonnables doivent être mis en œuvre pour contrôler les risques. Les filtres de marché peuvent être améliorés pour améliorer la précision.

Améliorations

La stratégie peut être optimisée sous plusieurs aspects:

  1. Optimisation de la moyenne mobile par test de différents types d'AM

  2. Optimisation de la ligne de régression par ajustement de la période de calcul

  3. Optimisation du filtre du marché par le test de différents indicateurs

  4. Optimisation des paramètres grâce à un backtesting rigoureux

  5. Optimisation de la perte d'arrêt en testant différentes logiques de perte d'arrêt

  6. Optimisation des coûts en ajustant la fréquence des échanges en fonction des coûts

Ces optimisations peuvent encore améliorer la stabilité et la rentabilité de la stratégie.

Conclusion

La stratégie Linear Regression MA intègre les atouts de l'analyse de tendance et de la régression linéaire pour une identification efficace de l'inversion et l'achat à bas prix. La stratégie simple convient au choix d'actions sur des horizons à moyen et long terme. Avec le réglage des paramètres et le contrôle des risques, la stratégie peut atteindre une stabilité encore plus élevée. Elle fournit un cadre technique viable pour l'analyse du marché.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


Plus de