アダプティブゼロレイグ 指数関数移動平均量的な取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-19 15:38:02
タグ:

img

概要

アダプティブゼロレイグ指数関数移動平均量的な取引戦略 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) は,ジョン・エーラーズのゼロレイグ指数移動平均 (ZLEMA) の考えに基づいて開発された量的な取引戦略である.この戦略は指数関数移動平均をベースライン指標として使用し,指数関数移動平均の周期パラメータを動的に最適化するために即時周波数測定 (IFM) の適応方法を含んでいる.

戦略の論理

この戦略の核心理念は,ジョン・エーラーズのゼロレイグフィルター理論から生まれている.指数移動平均は広く知られている技術指標であるが,本質的に遅れの問題がある.エーラーズは,指数移動平均の計算式にエラー修正因子を導入し,遅れ現象を効果的に排除し,ゼロレイグEMAを価格変化を追跡する際により敏感にする.

アダプティブゼロレイグEMA戦略では,ZLEMAの期間パラメータを適応的に最適化するために瞬時周波数測定方法を活用しています.IFMは2つのテクニックから構成されています.コシヌ法とインフェーズ四角法で,価格振動の支配的なサイクルを測定できます.これらの2つの測定によって計算された最適な期間をリアルタイムで追跡することにより,現在の市場状況により適するようにZLEMAの期間パラメータを動的に設定します.

低速EMA (ZLEMA) が低速EMAを下から横切ると,ロング信号が生成される.低速EMAが低速EMAを下から横切ると,ショート信号がトリガーされる.これは移動平均クロスオーバーシステムに似た取引戦略を形成する.

利点

適応型ゼロレイグ EMA戦略は,ゼロレイグフィルターと適応期間の最適化を組み合わせ,以下の利点があります.

  1. 遅延をなくし,より敏感な信号を作ります
  2. 幅広い市場における適応期間のパラメータ
  3. テストと最適化に簡単なパラメータが少ない
  4. 設定可能な固定 SL/TP より良いリスク管理のために

リスク

この戦略にはいくつかのリスクもあります:

  1. 適性最適化期間は,特定の市場環境で失敗する可能性があります.
  2. 不適切な固定SL/TP設定は,過大損失または損失につながる可能性があります.
  3. パラメータ最適化テストが不十分である場合,ライブパフォーマンスが低下する可能性があります.

これらのリスクを制御するために 異なる市場条件でパラメータを完全にテストし SL/TPを適切に調整し バックテストでリアルタイム取引環境をシミュレートする必要があります

オプティマイゼーションの方向性

この戦略をさらに最適化するには まだ十分な余地があります.

  1. 代替的な適応期間の測定方法,例えば波動性調整MA
  2. ボリューム,MAペアリングなどの追加のフィルター条件
  3. 強化されたSL/TP技術,例えば後退停止またはチェンデリア出口
  4. リスク管理と結合した動的ポジションサイズ
  5. シグナル品質を改善するための複数の時間枠の確認

これらの最適化手段によって 戦略の勝利率,収益性,リスク調整メトリックをさらに改善する可能性があります

結論

アダプティブゼロレイグ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)


もっと