Adaptive Zero Lag Exponential Moving Average Quantitative Handelsstrategie


Erstellungsdatum: 2024-02-19 15:38:02 zuletzt geändert: 2024-02-19 15:38:02
Kopie: 0 Klicks: 841
1
konzentrieren Sie sich auf
1617
Anhänger

Adaptive Zero Lag Exponential Moving Average Quantitative Handelsstrategie

Überblick

Die Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy ist eine quantitative Trading-Strategie, die auf dem Konzept des Zero Lag Exponential Moving Average von Ehlers basiert. Die Strategie verwendet den Index-Moving-Average als Basisindikator und fügt die Adaptionsmethode der Instantaneous Frequency Measurement hinzu, um die Perioden der Index-Moving-Average dynamisch zu optimieren.

Strategieprinzip

Die Kernidee der Strategie stammt aus John Ehlers Theorie des Null-Lager-Filters. Der Index-Moving-Average ist zwar ein bekannter technischer Indikator, hat aber seine natürliche Problematik der Lagritude. Ehlers kann die Lagritude effektiv beseitigen, indem er einen Fehlerkorrekturfaktor in die Berechnungsformel des Index-Moving-Averages einfügt, wodurch der Index-Moving-Average mit Null-Lager-Lager-Average die Preisentwicklung empfindlicher verfolgen kann.

In der EMA-Strategie für die Anpassung an den Null-Lager-Zyklus nutzen wir die Methode der Instant-Frequenzmessung, um die Periodiparameter des Null-Lager-Index-Moving-Averages selbst anzupassen. Die Instant-Frequenzmessung ist in zwei Arten unterteilt: die Abstufungsmethode und die Positiv-Symmetrie, mit denen die vorherrschende Periode der Preisfolge-Veränderung gemessen werden kann. Wir verfolgen in Echtzeit die optimale Periode, die durch diese beiden Messmethoden berechnet wird, und setzen die Periodiparameter des Null-Lager-Index-Moving-Averages dynamisch fest, um sie besser an die aktuelle Marktumgebung anzupassen.

Wenn die schnelle Linie (Zero Lag Index Moving Average) über die langsame Linie (Normal Index Moving Average) geht, wird die Linie unterhalb der schnellen Linie frei gemacht, wodurch ein Handelsstrategie-Signal entsteht, das der Kreuzung des Moving Averages ähnelt.

Strategische Vorteile

Eine EMA-Strategie mit einer Kombination aus einem Zero-Lag-Filter und einer Anpassungs-Zyklus-Optimierung hat folgende Vorteile:

  1. Die Verzögerung wird beseitigt und die Signale werden empfindlicher und zuverlässiger.
  2. Anpassungszyklusparameter für die breitere Marktumgebung
  3. Weniger Strategieparameter, leicht zu testen und zu optimieren
  4. Konfigurierbare, feste Stop-Loss-Stopp-Punkte, die Risiken leicht kontrollieren können

Strategisches Risiko

Eine EMA-Strategie zur Anpassung an die Null-Lager-Situation birgt auch Risiken, die sich in folgenden Punkten widerspiegeln:

  1. In bestimmten Marktumständen können die adaptiv optimierten Zyklusparameter fehlen.
  2. Eine falsche Einstellung der festen Stop-Loss-Marke kann zu übermäßigen Verlusten oder Verlusten führen.
  3. Unzureichende Parameter-Optimierungstests können zu schlechten Festplattenergebnissen führen

Um diese Risiken zu kontrollieren, müssen wir die Parameter-Einstellungen in verschiedenen Marktumgebungen ausreichend testen, die Stop-Loss-Stopp-Punkte entsprechend anpassen und die Umgebung in der Rückmessung so gut wie möglich simulieren.

Richtung der Strategieoptimierung

Die EMA-Strategie für die Anpassung an die Null-Lagerung bietet viel Optimierungsmöglichkeiten. Die wichtigsten Bereiche sind:

  1. Versuchen Sie, verschiedene Anpassungszyklen zu messen, z. B. Anpassungs-MA der Schwankungen
  2. Hinzufügen von zusätzlichen Filterbedingungen wie Handelsvolumen, Moving Average Pairing usw.
  3. Optimierung von Stop-Loss-Strategien wie Trailing Stops und Chandelier Exits
  4. Dynamische Anpassung der Positionsgröße in Verbindung mit Risikomanagement
  5. Mehrfache Zeitspannen bestätigen, Signalqualität verbessern

Durch diese Optimierungsmethoden wird erwartet, dass die Strategie ihre Gewinn- und Verlustraten, ihre Risikoverlagerungsindikatoren usw. weiter verbessern kann.

Zusammenfassen

Die EMA-Strategie mit der erfolgreichen Kombination von Null-Zollager-Filter und der Idee der dynamischen Zyklusoptimierung ist eine quantitative Handelsstrategie mit weniger Parametern, die einfach zu bedienen und zu optimieren ist. Sie weist reaktionssensible, anpassungsfähige Eigenschaften auf und funktioniert besser in Trendmärkten. In Kombination mit geeigneten Stop-Loss- und Positionsmanagement-Methoden können sowohl die Stabilität als auch die Profitabilität verbessert werden.

Strategiequellcode
/*backtest
start: 2024-01-19 00:00:00
end: 2024-02-18 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true)

src = input(title="Source",  defval=close)
Period = input(title="Period",  defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off")
GainLimit = input(title="Gain Limit",  defval = 10)
Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=5)
risk = input(title='Risk', defval=0.01, step=0.01)

//##############################################################################
//I-Q IFM
//#############################################################################
range = input(title="Max Period",  defval=60, minval=8, maxval=100)

PI = 3.14159265359
imult = 0.635
qmult = 0.338
inphase = 0.0
quadrature = 0.0
re = 0.0
im = 0.0
deltaIQ = 0.0
instIQ = 0.0
lenIQ = 0.0
V = 0.0

P = src - src[7]
inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
if (re!= 0.0)
    deltaIQ := atan(im/re)
for i=0 to range
    V := V + deltaIQ[i]
    if (V > 2*PI and instIQ == 0.0)
        instIQ := i
if (instIQ == 0.0)
    instIQ := nz(instIQ[1])
lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])

//##############################################################################
//COSINE IFM
//#############################################################################
s2 = 0.0
s3 = 0.0
deltaC = 0.0
instC = 0.0
lenC = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0

v1 := src - src[7]
s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
if (s2 != 0)
    v2 := sqrt(s3/s2)
if (s3 != 0)
    deltaC := 2*atan(v2)
for i = 0 to range
    v4 := v4 + deltaC[i]
    if (v4 > 2*PI and instC == 0.0)
        instC := i - 1
if (instC == 0.0)
    instC := instC[1]
lenC := 0.25*instC + 0.75*nz(lenC[1])

if (adaptive == "Cos IFM")
    Period := round(lenC)
if (adaptive == "I-Q IFM")
    Period := round(lenIQ)
if (adaptive == "Average")
    Period := round((lenC + lenIQ)/2)

//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold
strategy.initial_capital = 50000
if (time>timestamp(2016, 1, 1 , 0, 0))
    //LONG
    balance = strategy.initial_capital + strategy.netprofit
    lots = ((risk * balance)/fixedSL)*1
    strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY",  when=buy)
    strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
    //SHORT
    strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell)
    strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)