Adaptive Zero Lag Eksponensial Moving Average Strategi Dagangan Kuantitatif

Penulis:ChaoZhang, Tarikh: 2024-02-19 15:38:02
Tag:

img

Ringkasan

Strategi Dagangan Kuantitatif Purata Bergerak Eksponensial Zero Lag adalah strategi perdagangan kuantitatif yang dibangunkan berdasarkan idea John Ehlers tentang Purata Bergerak Eksponensial Zero Lag (ZLEMA). Strategi ini menggunakan purata bergerak eksponensial sebagai penunjuk asas dan menggabungkan kaedah pengukuran frekuensi segera (IFM) adaptif untuk mengoptimumkan parameter tempoh purata bergerak eksponensial secara dinamik.

Logika Strategi

Idea teras strategi ini berasal dari teori John Ehlers tentang penapis lag sifar. Walaupun purata bergerak eksponensial adalah penunjuk teknikal yang diketahui secara meluas, ia secara semula jadi mempunyai masalah kelewatan. Ehlers memperkenalkan faktor pembetulan ralat dalam formula pengiraan purata bergerak eksponensial untuk menghilangkan fenomena kelewatan secara berkesan, menjadikan EMA Zero Lag lebih sensitif dalam mengesan perubahan harga.

Dalam strategi Adaptive Zero Lag EMA, kami menggunakan kaedah pengukuran frekuensi serta-merta untuk mengoptimumkan parameter tempoh ZLEMA secara adaptif. IFM terdiri daripada dua teknik - kaedah Cosine dan kaedah Inphase-Quadrature, yang dapat mengukur kitaran dominasi osilasi harga. Dengan mengesan masa nyata tempoh optimum yang dikira oleh kedua-dua pengukuran ini, kami secara dinamik menetapkan parameter tempoh ZLEMA untuk lebih sesuai dengan keadaan pasaran semasa.

Apabila EMA pantas (ZLEMA) melintasi EMA perlahan dari bawah, isyarat panjang dihasilkan. Apabila EMA pantas melintasi di bawah EMA perlahan, isyarat pendek dicetuskan. Ini membentuk strategi perdagangan yang serupa dengan sistem persilangan purata bergerak.

Kelebihan

Strategi EMA Zero Lag Adaptif menggabungkan penapis zero lag dan pengoptimuman tempoh adaptif, dengan kelebihan berikut:

  1. Menghapuskan kelewatan dan membuat isyarat yang lebih sensitif
  2. Parameter tempoh penyesuaian untuk pelbagai pasaran
  3. Lebih sedikit parameter mudah untuk ujian dan pengoptimuman
  4. SL/TP tetap yang boleh dikonfigurasikan untuk kawalan risiko yang lebih baik

Risiko

Terdapat juga beberapa risiko dalam strategi ini:

  1. Tempoh optimum penyesuaian mungkin gagal dalam persekitaran pasaran tertentu
  2. Tetapan SL/TP tetap yang tidak betul boleh membawa kepada kerugian yang terlalu besar atau kehilangan keuntungan
  3. Ujian pengoptimuman parameter yang tidak mencukupi boleh membawa kepada prestasi hidup yang buruk

Untuk mengawal risiko ini, kita perlu menguji sepenuhnya parameter dalam keadaan pasaran yang berbeza, menyesuaikan SL / TP dengan betul, dan mensimulasikan persekitaran perdagangan langsung dalam backtests.

Arahan pengoptimuman

Masih banyak ruang untuk mengoptimumkan lagi strategi ini:

  1. Kaedah pengukuran tempoh penyesuaian alternatif, contohnya MA yang diselaraskan volatiliti
  2. Keadaan penapis tambahan seperti jumlah, pasangan MA dan lain-lain.
  3. Teknik SL / TP yang dipertingkatkan, contohnya hentian penghantaran atau Keluar Chandelier
  4. Pengukuran kedudukan dinamik ditambah dengan pengurusan risiko
  5. Pengesahan jangka masa berbilang untuk meningkatkan kualiti isyarat

Melalui cara pengoptimuman ini, terdapat potensi untuk meningkatkan lagi kadar kemenangan, keuntungan, metrik yang disesuaikan dengan risiko strategi.

Kesimpulan

Adaptive Zero Lag EMA strategi berjaya menggabungkan penapis zero lag dan pengoptimuman tempoh dinamik. Dengan lebih sedikit parameter dan mudah dikendalikan, ia sangat sesuai untuk pasaran trend. Bersama-sama dengan kerugian berhenti yang betul, saiz kedudukan dan teknik pengurusan risiko lain, kestabilan dan keuntungan dapat ditingkatkan lagi. Masih ada potensi yang luas untuk mengoptimumkan strategi ini untuk prestasi yang lebih baik.


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


Lebih lanjut