メインコンテンツまでスキップ

ETH_JPY Event-Driven自動売買 研究ドキュメント

最終更新: 2026-02-13
対象読者: 自動売買を学ぶ大学生、開発メンバー、プロジェクトマネージャー

1. プロジェクトの目的

このプロジェクトの目的は、単に「相場が上がったから利益が出た」を狙うことではありません。
目標は、10ETHを固定保有した場合より、売買判断の工夫でどれだけ上乗せできるかを最大化することです。

重視する原則は次のとおりです。

  • WebSocketイベント駆動で、値動きごとに判断する
  • 1分足は補助データ(可視化・検証)として使い、主トリガーにはしない
  • 指値中心、注文遅延ありの現実的な執行モデルで評価する
  • 評価は常に benchmark_hold_eth=10.0 と比較する

2. システム全体像(大学生向け)

処理の流れは次です。

  1. 取引イベント(TRADE / TICKERなど)を受け取る
  2. その時点の特徴量を更新する
  3. 戦略が「目標ポジション(TargetPosition)」を出す
  4. リスク制約をチェックする
  5. 指値注文を出し、約定したらポートフォリオを更新する
  6. 戦略PnLと10ETHベンチPnLの差分(Alpha)を記録する

要するに、価格が動くたびに判断するイベント駆動型であり、「1分ごと固定で判定するシステム」ではありません。

3. 現在実装されている戦略

3.1 ベースライン戦略(非ML)

  • baseline_flat
  • baseline_momentum_micro
  • baseline_mean_reversion_micro
  • baseline_inventory_mm
  • baseline_queue_imbalance_breakout
  • baseline_sweep_follow
  • baseline_regime_switch_micro
  • baseline_flow_imbalance_pulse
  • baseline_technical_hold_overlay
  • baseline_technical_hold_overlay_slow

3.2 ML戦略

  • ml_direction_linear
  • ml_direction_logistic
  • ml_direction_logistic_swing
  • ml_direction_logistic_swing_tokyo
  • ml_direction_logistic_swing_europe
  • ml_direction_logistic_swing_europe_conservative
  • ml_direction_logistic_swing_europe_defensive
  • ml_direction_logistic_swing_europe_regime2
  • ml_direction_logistic_swing_europe_regime3
  • ml_direction_logistic_swing_europe_robust
  • ml_direction_logistic_swing_europe_ultra_conservative
  • ml_direction_logistic_swing_us
  • ml_direction_logistic_hold_overlay
  • ml_direction_logistic_hold_overlay_regime_guard
  • ml_direction_logistic_hold_overlay_regime_guard_derisk_only
  • ml_direction_logistic_hold_overlay_regime_guard_conservative

3.3 現在の主力候補

現時点の主力は以下です。

  • ml_direction_logistic_hold_overlay_regime_guard

理由:

  • OOS(2026-01-01〜2026-02-11)で Alpha が高い
  • 本番想定区間(2025-10-01〜2026-02-11)でも Alpha プラスを維持
  • 取引回転数(turnover)と性能のバランスが比較的よい

4. 特徴量と執行モデル(今の実装)

4.1 主な特徴量

現在の特徴量エンジンでは、主に次を利用しています。

  • 価格系: mid, bid, ask, last, spread
  • リターン系: logret_1s, logret_5s, logret_30s
  • ボラ系: rv_5s, rv_30s
  • 約定フロー: trade_count_1s, trade_vol_1s, trade_imbalance_1s
  • 板がある場合: ob_imbalance_top1, ob_imbalance_top5, microprice

4.2 執行モデル(Backtest)

  • 注文は指値中心
  • 約定判定は --order-latency-sec(デフォルト 0.3秒)を考慮
  • 新規発注は --min-order-interval-sec(デフォルト 300秒)で間引き
  • --enforce-session-close を付けたときのみ、JSTのセッションクローズ制約を有効化

5. 評価方法(最重要)

5.1 何を「勝ち」とみなすか

評価は次の考え方で統一しています。

  • strategy_total_pnl_jpy: 戦略の合計損益
  • benchmark_total_pnl_jpy: 10ETH固定保有の合計損益
  • alpha_total_pnl_jpy = strategy_total_pnl_jpy - benchmark_total_pnl_jpy

つまり、**Alphaがプラスなら「相場の追い風ではなく、売買の工夫で勝った」**という意味です。

5.2 主なKPI

  • alpha_total_pnl_jpy
  • alpha_sharpe
  • alpha_max_dd
  • turnover
  • fill_rate

5.3 Cum Strategy PnLCum Alpha PnL の違い

  • Cum Strategy PnL: 戦略そのものの累積損益(絶対額)
  • Cum Alpha PnL: 戦略累積損益から10ETH固定保有の累積損益を引いた値

高校生向けに言うと、次の違いです。

  • Cum Strategy PnL は「テストの点数そのもの」
  • Cum Alpha PnL は「クラス平均点との差」

このプロジェクトで本当に見たいのは後者です。
理由は、相場全体が上昇しただけで利益が出ていても、それは戦略の実力とは限らないためです。

6. 主要な実験結果(現時点)

6.1 OOS区間(2026-01-01〜2026-02-11)

StrategyAlpha Total (JPY)Alpha SharpeAlpha MaxDDTurnover
ml_direction_logistic_hold_overlay_regime_guard+217,8902.2057-215,380830
ml_direction_logistic_hold_overlay_regime_guard_derisk_only+217,8902.2057-215,380830
ml_direction_logistic_hold_overlay+137,3701.3420-227,770810
ml_direction_logistic_hold_overlay_regime_guard_conservative+114,6701.2364-215,920770

6.2 本番想定区間(2025-10-01〜2026-02-11)

StrategyAlpha Total (JPY)Alpha SharpeAlpha MaxDDTurnover
ml_direction_logistic_hold_overlay_regime_guard+132,3600.2838-804,3802,070
ml_direction_logistic_hold_overlay+115,5900.2329-690,9002,210
ml_direction_logistic_hold_overlay_regime_guard_conservative-116,820-0.2706-739,3201,970

補足:

  • regime_guard は本番区間でもAlphaプラスを維持
  • conservative はOOSでは悪くないが、本番区間でマイナス化し不採用

比較CSV:

  • data/derived/reports/scoreboard_hold_overlay_family_2026-02-11.csv
  • data/derived/reports/compare_hold_overlay_vs_regime_guard_2026-02-11.csv

7. 可視化(PNG/HTML両対応)

現在は HTMLPNG の両方を生成できます。
--plot-format both を指定すると同時出力できます。

7.1 代表コマンド

uv run atc backtest \
--symbol ETH_JPY \
--start 2026-01-01 \
--end 2026-02-11 \
--strategy ml_direction_logistic_hold_overlay_regime_guard \
--target-abs-qty-eth 10 \
--max-abs-position-eth 10 \
--plot \
--plot-format both \
--plot-interval 5m

主な出力キー:

  • plot_html_path
  • plot_png_path

出力例:

  • data/derived/charts/overlay_ETH_JPY_2026-01-01_2026-02-11_ml_direction_logistic_hold_overlay_regime_guard_5m.html
  • data/derived/charts/overlay_ETH_JPY_2026-01-01_2026-02-11_ml_direction_logistic_hold_overlay_regime_guard_5m.png

8. 研究上の注意点

8.1 現在のバックテスト限界

履歴CSVは trade-only なので、完全な板再現(L2厳密再生)はできません。
そのため、次を進める必要があります。

  • forwardで板WSログを蓄積する
  • L2特徴量戦略を別レーンで検証する

8.2 過学習リスク

探索試行を増やすほど、偶然の勝ちパターンが混ざります。
今後は次を必須にします。

  • walk-forward
  • train/valid分離
  • 本番想定区間での再検証

9. 今後の研究方針(実行順)

  1. regime_guard 系の時間帯別最適化(Tokyo/Europe/US)
  2. 日次DD抑制ルールの強化(リスクゲートの層追加)
  3. L2ログ収集データによる板特徴量モデルの本格評価
  4. 画像モデル(Tabular比較)を再検証し、必要なら解像度を段階拡張

10. 再現コマンド(最小セット)

# 1) 学習(例: logistic)
uv run atc ml train-direction-logistic \
--symbol ETH_JPY \
--start 2022-01-01 \
--end 2025-12-31 \
--horizon-sec 300 \
--workers 4

# 2) 本番想定バックテスト
uv run atc backtest \
--symbol ETH_JPY \
--start 2025-10-01 \
--end 2026-02-11 \
--strategy ml_direction_logistic_hold_overlay_regime_guard \
--plot \
--plot-format both \
--plot-interval 5m

# 3) 日次/全体評価レポート
uv run atc report daily-eval \
--symbol ETH_JPY \
--start 2026-01-01 \
--end 2026-01-31 \
--strategy ml_direction_logistic_hold_overlay_regime_guard \
--plot-format png

11. 用語ミニ辞典(大学生向け)

  • イベント駆動: 価格が動いた瞬間ごとに処理する方式
  • ベンチマーク: 比較対象。ここでは「10ETH固定保有(buy-and-hold)」
  • Alpha: 戦略損益 - ベンチ損益
  • Sharpe: 変動リスクを考慮した効率指標(大きいほど安定して強い)
  • MaxDD: 最大ドローダウン。過去ピークからの最大下落幅
  • Turnover: 売買回転の大きさ(過大だとコスト増になりやすい)

このドキュメントは、実験を進めるたびに更新する「研究の正本」です。
結果CSV/JSONを更新した際は、このページの数値テーブルも必ず更新してください。