ETH_JPY Event-Driven自動売買 研究ドキュメント
最終更新: 2026-02-13
対象読者: 自動売買を学ぶ大学生、開発メンバー、プロジェクトマネージャー
1. プロジェクトの目的
このプロジェクトの目的は、単に「相場が上がったから利益が出た」を狙うことではありません。
目標は、10ETHを固定保有した場合より、売買判断の工夫でどれだけ上乗せできるかを最大化することです。
重視する原則は次のとおりです。
- WebSocketイベント駆動で、値動きごとに判断する
- 1分足は補助データ(可視化・検証)として使い、主トリガーにはしない
- 指値中心、注文遅延ありの現実的な執行モデルで評価する
- 評価は常に
benchmark_hold_eth=10.0と比較する
2. システム全体像(大学生向け)
処理の流れは次です。
- 取引イベント(TRADE / TICKERなど)を受け取る
- その時点の特徴量を更新する
- 戦略が「目標ポジション(TargetPosition)」を出す
- リスク制約をチェックする
- 指値注文を出し、約定したらポートフォリオを更新する
- 戦略PnLと10ETHベンチPnLの差分(Alpha)を記録する
要するに、価格が動くたびに判断するイベント駆動型であり、「1分ごと固定で判定するシステム」ではありません。
3. 現在実装されている戦略
3.1 ベースライン戦略(非ML)
baseline_flatbaseline_momentum_microbaseline_mean_reversion_microbaseline_inventory_mmbaseline_queue_imbalance_breakoutbaseline_sweep_followbaseline_regime_switch_microbaseline_flow_imbalance_pulsebaseline_technical_hold_overlaybaseline_technical_hold_overlay_slow
3.2 ML戦略
ml_direction_linearml_direction_logisticml_direction_logistic_swingml_direction_logistic_swing_tokyoml_direction_logistic_swing_europeml_direction_logistic_swing_europe_conservativeml_direction_logistic_swing_europe_defensiveml_direction_logistic_swing_europe_regime2ml_direction_logistic_swing_europe_regime3ml_direction_logistic_swing_europe_robustml_direction_logistic_swing_europe_ultra_conservativeml_direction_logistic_swing_usml_direction_logistic_hold_overlayml_direction_logistic_hold_overlay_regime_guardml_direction_logistic_hold_overlay_regime_guard_derisk_onlyml_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_jpyalpha_sharpealpha_max_ddturnoverfill_rate
5.3 Cum Strategy PnL と Cum 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)
| Strategy | Alpha Total (JPY) | Alpha Sharpe | Alpha MaxDD | Turnover |
|---|---|---|---|---|
ml_direction_logistic_hold_overlay_regime_guard | +217,890 | 2.2057 | -215,380 | 830 |
ml_direction_logistic_hold_overlay_regime_guard_derisk_only | +217,890 | 2.2057 | -215,380 | 830 |
ml_direction_logistic_hold_overlay | +137,370 | 1.3420 | -227,770 | 810 |
ml_direction_logistic_hold_overlay_regime_guard_conservative | +114,670 | 1.2364 | -215,920 | 770 |
6.2 本番想定区間(2025-10-01〜2026-02-11)
| Strategy | Alpha Total (JPY) | Alpha Sharpe | Alpha MaxDD | Turnover |
|---|---|---|---|---|
ml_direction_logistic_hold_overlay_regime_guard | +132,360 | 0.2838 | -804,380 | 2,070 |
ml_direction_logistic_hold_overlay | +115,590 | 0.2329 | -690,900 | 2,210 |
ml_direction_logistic_hold_overlay_regime_guard_conservative | -116,820 | -0.2706 | -739,320 | 1,970 |
補足:
regime_guardは本番区間でもAlphaプラスを維持conservativeはOOSでは悪くないが、本番区間でマイナス化し不採用
比較CSV:
data/derived/reports/scoreboard_hold_overlay_family_2026-02-11.csvdata/derived/reports/compare_hold_overlay_vs_regime_guard_2026-02-11.csv
7. 可視化(PNG/HTML両対応)
現在は HTML と PNG の両方を生成できます。
--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_pathplot_png_path
出力例:
data/derived/charts/overlay_ETH_JPY_2026-01-01_2026-02-11_ml_direction_logistic_hold_overlay_regime_guard_5m.htmldata/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. 今後の研究方針(実行順)
regime_guard系の時間帯別最適化(Tokyo/Europe/US)- 日次DD抑制ルールの強化(リスクゲートの層追加)
- L2ログ収集データによる板特徴量モデルの本格評価
- 画像モデル(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を更新した際は、このページの数値テーブルも必ず更新してください。