Chiến lược giao dịch định lượng trung bình động hàm mũ không độ trễ thích ứng


Ngày tạo: 2024-02-19 15:38:02 sửa đổi lần cuối: 2024-02-19 15:38:02
sao chép: 0 Số nhấp chuột: 841
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng trung bình động hàm mũ không độ trễ thích ứng

Tổng quan

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ư tưởng ZERO LAG EXPONENTIAL MOVING AVERAGE của Ehlers. Chiến lược này sử dụng chỉ số trung bình di chuyển như một chỉ số cơ bản và thêm vào các tham số chu kỳ của chỉ số di chuyển theo phương pháp thích ứng của đo tần số tức thời.

Nguyên tắc chiến lược

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

Trong chiến lược EMA tự điều chỉnh, chúng tôi sử dụng phương pháp đo tần số tức thời để tự điều chỉnh các tham số chu kỳ của chỉ số di chuyển trung bình với độ trễ bằng không. Đo tần số tức thời được phân thành hai phương pháp chốt và giao tiếp chính, có thể đo chu kỳ thống trị của sự thay đổi chuỗi giá. Chúng tôi theo dõi các chu kỳ tốt nhất được tính toán bởi hai phương pháp đo lường này trong thời gian thực, động thiết lập các tham số chu kỳ của chỉ số di chuyển trung bình với độ trễ bằng không, để phù hợp hơn với môi trường thị trường hiện tại.

Khi đường nhanh (trên đường trung bình di chuyển của chỉ số 0) đi qua đường chậm (trên đường trung bình di chuyển của chỉ số thông thường), làm nhiều khi đi qua, làm rỗng khi đi xuống, do đó tạo ra một tín hiệu chiến lược giao dịch tương tự như đường trung bình di chuyển.

Lợi thế chiến lược

Chiến lược EMA tự điều chỉnh với độ trễ không kết hợp bộ lọc không trễ và phương pháp tối ưu hóa chu kỳ tự điều chỉnh với các ưu điểm sau:

  1. Loại bỏ sự chậm trễ, làm cho tín hiệu nhạy cảm và đáng tin cậy hơn
  2. Các tham số tự điều chỉnh chu kỳ, thích nghi với môi trường thị trường rộng lớn hơn
  3. ít tham số chiến lược, dễ kiểm tra và tối ưu hóa
  4. Có thể cấu hình điểm dừng lỗ cố định, rủi ro dễ kiểm soát

Rủi ro chiến lược

Các chiến lược EMA tự điều chỉnh với độ trễ bằng không cũng có một số rủi ro, đặc biệt là:

  1. Các tham số chu kỳ tự điều chỉnh có thể không hiệu quả trong một số trường hợp thị trường nhất định
  2. Cài đặt không đúng điểm dừng cố định có thể dẫn đến tổn thất hoặc mất lợi nhuận quá mức
  3. Thử nghiệm tối ưu hóa tham số kém có thể dẫn đến hiệu suất đĩa cứng 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 thiết lập tham số trong các môi trường thị trường khác nhau, điều chỉnh điểm dừng lỗ thích hợp và xác minh đầy đủ các môi trường thực tế mô phỏng trong phản hồi.

Hướng tối ưu hóa chiến lược

Chiến lược EMA tự điều chỉnh với độ chậm trễ bằng không có nhiều khả năng tối ưu hóa, bao gồm:

  1. Thử các phương pháp đo chu kỳ tự điều chỉnh khác nhau, chẳng hạn như tỷ lệ dao động tự điều chỉnh MA
  2. Thêm các điều kiện lọc bổ sung, chẳng hạn như khối lượng giao dịch, cặp moving average
  3. Tối ưu hóa các chiến lược dừng lỗ như trailing stop, Chandelier Exit
  4. Định lượng vị trí động, phối hợp với quản lý rủi ro
  5. Xác nhận nhiều chu kỳ thời gian, cải thiện chất lượng tín hiệu

Những phương pháp tối ưu hóa này có thể giúp cải thiện hơn nữa tỷ lệ chiến thắng, tỷ lệ lợi nhuận, chỉ số điều chỉnh rủi ro của chiến lược.

Tóm tắt

Chiến lược EMA tự thích ứng với độ trễ không kết hợp thành công với bộ lọc trễ không và ý tưởng tối ưu hóa chu kỳ động, là một chiến lược giao dịch định lượng ít tham số, dễ vận hành và tối ưu hóa. Nó có tính năng nhạy cảm, tự thích ứng, hoạt động tốt trong thị trường xu hướng.

Mã nguồn chiến lược
/*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)