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 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:
Calculer la ligne de régression linéaire des prix n jours
Calculer la moyenne mobile simple en m jours de lrLine appelée lrMA
Calculer la moyenne mobile exponentielle des prix en m jours appelée EMA
Lorsque l'EMA dépasse l'IRMA, générer un signal d'achat longEntrée
Lorsque l'EMA dépasse l'IRMA, générer un signal de vente longExit
Considérez uniquement les signaux d'achat lorsque le marché est haussier
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 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.
La stratégie peut être optimisée sous plusieurs aspects:
Optimisation de la moyenne mobile par test de différents types d'AM
Optimisation de la ligne de régression par ajustement de la période de calcul
Optimisation du filtre du marché par le test de différents indicateurs
Optimisation des paramètres grâce à un backtesting rigoureux
Optimisation de la perte d'arrêt en testant différentes logiques de perte d'arrêt
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.
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)