Chiến lược giao dịch định lượng chuyển động trung bình theo cấp số

Tác giả:ChaoZhang, Ngày: 2024-02-19 15:38:02
Tags:

img

Tổng quan

Chiến lược giao dịch định lượng trung bình chuyển động theo tỉ lệ không trễ (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) là một chiến lược giao dịch định lượng được phát triển dựa trên ý tưởng của John Ehlers về Trung bình chuyển động theo tỉ lệ không trễ (Zero Lag Exponential Moving Average - ZLEMA).

Chiến lược logic

Ý tưởng cốt lõi của chiến lược này bắt nguồn từ lý thuyết của John Ehlers về các bộ lọc không trễ. Mặc dù trung bình di chuyển theo cấp số nhân là một chỉ số kỹ thuật được biết đến rộng rãi, nhưng nó vốn có vấn đề chậm trễ. Ehlers giới thiệu một yếu tố điều chỉnh lỗi trong công thức tính toán của trung bình di chuyển theo cấp số nhân để loại bỏ hiệu quả hiện tượng chậm trễ, làm cho EMA Zero Lag nhạy cảm hơn trong việc theo dõi thay đổi giá.

Trong chiến lược EMA Zero Lag thích nghi, chúng tôi sử dụng các phương pháp đo tần số tức thời để tối ưu hóa các thông số giai đoạn của ZLEMA. IFM bao gồm hai kỹ thuật - phương pháp Cosine và phương pháp Inphase-Quadrature, có thể đo chu kỳ dao động giá trị thống trị. Bằng cách theo dõi thời gian thực các giai đoạn tối ưu được tính toán bởi hai phép đo này, chúng tôi động lập các thông số giai đoạn của ZLEMA để phù hợp hơn với điều kiện thị trường hiện tại.

Khi EMA nhanh (ZLEMA) vượt qua EMA chậm từ dưới, một tín hiệu dài được tạo ra. Khi EMA nhanh vượt qua dưới EMA chậm, một tín hiệu ngắn được kích hoạt. Điều này tạo thành một chiến lược giao dịch tương tự như hệ thống chéo trung bình động.

Ưu điểm

Chiến lược EMA Zero Lag thích nghi kết hợp bộ lọc zero lag và tối ưu hóa thời gian thích nghi, với những lợi thế sau:

  1. Loại bỏ sự chậm trễ và làm cho tín hiệu nhạy cảm hơn
  2. Các tham số thời gian thích nghi cho một loạt các thị trường
  3. Ít thông số dễ dàng để thử nghiệm và tối ưu hóa
  4. SL/TP cố định có thể cấu hình để kiểm soát rủi ro tốt hơn

Rủi ro

Có một số rủi ro trong chiến lược này:

  1. Thời gian tối ưu hóa thích nghi có thể thất bại trong một số môi trường thị trường nhất định
  2. Các thiết lập SL/TP cố định không chính xác có thể dẫn đến tổn thất quá lớn hoặc thất bại lợi nhuận
  3. Các thử nghiệm tối ưu hóa tham số không đủ có thể dẫn đến hiệu suất trực tiếp kém

Để kiểm soát những rủi ro này, chúng tôi cần kiểm tra đầy đủ các thông số trong các điều kiện thị trường khác nhau, điều chỉnh SL / TP đúng cách và mô phỏng môi trường giao dịch trực tiếp trong các thử nghiệm hậu quả.

Hướng dẫn tối ưu hóa

Vẫn còn nhiều chỗ để tối ưu hóa thêm chiến lược này:

  1. Phương pháp đo thời gian thích nghi thay thế, ví dụ như MA điều chỉnh biến động
  2. Các điều kiện lọc bổ sung như khối lượng, cặp MA v.v.
  3. Các kỹ thuật SL / TP được nâng cao, ví dụ như dừng lại hoặc thoát Chandelier
  4. Định dạng vị trí động kết hợp với quản lý rủi ro
  5. Xác nhận nhiều khung thời gian để cải thiện chất lượng tín hiệu

Thông qua các phương tiện tối ưu hóa này, có tiềm năng để cải thiện hơn nữa tỷ lệ chiến thắng, lợi nhuận, số liệu điều chỉnh rủi ro của chiến lược.

Kết luận

Chiến lược EMA Zero Lag thích nghi kết hợp thành công bộ lọc zero lag và tối ưu hóa thời gian năng động. Với ít thông số và dễ vận hành, nó đặc biệt phù hợp với thị trường xu hướng. Cùng với việc dừng lỗ đúng cách, kích thước vị trí và các kỹ thuật quản lý rủi ro khác, sự ổn định và lợi nhuận của nó có thể được tăng thêm. Vẫn còn tiềm năng rộng rãi để tối ưu hóa chiến lược này để có hiệu suất tốt hơn.


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


Thêm nữa