Adaptive Zero Lag Eksponensial Moving Average Strategi Perdagangan Kuantitatif

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

img

Gambaran umum

Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy adalah strategi perdagangan kuantitatif yang dikembangkan berdasarkan gagasan John Ehlers tentang Zero Lag Exponential Moving Average (ZLEMA). Strategi ini menggunakan rata-rata bergerak eksponensial sebagai indikator dasar dan menggabungkan metode adaptif Pengukuran Frekuensi Instan (IFM) untuk secara dinamis mengoptimalkan parameter periode rata-rata bergerak eksponensial.

Logika Strategi

Ide inti dari strategi ini berasal dari teori John Ehlers tentang filter lag nol. Meskipun rata-rata bergerak eksponensial adalah indikator teknis yang dikenal luas, secara inheren memiliki masalah lag. Ehlers memperkenalkan faktor koreksi kesalahan dalam rumus perhitungan rata-rata bergerak eksponensial untuk secara efektif menghilangkan fenomena lag, membuat EMA Zero Lag lebih sensitif dalam melacak perubahan harga.

Dalam strategi Adaptive Zero Lag EMA, kami memanfaatkan metode pengukuran frekuensi instan untuk mengoptimalkan parameter periode ZLEMA secara adaptif. IFM terdiri dari dua teknik - metode Cosine dan metode Inphase-Quadrature, yang dapat mengukur siklus dominasi osilasi harga. Dengan melacak periode optimal yang dihitung oleh dua pengukuran ini secara real-time, kami secara dinamis mengatur parameter periode ZLEMA agar lebih sesuai dengan kondisi pasar saat ini.

Ketika EMA cepat (ZLEMA) melintasi EMA lambat dari bawah, sinyal panjang dihasilkan. Ketika EMA cepat melintasi EMA lambat, sinyal pendek dipicu. Ini membentuk strategi perdagangan yang mirip dengan sistem crossover rata-rata bergerak.

Keuntungan

Strategi EMA Adaptive Zero Lag menggabungkan filter zero lag dan optimalisasi periode adaptif, dengan keuntungan berikut:

  1. Menghilangkan keterlambatan dan membuat sinyal yang lebih sensitif
  2. Parameter periode adaptatif untuk berbagai pasar
  3. Parameter yang lebih sedikit mudah untuk pengujian dan optimasi
  4. SL/TP tetap yang dapat dikonfigurasi untuk kontrol risiko yang lebih baik

Risiko

Ada juga beberapa risiko dalam strategi ini:

  1. Periode yang dioptimalkan dapat gagal dalam lingkungan pasar tertentu
  2. Pengaturan SL/TP tetap yang tidak tepat dapat menyebabkan kerugian yang terlalu besar atau kehilangan keuntungan
  3. Tes optimasi parameter yang tidak cukup dapat menyebabkan kinerja hidup yang buruk

Untuk mengendalikan risiko ini, kita perlu menguji secara lengkap parameter di berbagai kondisi pasar, menyesuaikan SL/TP dengan benar, dan mensimulasikan lingkungan perdagangan langsung dalam backtest.

Arahan Optimasi

Masih banyak ruang untuk lebih mengoptimalkan strategi ini:

  1. Metode pengukuran periode adaptatif alternatif, misalnya MA yang disesuaikan dengan volatilitas
  2. Kondisi filter tambahan seperti volume, pasangan MA, dll.
  3. Teknik SL/TP yang ditingkatkan, misalnya trailing stop atau Chandelier Exit
  4. Dimensi posisi dinamis ditambah dengan manajemen risiko
  5. Konfirmasi beberapa kerangka waktu untuk meningkatkan kualitas sinyal

Melalui cara optimasi ini, ada potensi untuk meningkatkan tingkat kemenangan, profitabilitas, metrik yang disesuaikan dengan risiko strategi.

Kesimpulan

Strategi Adaptive Zero Lag EMA berhasil menggabungkan filter zero lag dan optimasi periode dinamis. Dengan lebih sedikit parameter dan mudah dioperasikan, strategi ini sangat cocok untuk pasar tren. Bersama dengan stop loss yang tepat, ukuran posisi dan teknik manajemen risiko lainnya, stabilitas dan profitabilitasnya dapat ditingkatkan lebih lanjut. Masih ada potensi yang luas untuk mengoptimalkan strategi ini untuk kinerja 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 banyak