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

Research Log

2026-02-12: Trade-Only Baseline Exploration

Objective

  • Improve event-driven strategy quality under:
  • limit-only execution
  • order latency = 0.3s
  • historical trade-only backtest (no full L2/orderbook stream)

Added strategies

  • baseline_regime_switch_micro
  • baseline_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, turnover 2.02
  • baseline_momentum_micro: sharpe -642.49, equity -263.33, turnover 3.42
  • baseline_mean_reversion_micro: sharpe -645.02, equity -177.95, turnover 2.90
  • baseline_flow_imbalance_pulse: sharpe -652.92, equity -242.67, turnover 3.18

Observation:

  • baseline_regime_switch_micro reduced 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, turnover 105.08
  • baseline_mean_reversion_micro: sharpe -707.21, equity -9459.71, turnover 117.24
  • baseline_flow_imbalance_pulse: sharpe -708.73, equity -10801.95, turnover 120.87
  • baseline_momentum_micro: sharpe -768.32, equity -15107.35, turnover 157.42

Observation:

  • All tested trade-only baselines remain negative after latency-aware limit execution.
  • baseline_regime_switch_micro is 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

  1. Add strategy-level holding/cooldown policies that target lower turnover under event bursts.
  2. Introduce time-of-day gating (session-specific thresholds).
  3. Build walk-forward splits and optimize only on train windows.
  4. 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-sec to backtest and leaderboard commands.
  • Default set to 300 seconds (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 -488 to -299
  • best final equity improved from about -172 to -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 -647 to 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抑制版」を比較する。

実施した変更

  1. Hold10 softmax 学習をクラス不均衡対応(class-balanced)に変更。
  2. 学習は rust 特徴量 + torch/mps + 大きめバッチ(65536)で実行。
  3. 戦略は ml_hold10_softmax_overlay_aggressiveml_hold10_softmax_overlay_derisk_only_aggressive を比較。

主要結果(本番想定: 2025-10-01〜2026-02-11)

VariantAlpha Total (JPY)Alpha SharpeAlpha MaxDDTurnoverFills
h60 + aggressive+6,447,5201.4869-2,966,820201
h300(class-balanced) + aggressive+4,052,8201.2119-2,842,08024012
h300(class-balanced) + derisk_only+2,026,4101.2119-1,421,04012012

解釈

  • 利益最大化では h60 + aggressive が最良。
  • ただし取引回数が極端に少ないため、レジーム変化への追随余地は残る。
  • DDを抑えたい場合は derisk_only が有効。

出力ファイル

  • data/derived/reports/experiment_summary_2026-02-14_hold10.csv
  • data/derived/reports/daily_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_aggressive.csv
  • data/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-012026-02-11

比較した run-tag:

  • blend_cfgAblend_cfgF

主要結果(同一区間)

Run tagAlpha Total (JPY)Alpha SharpeAlpha MaxDDTurnoverFills
blend_cfgC+4,524,9601.3844-2,842,08062031
blend_cfgE+4,524,9601.3844-2,842,08062031
blend_cfgF+4,524,9601.3844-2,842,08062031
blend_cfgA+4,412,9201.3509-2,842,08066033
blend_cfgB+4,412,9201.3509-2,842,08066033
blend_cfgD+4,412,9201.3509-2,842,08066033

解釈

  • cfgC/E/F が同率トップで、現在の分岐条件では同じ行動系列に収束している可能性が高い。
  • しきい値だけの微調整では頭打ちが見えたため、次は「fast/slow モデル組み合わせ」側を探索する。

日次評価(2026-01-01〜2026-02-11, regime_blend)

  • alpha_total_pnl_jpy = +3,310,020
  • alpha_max_dd_jpy = -1,445,900
  • alpha_daily_win_rate = 52.38%

出力ファイル

  • data/derived/reports/summary_blend_cfgA_F.csv
  • data/derived/reports/daily_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_regime_blend.csv
  • data/derived/reports/overall_summary_ETH_JPY_2026-01-01_2026-02-11_ml_hold10_softmax_overlay_regime_blend.csv
  • data/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-012025-09-30 に揃えて再学習する。
  • Rust画像レンダラ実装後の image モデル性能を OOS で再確認する。

実施内容

  1. Hold10 softmax を再学習(h=60 / h=300)。
  2. Image alpha モデル(linear / transformer)を再学習し、OOSの shadow compare を再実行。
  3. 実験サマリを単一CSVへ集約。

主要結果

Hold10 softmax(train/valid):

ModelValid LoglossValid Accuracy
h600.690820.52735
h3000.691480.51794

Image alpha(OOS shadow: 2025-10-01〜2026-02-11):

ModelTarget CorrMAE (JPY)RMSE (JPY)Sign Acc
linear0.0049717,797.4327,569.240.49398
transformer (stride8 train)0.0085517,748.5127,525.770.50096

解釈

  • Hold10 softmax は今回の再学習でも h60h300 より優位。
  • Image系は transformer が linear を上回ったが、相関はまだ小さく、改善余地が大きい。
  • 次の改善は「full train(非stride8)transformer」「tabularとのアンサンブル」「OOSバックテスト検証」を優先する。

出力ファイル

  • data/derived/models/ml_hold10_softmax_h60_2022_2025q3.metrics.json
  • data/derived/models/ml_hold10_softmax_h300_2022_2025q3.metrics.json
  • data/derived/models/ml_image_alpha_linear_train_2022_2025q3.metrics.json
  • data/derived/models/ml_image_alpha_transformer_train_2022_2025q3_stride8.metrics.json
  • data/derived/reports/shadow_compare_eval_2025q4_2026feb11_linear_image.csv
  • data/derived/reports/shadow_compare_eval_2025q4_2026feb11_transformer_stride8.csv
  • data/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

StrategyRun tagAlpha Total (JPY)Alpha SharpeTurnover
ml_hold10_softmax_overlay_aggressive (h300)h300_q3train_0107_pos10-49,736.68-1.382530
ml_hold10_softmax_overlay_cost_guard (h300)cost_guard_q3train_0107_pos10-67,406.68-1.870730

2026-02-15: Hold10探索基盤の拡張と再検証(公平条件)

実装

  1. hold10 softmax 学習に class_weight_mode を追加。
    • inverse_freq(既定)
    • sqrt_inv
    • none
  2. 下記の探索スクリプトを追加/更新。
    • scripts/search_hold10_softmax_labels.py
    • scripts/search_hold10_cost_guard.py
    • scripts/search_technical_hold10_overlay.py
  3. max-candidates 使用時の偏りを防ぐため、候補は seed 固定でシャッフルしてから抽出するように変更。

検証A: Hold10 Softmax(class weight比較)

条件:

  • train: 2022-01-012025-09-30
  • eval: 2026-01-012026-01-07
  • 初期ポジション 10ETH、ベンチ 10ETH holdenforce_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-012026-01-07
  • seed=42 で候補抽出

結果:

  • best candidate: alpha -307,205 JPY(依然マイナス)

解釈:

  • ルール系オーバーレイも現条件では優位性を示せず。
  • 「保持し続ける(alpha=0)」を上回る候補が未発見。

追加確認

  • ml_hold10_softmax_h300_2022_2025q3enforce_session_close=false 条件だと 7日窓で取引0件・alpha=0
  • セッション強制クローズ有無で挙動が大きく変わるため、実験比較時はこの条件を固定して記録する。

次アクション

  1. ラベルを「状態遷移コスト込み(state-aware)」へ変更(現在は状態非依存)。
  2. モデル探索は 7日抽出 → 1か月再検証 の二段階で実行。
  3. 追加戦略は「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,370
    • orders = 4

1か月再検証(2026-01-01〜2026-01-31)

同一モデルを再評価:

  • alpha_total_pnl_jpy = +447,560
  • alpha_sharpe = 2.7803
  • orders = 19, turnover = 190

比較:

  • greedy_h300_q3 は同条件で alpha = 0(取引0件)

42日再検証(2026-01-01〜2026-02-11)

同一モデルを再評価:

  • alpha_total_pnl_jpy = +1,142,330
  • alpha_sharpe = 3.7668
  • alpha_max_dd = -660,230
  • orders = 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_h600
    • greedy_aggressive_h300_q3

集計結果:

  • stateful:
    • alpha_total_pnl_jpy = +732,210
    • alpha_win_rate = 50.0%(6窓中3窓)
    • orders_total = 19
  • greedy:
    • alpha_total_pnl_jpy = +213,660
    • alpha_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 で窓幅のみ変更して比較。

WindowStateful Alpha Total (JPY)Greedy Alpha Total (JPY)Stateful Win Rate
7日+732,210+213,66050.0%
14日+1,142,330066.7%
21日+1,142,330050.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