Research Log
2026-02-12: Trade-Only Baseline Exploration
Objective
- Improve event-driven strategy quality under:
limit-onlyexecution- order latency =
0.3s - historical trade-only backtest (no full L2/orderbook stream)
Added strategies
baseline_regime_switch_microbaseline_flow_imbalance_pulse
Experiment A: 1-day slice
Command:
uv run atc report leaderboard \
--symbol ETH_JPY \
--start 2026-01-01 \
--end 2026-01-01 \
--strategy baseline_momentum_micro \
--strategy baseline_mean_reversion_micro \
--strategy baseline_regime_switch_micro \
--strategy baseline_flow_imbalance_pulse
Result summary (sorted by alpha_sharpe):
baseline_regime_switch_micro: sharpe-488.49, equity-171.97, turnover2.02baseline_momentum_micro: sharpe-642.49, equity-263.33, turnover3.42baseline_mean_reversion_micro: sharpe-645.02, equity-177.95, turnover2.90baseline_flow_imbalance_pulse: sharpe-652.92, equity-242.67, turnover3.18
Observation:
baseline_regime_switch_microreduced turnover and improved alpha sharpe versus existing momentum/reversion baselines on this day.
Experiment B: 7-day slice
Command:
uv run atc report leaderboard \
--symbol ETH_JPY \
--start 2026-01-01 \
--end 2026-01-07 \
--strategy baseline_momentum_micro \
--strategy baseline_mean_reversion_micro \
--strategy baseline_regime_switch_micro \
--strategy baseline_flow_imbalance_pulse
Result summary (sorted by alpha_sharpe):
baseline_regime_switch_micro: sharpe-646.75, equity-10130.27, turnover105.08baseline_mean_reversion_micro: sharpe-707.21, equity-9459.71, turnover117.24baseline_flow_imbalance_pulse: sharpe-708.73, equity-10801.95, turnover120.87baseline_momentum_micro: sharpe-768.32, equity-15107.35, turnover157.42
Observation:
- All tested trade-only baselines remain negative after latency-aware limit execution.
baseline_regime_switch_microis currently best by alpha sharpe and shows lower turnover.
Bottlenecks identified
- Trade-only historical data lacks orderbook microstructure needed by MM/queue imbalance class strategies.
- Order replacement is still frequent under high event rates.
- Signal-to-noise ratio is weak without stronger regime/time filters.
Next research steps
- Add strategy-level holding/cooldown policies that target lower turnover under event bursts.
- Introduce time-of-day gating (session-specific thresholds).
- Build walk-forward splits and optimize only on train windows.
- Start collecting forward WebSocket orderbook logs to unlock L2-aware models.
2026-02-12: Order Cadence Control (5-minute default)
Motivation
- Event-driven loop was submitting too frequently for practical operation.
- Desired operating style: continuous monitoring, but orders only every ~5 minutes to several hours.
Implementation
- Added
--min-order-interval-secto backtest and leaderboard commands. - Default set to
300seconds (5 minutes). - Strategy evaluation still runs for every event; only new submissions are throttled.
Results (same windows as above, 4-strategy subset)
1-day (2026-01-01):
- orders dropped from 200-300 range to ~60-130
- best alpha sharpe improved from about
-488to-299 - best final equity improved from about
-172to-16
7-day (2026-01-01 to 2026-01-07):
- orders dropped from ~11k-17k to ~1.3k-1.6k
- alpha sharpe improved from about
-647to around-239 - final equity improved materially (still negative)
Interpretation:
- Main issue was not only signal quality; execution cadence was too aggressive.
- Throttling makes behavior closer to intended short-term style and reduces over-trading loss.
2026-02-14: Hold10 Softmaxの再学習と比較
目的
10ETH固定保有比較で Alpha をさらに伸ばす。- Apple Silicon (
torch+mps) を使って学習サイクルを高速化する。 - モデル更新後に「利益最大化版」と「DD抑制版」を比較する。
実施した変更
- Hold10 softmax 学習をクラス不均衡対応(class-balanced)に変更。
- 学習は
rust特徴量 +torch/mps+ 大きめバッチ(65536)で実行。 - 戦略は
ml_hold10_softmax_overlay_aggressiveとml_hold10_softmax_overlay_derisk_only_aggressiveを比較。
主要結果(本番想定: 2025-10-01〜2026-02-11)
| Variant | Alpha Total (JPY) | Alpha Sharpe | Alpha MaxDD | Turnover | Fills |
|---|---|---|---|---|---|
h60 + aggressive | +6,447,520 | 1.4869 | -2,966,820 | 20 | 1 |
h300(class-balanced) + aggressive | +4,052,820 | 1.2119 | -2,842,080 | 240 | 12 |
h300(class-balanced) + derisk_only | +2,026,410 | 1.2119 | -1,421,040 | 120 | 12 |
解釈
- 利益最大化では
h60 + aggressiveが最良。 - ただし取引回数が極端に少ないため、レジーム変化への追随余地は残る。
- DDを抑えたい場合は
derisk_onlyが有効。
出力ファイル
data/derived/reports/experiment_summary_2026-02-14_hold10.csvdata/derived/reports/daily_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_aggressive.csvdata/derived/charts/overview_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_aggressive.png
2026-02-15: Regime Blendしきい値探索(run-tag運用)
目的
ml_hold10_softmax_overlay_regime_blendの閾値を探索し、10ETH固定保有比較の Alpha を改善する。- 並列実験時のレポート上書きを防ぐため、
atc backtest --run-tagで結果を分離保存する。
実施
探索区間:
2025-10-01〜2026-02-11
比較した run-tag:
blend_cfgA〜blend_cfgF
主要結果(同一区間)
| Run tag | Alpha Total (JPY) | Alpha Sharpe | Alpha MaxDD | Turnover | Fills |
|---|---|---|---|---|---|
blend_cfgC | +4,524,960 | 1.3844 | -2,842,080 | 620 | 31 |
blend_cfgE | +4,524,960 | 1.3844 | -2,842,080 | 620 | 31 |
blend_cfgF | +4,524,960 | 1.3844 | -2,842,080 | 620 | 31 |
blend_cfgA | +4,412,920 | 1.3509 | -2,842,080 | 660 | 33 |
blend_cfgB | +4,412,920 | 1.3509 | -2,842,080 | 660 | 33 |
blend_cfgD | +4,412,920 | 1.3509 | -2,842,080 | 660 | 33 |
解釈
cfgC/E/Fが同率トップで、現在の分岐条件では同じ行動系列に収束している可能性が高い。- しきい値だけの微調整では頭打ちが見えたため、次は「fast/slow モデル組み合わせ」側を探索する。
日次評価(2026-01-01〜2026-02-11, regime_blend)
alpha_total_pnl_jpy = +3,310,020alpha_max_dd_jpy = -1,445,900alpha_daily_win_rate = 52.38%
出力ファイル
data/derived/reports/summary_blend_cfgA_F.csvdata/derived/reports/daily_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_regime_blend.csvdata/derived/reports/overall_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_regime_blend.csvdata/derived/charts/overview_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_regime_blend.png
2026-02-15: 再学習(リーク回避区間)と Image OOS 再評価
目的
- OOSを
2025-10-01以降に固定するため、学習区間を2022-01-01〜2025-09-30に揃えて再学習する。 - Rust画像レンダラ実装後の image モデル性能を OOS で再確認する。
実施内容
- Hold10 softmax を再学習(
h=60/h=300)。 - Image alpha モデル(linear / transformer)を再学習し、OOSの shadow compare を再実行。
- 実験サマリを単一CSVへ集約。
主要結果
Hold10 softmax(train/valid):
| Model | Valid Logloss | Valid Accuracy |
|---|---|---|
h60 | 0.69082 | 0.52735 |
h300 | 0.69148 | 0.51794 |
Image alpha(OOS shadow: 2025-10-01〜2026-02-11):
| Model | Target Corr | MAE (JPY) | RMSE (JPY) | Sign Acc |
|---|---|---|---|---|
linear | 0.00497 | 17,797.43 | 27,569.24 | 0.49398 |
transformer (stride8 train) | 0.00855 | 17,748.51 | 27,525.77 | 0.50096 |
解釈
- Hold10 softmax は今回の再学習でも
h60がh300より優位。 - Image系は transformer が linear を上回ったが、相関はまだ小さく、改善余地が大きい。
- 次の改善は「full train(非stride8)transformer」「tabularとのアンサンブル」「OOSバックテスト検証」を優先する。
出力ファイル
data/derived/models/ml_hold10_softmax_h60_2022_2025q3.metrics.jsondata/derived/models/ml_hold10_softmax_h300_2022_2025q3.metrics.jsondata/derived/models/ml_image_alpha_linear_train_2022_2025q3.metrics.jsondata/derived/models/ml_image_alpha_transformer_train_2022_2025q3_stride8.metrics.jsondata/derived/reports/shadow_compare_eval_2025q4_2026feb11_linear_image.csvdata/derived/reports/shadow_compare_eval_2025q4_2026feb11_transformer_stride8.csvdata/derived/reports/experiment_summary_2026-02-15_training_restart.csv
追加検証(2026-01-01〜2026-01-07の実売買バックテスト)
10ETH固定保有 ベンチと公平比較するため、--initial-position-eth 10 に固定して評価。
同一条件: limit_only, latency=0.3s, min_order_interval=300s。
| Strategy | Run tag | Alpha Total (JPY) | Alpha Sharpe | Turnover |
|---|---|---|---|---|
ml_hold10_softmax_overlay_aggressive (h300) | h300_q3train_0107_pos10 | -49,736.68 | -1.3825 | 30 |
ml_hold10_softmax_overlay_cost_guard (h300) | cost_guard_q3train_0107_pos10 | -67,406.68 | -1.8707 | 30 |
2026-02-15: Hold10探索基盤の拡張と再検証(公平条件)
実装
hold10 softmax学習にclass_weight_modeを追加。inverse_freq(既定)sqrt_invnone
- 下記の探索スクリプトを追加/更新。
scripts/search_hold10_softmax_labels.pyscripts/search_hold10_cost_guard.pyscripts/search_technical_hold10_overlay.py
max-candidates使用時の偏りを防ぐため、候補はseed固定でシャッフルしてから抽出するように変更。
検証A: Hold10 Softmax(class weight比較)
条件:
- train:
2022-01-01〜2025-09-30 - eval:
2026-01-01〜2026-01-07 - 初期ポジション
10ETH、ベンチ10ETH hold、enforce_session_close=false
結果(4候補, 20 epochs):
- best:
inverse_freq(aggressive) =alpha -268,030 JPY noneはさらに悪化(最大alpha -536,060 JPY)
解釈:
- 今回の範囲では
class_weight_modeの変更だけでは改善せず。 - まずは
inverse_freq維持が妥当。
検証B: Technical Hold10 Overlay(乱択24候補)
条件:
- eval:
2026-01-01〜2026-01-07 seed=42で候補抽出
結果:
- best candidate:
alpha -307,205 JPY(依然マイナス)
解釈:
- ルール系オーバーレイも現条件では優位性を示せず。
- 「保持し続ける(alpha=0)」を上回る候補が未発見。
追加確認
ml_hold10_softmax_h300_2022_2025q3はenforce_session_close=false条件だと 7日窓で取引0件・alpha=0。- セッション強制クローズ有無で挙動が大きく変わるため、実験比較時はこの条件を固定して記録する。
次アクション
- ラベルを「状態遷移コスト込み(state-aware)」へ変更(現在は状態非依存)。
- モデル探索は
7日抽出 → 1か月再検証の二段階で実行。 - 追加戦略は「flat優先(short抑制)」と「遷移回数制約」を強める。
2026-02-15: State-awareラベル導入(第1サイクル)
実装
ml train-hold10-softmax に以下を追加。
--label-mode {greedy,stateful}--switch-cost-bps--short-switch-extra-bps--switch-hysteresis-bps
加えて探索スクリプトで label_mode と遷移コストを探索可能にした。
短期探索(train: 2025-07-01〜2025-09-30, eval: 2026-01-01〜2026-01-07)
- 12候補探索(
seed=7)で、statefulの実働候補を発見。 - best active:
- model:
...h600_fc2_sc3_hb10_cwinverse_freq_lmstateful_sw4_sx8_hy1_derisk_only_aggressive_007.json alpha_total_pnl_jpy = -142,370orders = 4
- model:
1か月再検証(2026-01-01〜2026-01-31)
同一モデルを再評価:
alpha_total_pnl_jpy = +447,560alpha_sharpe = 2.7803orders = 19,turnover = 190
比較:
greedy_h300_q3は同条件でalpha = 0(取引0件)
42日再検証(2026-01-01〜2026-02-11)
同一モデルを再評価:
alpha_total_pnl_jpy = +1,142,330alpha_sharpe = 3.7668alpha_max_dd = -660,230orders = 19,turnover = 190
解釈
- state-awareラベルの第1サイクルで、
10ETH固定保有比較の正のAlphaを確認。 - まだ探索母数が小さいため、次は walk-forward で過適合を検証する。
週次walk-forward比較(2026-01-01〜2026-02-11)
検証スクリプト:
scripts/eval_hold10_stateful_walkforward.py
設定:
- 7日窓、非重複(6窓)
- 比較対象:
stateful_derisk_sw4_sx8_hy1_h600greedy_aggressive_h300_q3
集計結果:
- stateful:
alpha_total_pnl_jpy = +732,210alpha_win_rate = 50.0%(6窓中3窓)orders_total = 19
- greedy:
alpha_total_pnl_jpy = +213,660alpha_win_rate = 16.7%(6窓中1窓)orders_total = 3
解釈:
statefulは窓ごとの変動はあるが、合計Alphaと勝率でgreedyを上回った。- 次は窓幅を変えた感度分析(7/14/21日)と、2025Q4を含む拡張walk-forwardを実施する。
窓幅感度(7/14/21日)
同一期間 2026-01-01〜2026-02-11 で窓幅のみ変更して比較。
| Window | Stateful Alpha Total (JPY) | Greedy Alpha Total (JPY) | Stateful Win Rate |
|---|---|---|---|
| 7日 | +732,210 | +213,660 | 50.0% |
| 14日 | +1,142,330 | 0 | 66.7% |
| 21日 | +1,142,330 | 0 | 50.0% |
解釈:
- 窓幅を粗くすると
statefulの優位は維持され、greedyはほぼ非アクティブ。 - 現状は
statefulを主軸に、短窓での不安定区間(1月前半)を改善する方針が妥当。 |ml_hold10_softmax_overlay_aggressive(h60) |h60_q3train_0107_pos10| -294,941.99 | -7.0589 | 30 | |baseline_technical_hold_overlay_adaptive|tech_adaptive_0107_pos10| -481,648.95 | -27.7086 | 3438 | |ml_hold10_softmax_overlay_regime_blend(h60/h300) |blend_q3train_0107_pos10| -557,827.13 | -9.9928 | 2270 |
解釈:
h300 aggressiveが今回の比較では最良だが、まだ Alpha はマイナス。cost_guardは過剰遷移抑制を実装したが、この週ではh300 aggressiveをまだ上回らなかった。h60は学習指標は良い一方で、この週の実売買では過度にデリスクして劣化。regime_blendは turnover が高く、執行コスト込みで不利。
追加出力:
data/derived/reports/experiment_summary_2026-02-15_hold10_family_0107_pos10.csv