適応ゼロラグ指数移動平均定量取引戦略


作成日: 2024-02-19 15:38:02 最終変更日: 2024-02-19 15:38:02
コピー: 0 クリック数: 841
1
フォロー
1617
フォロワー

適応ゼロラグ指数移動平均定量取引戦略

概要

適応ゼロラグ指数移動平均量化取引戦略 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) は,Ehlersのゼロラグ指数移動平均思想に基づいて開発された量化取引戦略である.この戦略は,指数移動平均をベース指標として使用し,インスタント周波数測定 (Instantaneous Frequency Measurement) の適応方法にインスタント周波数測定 (Instantaneous Frequency Measurement) を加え,指数移動平均の周期パラメータを動的に最適化する.

戦略原則

この戦略の核心思想は,ジョン・エラーズのゼロ・ラグランス・フィルター理論に由来する.指数移動平均は,広く知られた技術指標であるにもかかわらず,その本質的にはラグランスの問題がある.エラーズは,指数移動平均の計算式に誤差補正因子を加えることで,ラグランスを効果的に排除することができ,ゼロ・ラグランス・移動平均は,価格変化をより敏感に追跡することができる.

自動自律型ゼロ・ラグ・エマ戦略では,即時周波数測定法を利用して,自動自律型ゼロ・ラグ・インデックスの移動平均の周期パラメータを最適化します.即時周波数測定は,余弦法と正交法とに分かれ,価格序列の変化の主導周期を測定できます.我々は,この2つの測定法によって計算された最適な周期をリアルタイムで追跡し,ダイナミックにゼロ・ラグ・インデックスの移動平均の周期パラメータを設定し,現在の市場環境に適合させます.

快線 ((ゼロ・ラグダント・インデックス・ムービング・アヴェア) 上をクロスするスローライン ((普通・インデックス・ムービング・アヴェア) 上をクロスする時に多めに,下をクロスする時に空いて,このようにして,移動平均の交差に似た取引戦略信号が形成される。

戦略的優位性

自動適応ゼロラグ後EMA戦略は,ゼロラグ後フィルターと自己適応サイクル最適化の方法を組み合わせ,以下の利点がある.

  1. 遅延をなくし,信号をより敏感で信頼性のあるものにします.
  2. 適応サイクルパラメータ,より広範な市場環境への適応
  3. 戦略のパラメータが少なく,テストと最適化が容易である
  4. 設定可能な固定ストップ・ストップポイント,リスクが簡単に制御される

戦略リスク

ゼロ・ラグのEMA戦略にもリスクがあります.

  1. 特定の市場環境では,自主的に最適化された周期パラメータは有効でない可能性があります.
  2. 固定ストップポイントの不適切な設定は,過度の損失または損失を引き起こす可能性があります.
  3. パラメータ最適化テストが不十分で,CDの性能が悪くなる

これらのリスクを制御するには,異なる市場環境下でのパラメータ設定を十分にテストし,ストップ・ストップポイントを適切に調整し,フィットネスで実体環境を模擬する限り十分に検証する必要があります.

戦略最適化の方向性

ゼロ・ラグに適応するEMA戦略には,以下のような主要な方向性により,広範な最適化余地があります.

  1. 波動率自律MAなどの異なる自律周期測定法を試す
  2. 取引量,移動平均ペアなどの追加フィルター条件を追加
  3. トレーリングストップ,チャンデリア出口などのストップストップ戦略を最適化
  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)