Adaptive Nullverzögerung Exponentielle gleitende durchschnittliche quantitative Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-19 15:38:02
Tags:

img

Übersicht

Die Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy ist eine quantitative Handelsstrategie, die auf der Grundlage der Idee von John Ehlers von Zero Lag Exponential Moving Average (ZLEMA) entwickelt wurde.

Strategie Logik

Die Kernidee dieser Strategie stammt aus der Theorie von John Ehlers über Nullverzögerungsfilter. Obwohl der exponentielle gleitende Durchschnitt ein weithin bekannter technischer Indikator ist, hat er inhärent das Problem der Verzögerung. Ehlers führt einen Fehlerkorrekturfaktor in die Berechnungsformel des exponentiellen gleitenden Durchschnitts ein, um das Verzögerungsphänomen effektiv zu beseitigen, wodurch die Nullverzögerung EMA empfindlicher bei der Verfolgung von Preisänderungen wird.

In der Adaptive Zero Lag EMA-Strategie nutzen wir die sofortigen Frequenzmessmethoden, um den Periodenparameter des ZLEMA anpassungsfähig zu optimieren. Der IFM besteht aus zwei Techniken - der Kosin-Methode und der Inphase-Quadratur-Methode, die den dominierenden Zyklus der Preisschwankung messen kann. Durch die Echtzeitverfolgung der durch diese beiden Messungen berechneten optimalen Perioden setzen wir den Periodenparameter des ZLEMA dynamisch so ein, dass er besser zu den aktuellen Marktbedingungen passt.

Wenn die schnelle EMA (ZLEMA) die langsame EMA von unten überschreitet, wird ein langes Signal erzeugt. Wenn die schnelle EMA unter die langsame EMA überschreitet, wird ein kurzes Signal ausgelöst. Dies bildet eine Handelsstrategie, die dem gleitenden Durchschnitts-Crossover-System ähnelt.

Vorteile

Die Adaptive Zero Lag EMA-Strategie kombiniert den Null-Lag-Filter und die Adaptive Period-Optimierung mit folgenden Vorteilen:

  1. Verringert die Verzögerung und macht die Signale empfindlicher
  2. Anpassungszeitraumparameter für eine breite Palette von Märkten
  3. Weniger Parameter leicht zu testen und zu optimieren
  4. Konfigurierbares festes SL/TP für eine bessere Risikokontrolle

Risiken

Diese Strategie birgt auch einige Risiken:

  1. Die adaptive optimierte Periode kann in bestimmten Marktumgebungen fehlschlagen
  2. Unzulässige feste SL/TP-Einstellungen könnten zu übergroßen Verlusten oder fehlenden Gewinnen führen
  3. Unzureichende Parameteroptimierungstests können zu schlechten Live-Leistungen führen

Um diese Risiken zu kontrollieren, müssen wir die Parameter unter verschiedenen Marktbedingungen vollständig testen, die SL/TP ordnungsgemäß anpassen und die Live-Handelsumgebung im Rahmen von Backtests simulieren.

Optimierungsrichtlinien

Es gibt noch viel Raum für eine weitere Optimierung dieser Strategie:

  1. Alternative Methoden zur Messung der anpassungsfähigen Periode, z. B. volatilitätsbereinigte MA
  2. Zusätzliche Filterbedingungen wie Volumen, MA-Paarungen usw.
  3. Erweiterte SL/TP-Techniken, z. B. Trailing Stops oder Chandelier Exit
  4. Dynamische Positionsgröße in Verbindung mit dem Risikomanagement
  5. Mehrfache Zeitrahmenbestätigung zur Verbesserung der Signalqualität

Durch diese Optimierungsmittel besteht das Potenzial, die Gewinnrate, die Rentabilität und die risikobereinigten Kennzahlen der Strategie weiter zu verbessern.

Schlussfolgerung

Die Adaptive Zero Lag EMA-Strategie kombiniert erfolgreich den Null-Lag-Filter und die dynamische Periodenoptimierung. Mit weniger Parametern und einfach zu bedienen, ist sie besonders für Trendmärkte geeignet. Zusammen mit einem ordnungsgemäßen Stop-Loss, Positionsgrößen und anderen Risikomanagementtechniken können ihre Stabilität und Rentabilität weiter verbessert werden. Es besteht weiterhin ein großes Potenzial, diese Strategie für eine noch bessere Performance zu optimieren.


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


Mehr