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).
Ý 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.
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:
Có một số rủi ro trong chiến lược này:
Để 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ả.
Vẫn còn nhiều chỗ để tối ưu hóa thêm chiến lược này:
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.
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)