Handelsstrategie für den gleitenden Durchschnitt mit linearer Regression

Schriftsteller:ChaoZhang, Datum: 2023-10-25 10:58:02
Tags:

img

Übersicht

Die Linear Regression Moving Average Handelsstrategie erzeugt Kauf- und Verkaufssignale basierend auf den Überschreitungen zwischen einer linearen Regressionslinie und dem gleitenden Durchschnitt des Aktienkurses.

Strategie Logik

Die Strategie berechnet zunächst eine n-tägige lineare Regressionslinie und einen m-tägigen gleitenden Durchschnitt des Aktienkurses.

Wenn der gleitende Durchschnitt über die Regressionslinie geht, signalisiert er eine Stärkung der Aufwärtsdynamik und erzeugt ein Kaufsignal.

Insbesondere folgt die Strategie den folgenden Schritten zur Bestimmung von Handelssignalen:

  1. Berechnen Sie die n-Tage-Lineare Regressionslinie der Preise

  2. Berechnen Sie den einfachen gleitenden Durchschnitt von lrLine, genannt lrMA

  3. Berechnen Sie den m-Tage exponentiellen gleitenden Durchschnitt der Preise, genannt ema

  4. Wenn die EMA über der lrMA liegt, wird ein Kaufsignal erzeugt.

  5. Wenn die EMA unter die IRMA geht, wird ein Verkaufssignal generiert.

  6. Kaufsignale sollten nur dann in Betracht gezogen werden, wenn der Markt bullisch ist

  7. Ausführung von Geschäften auf der Grundlage der Signale

Durch die Verwendung von Crossover zwischen Regressions- und gleitenden Durchschnitten zur Bestimmung von Einträgen kann die Strategie falsche Breaks effektiv herausfiltern und Umkehrungen für niedrigen Kauf und hohen Verkauf identifizieren.

Vorteile

  • Kombination von Trend- und Regressionsanalyse für eine genaue Signalidentifizierung
  • Regressionslinie ist einfach zu berechnen und umzusetzen
  • Verwendet Marktfilterung, um ungünstige Trades zu vermeiden
  • Anpassungsfähige Parameter für die Anpassung der Strategie
  • Erschließt niedriges Kaufen und hohes Verkaufen für Gewinn

Risiken

  • Häufige Kreuzungen während der Volatilität können zu falschen Signalen führen
  • Ungenaue Marktfilter führen zu fehlgeschätzten Einträgen
  • Eine schlechte Einstellung der Parameter beeinträchtigt die Strategieleistung
  • Hohe Handelsfrequenz führt zu höheren Kosten

Die Parameter sollten so eingestellt werden, dass sie die Perioden für gleitende Durchschnittswerte und Regressionslinien erhöhen und die Handelsfrequenz reduzieren. Zur Kontrolle der Risiken sollten angemessene Stop-Losses implementiert werden. Die Marktfilter können verbessert werden, um die Genauigkeit zu verbessern.

Verbesserungen

Die Strategie kann in mehreren Aspekten optimiert werden:

  1. Optimierung des gleitenden Durchschnitts durch Prüfung verschiedener Arten von MA

  2. Optimierung der Regressionslinie durch Anpassung der Berechnungszeit

  3. Optimierung des Marktfilters durch Prüfung verschiedener Indikatoren

  4. Optimierung der Parameter durch strenge Backtesting

  5. Stop-Loss-Optimierung durch Versuchung verschiedener Stop-Loss-Logiken

  6. Kostenoptimierung durch Anpassung der Handelshäufigkeit anhand der Kosten

Diese Optimierungen können die Stabilität und Rentabilität der Strategie weiter verbessern.

Schlussfolgerung

Die Lineare Regressions-MA-Strategie integriert Stärken der Trendanalyse und der linearen Regression zur effektiven Identifizierung von Umkehrungen und zum Kauf von niedrigen Verkaufshöhen. Die einfache Strategie eignet sich für die Auswahl von Aktien über mittelfristige bis langfristige Zeiträume. Mit Parameter-Tuning und Risikokontrolle kann die Strategie noch höhere Stabilität erreichen. Sie bietet einen tragfähigen technischen Handelsrahmen für die Marktanalyse.


/*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)


Mehr