Hull移動平均とカルマンフィルターに基づくトレンド追跡戦略

作者: リン・ハーンチャオチャン, 日付: 2023年11月1日 17時10分49秒
タグ:

img

概要

この戦略は,トレンドトラッキング戦略に属する価格動向を特定し,追跡するために,ハル移動平均値とカルマンフィルターを組み合わせます.これは,異なる期間の2つのハル移動平均値を使用して,取引信号を生成し,信号の質と戦略の安定性を向上させることを目的として,シグナルをスムーズにするためにカルマンフィルターを採用します.

戦略の論理

  • この戦略は,取引シグナルを構築するために 24 期間のハル移動平均値 (hma) と 24 期間のトリプルハル移動平均値 (hma3) を使用します.

  • HMAが HMA3を突破すると,買い信号が生成され,HMAが HMA3を下回ると,売り信号が生成されます.

  • カルマンフィルタはデフォルトで無効です.有効になった場合,過剰なノイズをフィルタリングし,信号品質を改善するために hma と hma3 を滑らかにします.

  • カルマンフィルターは,予測および修正ステップを通じて信号からランダムなノイズを排除する.各測定と最後の予測の差は,次の測定をより正確に予測するための修正項目として扱われる.予測と修正を繰り返することによって,ノイズの影響を徐々に減少させ,信号を滑らかにすることができる.

  • この戦略は,ランダムな変動をフィルタリングし,持続的なトレンドを追跡することによって移動平均戦略の安定性を高めるため,カルマンフィルターを活用します.

利点

  • 二重移動平均システムでは,単一の移動平均と比較して持続的な傾向をよりよく識別できます.

  • Hull Moving Averageは,重度の計算によって最近の価格により重みを付け,価格変動をより敏感に記録します.

  • カルマンフィルターは信号からランダムなノイズを効果的にフィルタリングし,偽信号を減少させ,信号品質を改善します.

  • 調整可能なパラメータは,期間とカルマンフィルターガインのようなもので,戦略は異なる市場状況に適応できます.

  • クロス・ペリオド技術を採用することで,過剰なランダム変動によって誤導されるのを避けるため,より持続的な信号を生成できます.

  • 視覚インターフェースは操作を簡単にするため,シグナルとトレンドの状態を直感的に表示します.

リスク

  • 二重移動平均は,トレンドターニングポイントの周りに間違った信号を生成し,タイミングで逆転を捉えることができない.

  • 移動平均値の遅れは 急速な価格逆転の機会を逃す可能性があります

  • 激しい変動の市場には適さない 動乱期には使用しないように

  • カルマンのフィルターパラメータは戦略のパフォーマンスに影響を与えます. 幅が大きすぎると有効な信号がフィルタリングされます.

  • 長期間の反応は遅い一方,短い期間は騒音に脆弱である.市場状況に基づいてパラメータ調整が必要である.

  • 固定されていない長期・短期保有期間により,ポジションがない休憩時間になり,資本利用効率が低下します.

強化

  • 動向性に基づいてパラメータを動的に最適化する 適応動向平均を試してください

  • 波動性の指標を組み込むことで,不安定な市場での取引を避け,明らかなトレンドのみで取引する.

  • ストップロスを設定して 損失を制限し リスク管理を改善します

  • カルマンフィルターパラメータを最適化して追跡感度とノイズフィルタリングレベルをバランスさせる.

  • 信号の有効性を 音量やボリンジャー帯などの指標で確認します

  • 機械学習を利用してパラメータを訓練し 戦略の強さと適応性を向上させる

結論

この戦略は,持続的なトレンドを効果的に特定し,ダブルハルMAとカルマンフィルターによって信号品質を改善する. 安定した利益のためのパラメータ最適化,市場の適応性,リスク管理を注意する. 機械学習と定量分析を通じてさらなる改善を達成することができる. 継続的な改善は,堅牢で効率的なトレンド追跡システムを形作る.


/*backtest
start: 2022-10-25 00:00:00
end: 2023-10-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Hull Trend with Kahlman Strategy Backtest", shorttitle="HMA-Kahlman Trend Strat", overlay=true)

src       = input(hl2,   "Price Data")
length    = input(24,    "Lookback")
showcross = input(true,  "Show cross over/under")
gain      = input(10000, "Gain")
k         = input(true,  "Use Kahlman")

hma(_src, _length) =>
    wma((2 * wma(_src, _length / 2)) - wma(_src, _length), round(sqrt(_length)))
    
hma3(_src, _length) =>
    p = length/2
    wma(wma(close,p/3)*3 - wma(close,p/2) - wma(close,p),p)

kahlman(x, g) =>
    kf = 0.0
    dk = x - nz(kf[1], x)
    smooth = nz(kf[1],x)+dk*sqrt((g/10000)*2)
    velo = 0.0
    velo := nz(velo[1],0) + ((g/10000)*dk)
    kf := smooth+velo
  
a = k ? kahlman(hma(src, length), gain) : hma(src, length)
b = k ? kahlman(hma3(src, length), gain) : hma3(src, length)
c = b > a ? color.lime : color.red
crossdn = a > b and a[1] < b[1]
crossup = b > a and b[1] < a[1]

p1 = plot(a,color=c,linewidth=1,transp=75)
p2 = plot(b,color=c,linewidth=1,transp=75)
fill(p1,p2,color=c,transp=55)
plotshape(showcross and crossdn ? a : na, location=location.absolute, style=shape.labeldown, color=color.red, size=size.tiny, text="S", textcolor=color.white, transp=0, offset=-1)
plotshape(showcross and crossup ? a : na, location=location.absolute, style=shape.labelup, color=color.green, size=size.tiny, text="B", textcolor=color.white, transp=0, offset=-1)

longCondition = crossup
if (longCondition)
    strategy.entry("LE", strategy.long)

shortCondition = crossdn
if (shortCondition)
    strategy.entry("SE", strategy.short)
    


もっと