カルマンフィルタリングと平均回帰に基づく定量的取引戦略


作成日: 2023-12-29 17:23:14 最終変更日: 2023-12-29 17:23:14
コピー: 0 クリック数: 846
1
フォロー
1621
フォロワー

カルマンフィルタリングと平均回帰に基づく定量的取引戦略

概要

この戦略は,カルマン波動と平均回帰の思想を適用し,株価の短期的な異常波動を捕捉し,株の方向的な取引を実現する.戦略は,まず,株と市場指数の価格比率モデルを確立し,それからカルマン波動技術の比率を予測して波動する.比率が正常レベルから偏ったときに取引が生じる.信号 さらに,戦略は,取引量フィルタリングを組み合わせて,誤った取引を避ける.

戦略原則

この戦略の核心的な考え方は,株式自体の価格と市場指数価格の比率モデルを構築することである.この比率は,全体の市場に対する個々の株の価格レベルを反映することができる.比率が高くなると,株が過大評価されていると考えられ,売り込みシグナルを生じさせ,比率が低ければ,株が過小評価されていると考えられ,買い込みシグナルを生じさせる.

対比率シグナルを平滑にするために,カルマン波アルゴリズムが採用されている.カルマン波は,比率の実際の観測値と予測値を重み付け,比率の予測をリアルタイムで更新する.そして,平滑なカルマン波値を計算する.波値が正常レベルより2標準差以上,または正常レベルより2標準差以下であるとき,取引信号を生成する.

さらに,戦略は取引量要因も考慮する.取引量が大きい場合にのみ真の取引シグナルが生成され,誤った取引の発生を防ぐことができる.

戦略的優位分析

この戦略の最大の利点は,カルマン波アルゴリズムを使用して価格比率を効率的に平滑化および予測することである.カールマン波は,単純な平均回帰モデルと比較して,価格の動的変化を,特に価格が激しく変動するときに,よりよく反映することができる.これは,戦略が価格の異常を早期に発見し,正確な取引信号を生成することを可能にする.

第二に,取引量の組み合わせは,戦略の実用性を高めます.合理的な取引量フィルタリングは,いくつかの誤った信号を回避し,不要な取引コストを削減するのに役立ちます.

全体として,この戦略はカルマン波動,平均回帰,取引量分析などの複数の技術を組み合わせて,比較的強力な量的な取引戦略を形成しています.

戦略的リスク分析

この戦略は理論上,技術上は完璧ですが,実際に行う際には,いくつかの潜在的リスクが懸念されます.

まず,モデルリスクである.カルマン波モデルにおけるプロセスノイズ差,観測ノイズ差などのいくつかの重要なパラメータは,歴史的データに基づいて推定する必要がある.推定が不正確であるか,市場環境が大きく変化した場合,モデルの予測の偏差を引き起こす.

次に,滑り込みコストのリスクである.頻繁な取引により滑り込みコストが増加し,戦略上の利益が損なわれる.パラメータ最適化と取引量フィルタリングにより,不必要な取引が一定程度に削減される.

最後に,市場指数に基準として従うには一定の市場体系的リスクがある.全体的に市場が激しく波動すると,個々の株と市場の価格比率にも異常が生じます.このとき,戦略は誤ったシグナルを生じます.我々は,より安定した指数を基準として選択することを検討することができます.

戦略最適化の方向性

この戦略は,さらに最適化できる余地があります.

  1. より複雑なディープ・ラーニング・モデルの使用により,価格比率をマッチングし予測する.これはモデルの正確性と強度を改善する.

  2. 取引量フィルタリングのルールを最適化し,よりダイナミックで知的な取引量値設定を実現します.これは誤取引の確率を減らすことができます.

  3. 異なる市場指数を戦略的基準としてテストし,波動が少ない,より安定した指数を選択してください.これは,市場におけるシステミックリスクの影響を減らすことができます.

  4. 株の基本面分析と組み合わせて,基本面が著しく悪化している個別の株の取引を避ける.これはより質の高い取引標識を選択することができます.

  5. 高周波のintradayデータを使用して,戦略のフィードバックと最適化を行うことで,戦略の現場でパフォーマンスを向上させることができます.

要約する

この戦略は,カルマン波モデルを使用して,株価の短期的な異常波動を捕捉することに成功している.同時に,取引量シグナルの導入も,戦略の実用性を強化している.一定のモデルリスクと市場リスクが依然として存在しているものの,これは非常に有望な量的な取引戦略である.モデルと取引シグナルの最適化に関して,将来に大きな改善の余地と応用の可能性がある.

ストラテジーソースコード
/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © xXM3GAXx

//@version=5
strategy("My strategy", overlay=true)

//SPY or QQQ
context = request.security("BTC_USDT:swap", timeframe.period, input(close))
//our stock
particular = input(close)

//ratio
src = ta.roc(particular, 1) / math.abs(ta.roc(context, 1))

//kalman calculation
Sharpness = input.float(1.0)
K = input.float(1.0)


greencolor =  color.lime
redcolor =  color.red

velocity = 0.0
kfilt = 0.0

Distance = src - nz(kfilt[1], src)
Error = nz(kfilt[1], src) + Distance * math.sqrt(Sharpness*K/ 100)
velocity := nz(velocity[1], 0) + Distance*K / 100
kfilt := Error + velocity

//2 std devs up and down
upper = kfilt[1] + 2 * ta.stdev(kfilt, input(20))
lower = kfilt[1] - 2 * ta.stdev(kfilt, input(20))

//plotting for visuals
plot(kfilt, color=velocity > 0 ? greencolor : redcolor, linewidth = 2)
plot(upper)
plot(lower)
//plot(ta.ema(ta.roc(particular, 1)/ta.roc(context, 1), 5), color = #00ffff, linewidth=2)

//volume data
vol = volume
volema = ta.ema(volume, 10)

//buy when ratio too low
longCondition = kfilt<=lower and vol>=volema
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

//sell when ratio too high
shortCondition = kfilt>=upper and vol>=volema
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)