アダプティブゼロレイグ指数関数移動平均量的な取引戦略 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) は,ジョン・エーラーズのゼロレイグ指数移動平均 (ZLEMA) の考えに基づいて開発された量的な取引戦略である.この戦略は指数関数移動平均をベースライン指標として使用し,指数関数移動平均の周期パラメータを動的に最適化するために即時周波数測定 (IFM) の適応方法を含んでいる.
この戦略の核心理念は,ジョン・エーラーズのゼロレイグフィルター理論から生まれている.指数移動平均は広く知られている技術指標であるが,本質的に遅れの問題がある.エーラーズは,指数移動平均の計算式にエラー修正因子を導入し,遅れ現象を効果的に排除し,ゼロレイグEMAを価格変化を追跡する際により敏感にする.
アダプティブゼロレイグEMA戦略では,ZLEMAの期間パラメータを適応的に最適化するために瞬時周波数測定方法を活用しています.IFMは2つのテクニックから構成されています.コシヌ法とインフェーズ四角法で,価格振動の支配的なサイクルを測定できます.これらの2つの測定によって計算された最適な期間をリアルタイムで追跡することにより,現在の市場状況により適するようにZLEMAの期間パラメータを動的に設定します.
低速EMA (ZLEMA) が低速EMAを下から横切ると,ロング信号が生成される.低速EMAが低速EMAを下から横切ると,ショート信号がトリガーされる.これは移動平均クロスオーバーシステムに似た取引戦略を形成する.
適応型ゼロレイグ EMA戦略は,ゼロレイグフィルターと適応期間の最適化を組み合わせ,以下の利点があります.
この戦略にはいくつかのリスクもあります:
これらのリスクを制御するために 異なる市場条件でパラメータを完全にテストし SL/TPを適切に調整し バックテストでリアルタイム取引環境をシミュレートする必要があります
この戦略をさらに最適化するには まだ十分な余地があります.
これらの最適化手段によって 戦略の勝利率,収益性,リスク調整メトリックをさらに改善する可能性があります
アダプティブゼロレイグEMA戦略は,ゼロレイグフィルターとダイナミック期間の最適化を成功裏に組み合わせています.パラメータが少なく,操作が簡単で,特にトレンド市場に適しています.適切なストップ損失,ポジションサイジング,その他のリスク管理技術とともに,その安定性と収益性がさらに向上できます.さらに優れたパフォーマンスのためにこの戦略を最適化するための十分な可能性が残っています.
/*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)