3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CUSUM型イベント駆動×文脈バンディットによる適応的トレーディングシステム

3
Posted at

はじめに

金融市場は、通常はランダムウォークに従いますが、一度トレンドが発生すると予測可能になるという、極めて特殊な性質を持つ時系列データです。このような市場でトレードの優位性を確立するには、トレンドの予兆をいかに早く検出するかが極めて重要となります。

本記事では、価格パスの微妙な変化点を捉えるCUSUM(Cumulative Sum)イベント駆動型のトレーディングシステムについて解説します。CUSUMは、ランダムな価格変動の中から統計的に有意な変化を検出することで、トレンド発生の予兆を早期に捉えることができます。さらに、LinUCBやThompson Samplingといった文脈バンディットアルゴリズムを活用し、複数の戦術(arms)を動的にルーティングすることで、レジームの変化に即応する適応的な取引システムを構築します。

1. CUSUMイベント定義(数理・口径調整)

目的

金融市場において、トレンドの予兆を検出することが優位性確立の鍵となります。CUSUMは、以下の理由でこの目的に適しています:

  1. 微小な変化の累積を捉える: ランダムウォーク的な価格変動の中で、統計的に有意な方向性の累積を検出
  2. ノイズとシグナルの分離: ドリフト付きCUSUMにより、単なる価格ノイズとトレンドの萌芽を区別
  3. 早期発火: レンジ内の圧縮からの微小衝撃や、大きなブレイクを伴わない転換の初期段階も捉える
  4. 適応的な感度: Vol-of-Vol(ボラティリティのボラティリティ)に応じて閾値を調整し、市場環境の変化に対応

このアプローチにより、「ランダムから予測可能へ」の転換点を、他の参加者より早く認識できる可能性が高まります。

金融市場の二面性とCUSUMの適合性

市場の特殊な性質

金融市場は以下の二つの状態を行き来します:

  1. ランダムウォーク期(約70-80%の時間)

    • 価格変動は予測困難
    • ノイズトレードが支配的
    • 情報効率性が高い状態
  2. トレンド期(約20-30%の時間)

    • 方向性のある価格変動
    • 予測可能性が高まる
    • 情報の非対称性や群集心理が作用

CUSUMが予兆検出に優れる理由

従来の固定閾値アプローチ(例: 価格が移動平均を上抜けたら買い)は、既にトレンドが顕在化した後に反応します。一方、CUSUMは:

ランダムウォーク期の微小な変化
    ↓ (累積的監視)
統計的有意性の蓄積
    ↓ (閾値到達)
トレンド予兆の発火 ← ここで早期参入
    ↓
トレンドの顕在化 ← 従来手法はここで参入

このように、累積的な変化を監視することで、ランダムウォークから逸脱し始めた初期段階を捉えることができます。

実務上の意義

  • 早期参入: トレンド初期の大きな価格変動を捉える
  • 良好なリスクリワード: エントリー時点での価格が有利
  • 心理的優位: トレンドに乗り遅れるFOMO(取り逃がしの恐怖)を回避

1.1 前処理と正規化

対数収益率

r_t = \ln P_t - \ln P_{t-1}

EWMAボラティリティ(RiskMetrics型)

\sigma_t^2 = (1-\lambda) r_t^2 + \lambda \sigma_{t-1}^2 \quad (\lambda = e^{-\Delta t / HL_\sigma})

推奨半減期(HL): 30〜60バー

正規化系列

z_t = \frac{r_t}{\sigma_t + \epsilon}

($\epsilon$ はゼロ除算回避の極小値)

1.2 二値CUSUM(ドリフト付き)

微小ノイズを除去するため、drift $\nu$ を入れた左右CUSUMを使用します。

g_t^+ = \max\{0, g_{t-1}^+ + z_t - \nu\}
g_t^- = \min\{0, g_{t-1}^- + z_t + \nu\}

発火条件

  • $g_t^+ \geq h$ で上昇イベント、$g_t^+ \leftarrow 0$ にリセット
  • $g_t^- \leq -h$ で下降イベント、$g_t^- \leftarrow 0$ にリセット

推奨口径の初期値

  • drift $\nu$: 正規化系列のロバスト尺度を利用(例: $\nu = 0.2 \cdot \text{MAD}(z)$)
  • 閾値 $h$: 目標イベント頻度から同定(後述)
  • クールダウン: イベント後 min_sep バーは新イベント無効化(例: 5〜10バー)

1.3 目標イベント頻度(ARL)からの $h$ キャリブレーション

目標例: 銘柄×足で1日あたり6〜12イベント

方法: 過去データの $z_t$ を用いモンテカルロで $h$ を探索し、ARL(平均発火間隔)が目標に一致する $h$ を選択します。

Vol-of-Vol適応

\text{vov}_t = \text{EWMA}((|z_t| - m)^2), \quad m \approx E|z|

高VOV時は誤検出増を抑えるため:

h_t = h_0 \cdot (1 + c \cdot \text{zscore}(\text{vov}_t)) \quad (c \approx 0.3)

注意: CUSUM発火時点 $t$ で利用する特徴量は $t$ 時点までの情報に限定し、先読みに注意してください。

2. 文脈特徴量(OHLCVのみ・実装仕様)

原則

全特徴はロバスト正規化(rolling median/MADのz化)を行い、winsorize(1-99%)で外れ値耐性を確保します。

2.1 ボラティリティ系

  • rv5 / rv20: $\sum r^2$ を5/20バーで集計
  • vol-of-vol: 上記 $\text{vov}_t$
  • ATR%: ATR/価格
  • TR順位: 直近N(例: 63)での百分位
  • NR7/WR7: 当日のTRが過去7本で最小/最大のフラグ

2.2 トレンド/粗さ

  • RSRS: 回帰 $H_i = \beta L_i + \epsilon$、$\beta$ を過去Wでz化(W=240等)
  • KAMA傾き/乖離: $\Delta \text{KAMA}_t$ と $(P - \text{KAMA})/\text{ATR}$
  • Choppiness Index:
100 \cdot \frac{\log_{10}(\sum \text{TR}_n) - \log_{10}(H_n - L_n)}{\log_{10}(n)}

2.3 ローソク形状

  • 上ヒゲ率: $w^+ = \frac{H - \max(O,C)}{\text{TR}}$
  • 下ヒゲ率: $w^- = \frac{\min(O,C) - L}{\text{TR}}$
  • 実体率: $|C - O|/\text{TR}$
  • 連続大陰/大陽 run長: 実体率が閾値超の連続カウント

2.4 需給近似

  • OBV変化: 差分/ATRで正規化
  • Price-Volume Rank: 直近Nでの価格×出来高の順位
  • 上昇/下落日の出来高比: 直近Mでの陽/陰出来高比

2.5 季節性(暗号資産等)

  • Time-of-day / DOW: one-hot(扱う足に応じバケット化)

次元削減

余剰相関を抑えるため、相関 > 0.9 の特徴は1つに集約するか、主成分/PLSで射影し、次元数を20〜40に保ちます。

3. 小戦術(arms) - シグナル仕様

共通仕様

  • エントリー: イベント方向に対し side ∈ {+1, -1} を返す
  • エグジット: 共通のTriple Barrier(PT/SL/Time)
  • Arm-Ø: 「取引しない」選択肢

3.1 Arm-T(トレンド追随: Donchian/KAMA)

Donchian

  • 上抜($C_t > \max H_n$)でlong、下抜でshort
  • $n = 20$ が目安

KAMA合成

S_T = \beta_1 \frac{\Delta \text{KAMA}_t}{\text{ATR}_t} + \beta_2 \frac{P_t - \text{KAMA}_t}{\text{ATR}_t}
  • $S_T > \theta_T$ でlong、$< -\theta_T$ でshort ($\theta_T \approx 0.3$)

3.2 Arm-R(逆張り: Keltner/RSI2)

Keltner Band

  • 中央 = $\text{EMA}_n$
  • バンド = $\pm m \cdot \text{ATR}$ (n=20, m=1.5〜2)

条件

  • 上バンドタッチ後の反転 かつ RSI2 > 98 → 戻り売り
  • 下側は対称

モメンタム・フィルタ

$|S_T| < \theta_T$ (強トレンドでは実行しない)

3.3 Arm-W(吸収フェード: ウィック主導)

条件例

  • $w^+ > q_{0.9}$ かつ TR順位 > 80% かつ 終値がレンジ中腹(35-65%) → short
  • 逆対称でlong
  • 任意: 直後の1-2バーで出来高低下を追加条件

3.4 Arm-B(ブレイク & プルバック)

  1. レンジ同定: NR7 かつ 振幅/ATR が閾値以下
  2. 上放れ確認: 高値更新+クローズで確定
  3. 1回目の軽い押し: ブレイク幅の38-62%戻し+出来高の過熱なし → 順張り

3.5 Arm-Ø(ノートレード)

UCB差が小さい/不確実性が高い/ガード警告中のとき選びやすくします。

4. ルーティング(LinUCB / Thompson Sampling)

入出力

  • 入力: イベントごとに文脈 $x_t \in \mathbb{R}^d$
  • 出力: 選択アーム $k_t \in {T, R, W, B, \emptyset}$

4.1 LinUCB(推奨の初期実装)

各アーム $k$ に対しリッジ回帰の統計量を保持:

A_k \leftarrow \lambda I_d + \sum w_i x_i x_i^\top, \quad b_k \leftarrow \sum w_i x_i r_i
\hat{w}_k = A_k^{-1} b_k, \quad \hat{\mu}_k(x) = \hat{w}_k^\top x, \quad u_k(x) = \alpha \sqrt{x^\top A_k^{-1} x}

選択ルール

k_t = \arg\max_k \{\hat{\mu}_k(x_t) + u_k(x_t) - c_k\}
  • $c_k$: アーム固有の実行コスト補正(スリッページ/回転率)
  • $\alpha$: 攻める係数(半減期HLで時間減衰、例: 45日)

遅延フィードバック(Triple BarrierのH期間)

pendingキューに $(k_t, x_t)$ を格納し、exit時に報酬 $r_t$ を確定して更新します。

未確定が多いほど不確実性が増すため、以下の対策を講じます:

  • $\alpha$ の下限を上げる
  • top-2 UCB差 < $\gamma$ ならArm-Øを選ぶ安全弁を追加

時間減衰ウェイト

w_i = 0.5^{\frac{\text{age}_i}{\text{HL}_{\text{fit}}}}, \quad \text{HL}_{\text{fit}} \in [30D, 90D]

4.2 Thompson Sampling(代替/上位版)

ベイズ線形回帰: $\theta_k \sim N(\mu_k, \sigma_k^2 V_k)$

各イベントで $\tilde{\theta}_k$ をサンプリングし $\arg\max_k \tilde{\theta}_k^\top x_t$ を選択します。

ノイズ分散は共通/アーム別いずれも可。非定常に強く、探索が自然です。

4.3 報酬設計(スケール安定)

基本

取引コスト控除後PnL:

r = \text{side} \cdot \frac{P_{\text{exit}} - P_{\text{entry}}}{P_{\text{entry}}} - \text{cost}_{\text{bps}}

安定化

  • ATR正規化: $r/\text{ATR}_H$
  • Sharpe近似の即時代理: $r/\hat{\sigma}_H$

未約定への対応

未約定(armが選ばれたがシグナル不成立)は更新しないか、観測欠損として扱います。

改善策: 二段ルーター

  1. まず「取引すべきか(Ø vs 取引)」を判定
  2. 取引するなら {T, R, W, B} から選択

これにより「未約定による報酬検閲」を回避しやすくなります。

5. エグジット/サイズ/ガード(実務仕様)

5.1 エグジット(Triple Barrier)

  • PT/SL: アーム別または銘柄別(例: PT=1.5·ATR, SL=1.0·ATR, H=30バー)
  • Time barrier: 到達でフラット、PnL確定

5.2 サイズ(ケリー × リスクEMA)

アーム別に勝率近似 $p_k(x)$ をロジスティックで推定($\sigma(\beta_k^\top x)$)

リスクリワード比 $b$ (PT:SL)から部分ケリー(例: 0.25×Kelly)を適用し、リスクEMAと最大VAR(日次)でクリップします。

5.3 ガード

ポラリティガード

予測方向と実績の符号相関 $\rho$ をローリングで監視:

  • $\rho < 0$ がLバー継続&有意 → pause または flip(side反転)

累積レグレッド

\sum (\max_k \text{UCB}_k - \text{UCB}_{k_t})

が閾値超で一時停止

ドローダウン停止

エクイティのDD%と期間でブレーキ

6. 擬似コード(遅延更新・二段ルーター版)

# 0) 準備
events = cusum_events(returns, h, nu, vol_ewm, min_sep)
router_stage1 = LinUCB(alpha=alpha0, halflife='45D')      # Ø vs Trade
router_stage2 = LinUCB(alpha=alpha0, halflife='45D')      # T/R/W/B
pending = Deque()  # (id, stage2_arm, x2, entry_info)

for t in events:
    x = make_context_features(t)          # 正規化済みベクトル
    
    # --- Stage 1: 取引可否 ---
    arm1 = router_stage1.select_arm(x, candidate_arms=["Trade","Ø"])
    if arm1 == "Ø":
        continue

    # --- Stage 2: 戦術選択 ---
    arm2 = router_stage2.select_arm(x, candidate_arms=["T","R","W","B"])
    side, entry = arms[arm2].entry_signal(t, x)
    if not entry:
        # 取引見送り:Stage2は更新せず(検閲回避)
        router_stage1.update("Trade", x, reward=0.0, weight=time_decay(t))
        continue

    # エントリー&Triple Barrier
    entry_px = price[t]
    exit_t, exit_px, exit_type = triple_barrier_exit(side, t, pt, sl, H, atr)
    pnl = side * (exit_px/entry_px - 1) - cost_bps
    pending.append((id(t), arm2, x, pnl, t))

    # 遅延更新処理(exit到達分を順次反映)
    while pending and is_finished(pending[0]):
        _, arm2_done, x2, pnl2, t0 = pending.popleft()
        w = time_decay(t0)
        router_stage2.update(arm2_done, x2, pnl2, weight=w)
        # 取引可否のルーターにも同じ報酬を薄く反映
        router_stage1.update("Trade", x2, pnl2, weight=w)

    # ガード
    if regime_broken(corr_thresh, regret_thresh, dd_limits):
        router_stage1.pause()
        router_stage2.pause()

7. なぜ上回り得るか(機序の具体化)

金融市場の特殊性への適応

金融市場は通常時はランダムウォーク、トレンド発生時は予測可能という二面性を持ちます。本システムは、この特性に以下のように対応します:

1. トレンド予兆の早期検出(CUSUM)

  • 微小な変化の累積: ランダムな価格変動の中から、統計的に有意な方向性の蓄積を検出
  • ノイズフィルタリング: ドリフト付きCUSUMにより、真のトレンド萌芽と単なるノイズを区別
  • 適応的感度: 市場のボラティリティ状態に応じて検出感度を動的調整

これにより、「ランダム→予測可能」への転換点を、市場参加者の多くが認識する前に捉えることが可能になります。

2. レジーム可変への即応(文脈バンディット)

  • LinUCB/TS: 探索×活用のバランスをオンラインで最適化し、市場レジームの変化に追随
  • 遅延報酬への対応: Triple Barrierによる遅延フィードバックを適切に処理
  • 時間減衰学習: 古い市場パターンの影響を減衰させ、現在の市場構造を優先

3. 多戦術によるレジーム網羅

同一の文脈(市場状況)でも、以下の複数の選択肢から最適なものを選択:

  • Arm-T: トレンドが明確化した段階での追随
  • Arm-R: レンジ回帰や過熱からの反転を狙う逆張り
  • Arm-W: ウィック主導の吸収パターンでフェード
  • Arm-B: レンジブレイク後のプルバックでの順張り
  • Arm-Ø: 不確実性が高い局面での待機

この多様性により、「トレンド初期」「トレンド継続」「トレンド終焉」「レンジ回帰」といった異なる市場フェーズで、それぞれ最適な戦術を選択できます。

4. 情報多様性による相関低下

  • 非定型イベント定義: 価格パスの変化点を多角的に捉える
  • OHLCV特徴: ボラティリティ、トレンド、需給、ローソク形状など多面的な文脈情報
  • 戦術間の低相関: 異なる市場メカニズムに反応する戦術群により、ポートフォリオ効果を獲得

5. 構造的バイアスの回避

  • 二段ルーター: 取引有無の判断と戦術選択を分離することで、未約定によるバイアスを低減
  • 適切な報酬設計: ATR正規化やSharpe代理により、異なる市場環境下での学習を安定化

トレード優位性の源泉

本システムの優位性は、以下の3点に集約されます:

  1. 時間優位: トレンド予兆の早期検出により、他の参加者より先にポジション構築
  2. 適応優位: レジーム変化に対する自動適応により、手動調整なしでパフォーマンス維持
  3. 選択優位: 多戦術ルーティングにより、単一戦略では得られない期待値の最大化

8. 実装・検証の要点

A. ハイパーパラメータの「当たり値」一覧(初期値)

パラメータ 推奨値
CUSUM $\nu = 0.2 \cdot \text{MAD}(z)$、$h$: 日6-12発火、min_sep=5
特徴の窓 rv5/rv20, KAMA(30), RSRS(W=240, 短窓=18), Choppy(14), ATR(14)
Arms Donchian(20)、Keltner(n=20, m=1.5-2)、RSI2閾値 98/2
Triple Barrier PT=1.5·ATR, SL=1.0·ATR, H=30
LinUCB $\lambda=1e-3$、$\alpha_0=0.4$、$\text{HL}_{\text{fit}}=45$D
サイズ 0.25×Kelly、日次VAR制約(99%で資本の1%以内)

B. データリーク対策

  • イベント決定に使った足の終値以降の情報は用いない
  • ローリング指標は$t$時点まで、WFOは期間固定・前向き検証
  • 取引コスト・スリッページを銘柄×時間帯で実測反映

C. 遅延報酬と統計の扱い

pending件数が増えると不確実性が増すため:

  • $\alpha$ の下限を高める
  • Arm-Ø選択の機会を増やす(top2差 < $\gamma$)
  • $H$ をアーム別に短縮(例: Wは短め、T/Bは長め)も有効

D. ロギング & 可観測性(運用上重要)

各イベントで以下を記録:

  • 文脈 $x_t$、選択アーム、UCB分解($\hat{\mu}$ と $u$)、2位との差
  • シグナル成立/不成立、エントリー・エグジット要因、PnL、コスト
  • ルーターの係数 $\hat{w}_k$ (線形ゆえ解釈容易:特徴寄与の可視化)
  • ガード発動履歴・根拠(相関、レグレッド、DD)

E. 検証設計(最短で有意差を見る)

アブレーション

  1. 2択ベースライン(順張り/逆張り)
  2. CECB({T, R, W, B, Ø})
  3. CECB - Arm-Ø(Øを禁止)
  4. CECB - 二段ルーター(1段のみ)

メトリクス

  • 年率・VOL・Sharpe、Deflated/Probabilistic Sharpe、最大DD/Calmar
  • 取引当たりの平均・分散、勝率、PF、Avg.R/Avg.L
  • イベントカバレッジ(何割のイベントで約定したか)

安定性

  • 期間スライス別(WFOスキームに沿って)
  • 銘柄別・ボラ/流動性レジーム別
  • PSI/漂移検知:文脈分布の前後比較でドリフト監視

F. 数値安定・計算量

  • LinUCBの $A_k^{-1}$ はウッドベリーの補題で逐次更新($O(d^2)$)
  • $d=30$, arms=5でもイベント駆動なら軽量
  • 特徴はリングバッファで更新、分位はt-digest等の近似で$O(\log n)$

G. 典型的な落とし穴と対処

問題 対処法
未約定ゼロ報酬での学習歪み 二段ルーター or 欠損扱い
Arm-Ø偏重 取引可否のpriorをニュートラルに
強トレンドでR/Wが損耗 モメンタム・フィルタ必須、SL浅めH短めに
イベント過多/過少 $h, \nu, \text{min_sep}$ とVOV連動の再調整
費用見積りの甘さ 実測スリッページの時刻依存モデルを反映

9. クイック導入ステップ(PoC → 実運用)

  1. CUSUM口径合わせ: 目標イベント頻度になるよう$h, \nu$をシミュレーションで決定
  2. 最小構成: 特徴($d \approx 20$)、Arms={T, R, Ø}、LinUCB単段、H=20、PT/SL=1.5/1.0
  3. WFOバックテスト: 銘柄×足、コスト厳格、ログ厳密
  4. 二段ルーター化とArms拡張(W, B)
  5. サイズ連動(ロジスティック勝率×部分ケリー)、ガード稼働
  6. ライブ影武者 → 縮小本番(リスク上限・DDキルスイッチ付き)

10. まとめ

本システムの主要な特徴は以下の通りです:

  • ✅ CUSUMで「パス変化」にロバストなイベントを抽出
  • ✅ OHLCV由来の非BB特徴で文脈を表現
  • ✅ **多戦術(T/R/W/B/Ø)**をLinUCB/TSがオンラインでルーティング
  • ✅ Triple Barrier/リスクEMA/WFO/ポラリティガードは既存資産を継承
  • ✅ 二段ルーターと適切な報酬設計により、未約定バイアスや遅延報酬に対応

この差し替えで、「探索×活用」によるレジーム追随性と、アクション空間の拡張による期待値最大化が同時に実現できます。


参考文献・リソース

  • RiskMetrics Technical Document
  • Contextual Bandits (Li et al., 2010)
  • Triple Barrier Method (López de Prado, 2018)
  • CUSUM Charts for Quality Control

おわりに

本記事で紹介したシステムは、従来のBB依存型イベント駆動とは異なり、より柔軟で適応的なアプローチを提供します。実装の際は、データリークに十分注意し、段階的にシステムを構築していくことをお勧めします。

ご質問やフィードバックがあれば、コメント欄でお気軽にお知らせください!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?