カルマンフィルターに基づくトレンド追跡戦略

作者: リン・ハーンチャオチャン開催日:2024年1月25日 14:12:26
タグ:

img

概要

戦略原則

この戦略の基本論理は主に次のステップを含みます.

  1. 1分間の価格の単純な移動平均 (SMA) を元の移動平均として計算する.

  2. Kalmanは元の移動平均値をフィルターでスムーズな移動平均値を出す.

  3. 滑らかな移動平均の触角を計算する.

  4. パラメータ周期を定義し,周期内の触角を統計的に和します.

  5. 期間内の触角の合計が360度以上である場合,購入信号を生成し,-360度未満の場合,販売信号を生成する.

このデザインでは,価格が上昇または下落傾向を示すとき,移動平均の触角は徐々に蓄積されます.一定の程度に蓄積すると,取引信号が生成されます.したがって,中期および長期的傾向を効果的に追跡できます.

カルマンフィルターは,現在の状態を予測する際にプロセスノイズと測定ノイズの値を予測し,これらのノイズ値を利用して現在の状態の予測を修正し,より正確で信頼できる状態推定を得ることができる再帰アルゴリズムです.

この戦略では,価格のSMAは状態の測定とみなすことができる.市場騒音の影響を受け,カルマンフィルターは価格の真の傾向を再帰的に推定し,騒音の影響を大幅に軽減し,後の移動平均計算をより信頼性のあるものにして,より安定的かつ正確な取引信号を生成する.

利点分析

単純な移動平均値および他の技術指標戦略と比較して,この戦略の最大の利点は,騒音の影響を減らすためにカルマンフィルターを使用し,取引信号をより明確かつ信頼性のあるものにすることです. 具体的な利点は主に以下の側面に反映されています:

  1. 偽信号を減らす.カルマンフィルタリングは,雑音を適応的に推定し排除することで,ランダムな変動によって引き起こされる多くの偽信号を効果的にフィルタリングし,生成された取引信号をより信頼性있게します.

  2. より良い追跡効果.平滑した移動平均形はより平滑で,中長期の価格傾向をよりよく反映し,よりよい傾向追跡効果を達成します.

  3. 制御可能なリスク:この戦略は短期変動よりも中長期的傾向に焦点を当てて,良いリスク・リターンバランスを達成します.

  4. この戦略のコアアルゴリズムは,非常に簡潔で,実装およびテストが簡単です.また,パラメータを自動的に最適化するために機械学習アルゴリズムを導入するなど,拡張のための余地も提供しています.

リスク分析

この戦略の主なリスクには,以下も含まれます.

  1. トレンド逆転リスク.この戦略はトレンド追跡に焦点を当てています.急激なトレンド逆転の場合,それは大きな損失につながるでしょう.これは,取引損失を減らすために統計サイクルを適切に短縮することで軽減できます.

  2. パラメータ最適化リスク.不適切なパラメータ設定は,頻繁な取引または信号遅延につながる可能性があります.十分なテストと最適化が必要です.自動最適化のために機械学習アルゴリズムと組み合わせることができます.

  3. 複雑性のリスクが高まる.カルマンフィルターと触角アルゴリズムを導入することでコードの複雑性が高まる.正しい実装を確保する必要がある.

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

上記のリスクを考えると,この戦略の最適化方向は以下の通りである.

  1. ストップ損失とポジションサイジングを導入する.適切なストップ損失は,単一の取引損失のリスクを効果的に制御することができる.ダイナミックポジションサイジングは,市場の状況に応じてリスクをカバーするためにポジションを調整することもできます.

  2. 自動パラメータ最適化.機械学習最適化アルゴリズムは,過剰な最適化リスクを避けるために自動パラメータ最適化を達成することができます.

  3. 他の指標を統合する.いくつかの他の指標は戦略の安定性を高めるために指標の組み合わせを形成するために戦略に統合することができます.

  4. 効率評価を高める.より包括的で正確な結論のために,戦略の効率性と安定性を評価するために,よりリスク調整されたメトリックを導入する.

  5. より多くの製品に拡大する.効果がある場合,より多くの製品に拡大することを検討することができる.中期および長期的には,より豊富なサンプルを蓄積し,クロス製品パラメータ最適化を容易にする.

結論


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@library=math
strategy("策略360°(测试)", overlay=true)

// 定义1分钟均线
ma1 = request.security(syminfo.tickerid, "1", ta.sma(close, 1)) // 在这里使用了 math.sma() 函数
//plot(ma1, color=color.yellow, title="原始均线")

// 定义卡尔曼滤波函数,参考了[1](https://www.tradingview.com/pine-script-docs/en/v5/language/Methods.html)和[2](https://www.tradingview.com/pine-script-docs/en/v5/language/Operators.html)的代码
kalman(x, g) => 
    kf = 0.0 
    dk = x - nz(kf[1], x) // 在这里使用了 nz() 函数
    smooth = nz(kf[1], x) + dk * math.sqrt(g * 2) // 在这里使用了 math.sqrt() 函数
    velo = 0.0 
    velo := nz(velo[1], 0) + g * dk // 在这里使用了 nz() 函数
    kf := smooth + velo 
    kf 

// 定义卡尔曼滤波后的均线
ma2 = kalman(ma1, 0.01) 
plot(ma2, color=color.blue, title="卡尔曼滤波后的均线")

// 定义切线角
angle = math.todegrees(math.atan(ma2 - ma2[1])) // 在这里使用了 math.degrees() 和 math.atan() 函数

// 定义累加的切线角
cum_angle = 0.0
cum_angle := nz(cum_angle[1], 0) + angle // 在这里使用了 nz() 函数

// 定义30分钟周期
period = 30 // 您可以根据您的需要修改这个参数

// 定义周期内的切线角总和
sum_angle = 0.0
sum_angle := math.sum(angle, period) // 在这里使用了 math.sum() 函数,把周期内的切线角总和改成简单地把 5 个切线角相加

// 定义买入和卖出条件
buy = sum_angle > 360// 在这里使用了 math.radians() 函数
sell = sum_angle < -360

// 执行买入和卖出操作
strategy.entry("Long", strategy.long, when=buy)
strategy.close("Short", when=buy)
strategy.entry("Short", strategy.short, when=sell)
strategy.close("Long", when=sell)

// 绘制曲线图
plot(sum_angle, color=color.green, title="周期内的切线角总和")
plot(angle, color=color.red, title="切线角") // 这是我为您添加的代码,用于显示实时计算的切线角


もっと