Commit Graph

5 Commits

Author SHA1 Message Date
jgrusewski
199287f78e fix(ml): warmup assertions, hyperopt architecture alignment, greedy eval
- Add debug_assert_eq! guards in 4 train_baseline functions to catch
  bar/feature length misalignment at debug time (#4)
- Remove "last sample targets itself" block in hyperopt PPO adapter
  that created ~0 return sample biasing toward HOLD (#5)
- Align hyperopt state_dim 54→51 and num_actions 45→3 to match
  train_baseline architecture, making tuned hyperparams transferable (#6)
- Use greedy_action() in evaluate_baseline PPO eval for deterministic results

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 01:28:50 +01:00
jgrusewski
aaaaef7f48 fix(ml): address code review — greedy PPO eval, gamma alignment, Sharpe fix
Fixes from code review of DQN/PPO validation pipeline:

1. PPO validation: use greedy_action() (argmax) instead of stochastic
   act() — deterministic early-stopping signal, matching DQN's eps=0.

2. DQN eval gamma: align to 0.95 (was 0.99) matching train_baseline.
   Gamma doesn't affect greedy inference but configs should match.

3. Sharpe annualization: use 1380 bars/day (23h futures session) not
   390 (6.5h equities). Fixes ~1.8x underestimate for ES futures.

4. compute_reward: accept f64 total_cost_bps (was f32) to match
   shared spread_cost_bps() from baseline_common.rs.

5. Default max_steps_per_epoch: 2000 (was 0/unlimited) for OOM safety.

6. Hyperopt PPO: add timestamp dedup to decode_ohlcv_bars for .FUT
   parent symbols with overlapping contracts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 01:02:51 +01:00
jgrusewski
26b51a4f99 feat(ml): real validation, transaction costs, and data fixes for DQN/PPO pipeline
Replace stub validation functions with real model inference (DQN greedy,
PPO act()) so early stopping optimizes actual trading performance instead
of market volatility. Add transaction costs (commission + bid-ask spread)
to reward computation across train/hyperopt/evaluate examples.

Key changes:
- Symbol filtering (--symbol ES.FUT) prevents mixing futures contracts
- BTreeMap timestamp dedup handles overlapping .FUT contract bars
- Return clamping (--max-bar-return) filters contract roll boundaries
- Warmup offset alignment fixes feature-to-bar index mismatch
- Kelly sizing: 3 stubs replaced with real data-driven implementations
- Adam optimizer: BUG #14 diagnostic logging demoted to trace
- TFT: varmap_mut() accessor for checkpoint loading
- PPO hyperopt: with_costs() builder for tx cost configuration

DQN eval (ES.FUT, 2 folds): Sharpe=11.36, MaxDD=7.42%, WinRate=33.2%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:43:11 +01:00
jgrusewski
e3f32742fa feat(ml): walk-forward training pipeline with real Databento data
Fix zstd decoder in train_baseline.rs and evaluate_baseline.rs (same
pattern as hyperopt adapters — branch on .dbn.zst extension). Add CLI
flags for walk-forward config (train/val/test/step months), learning
rate, and max-steps-per-epoch to make pipeline validation feasible.

Pipeline validated end-to-end: hyperopt (5 trials, best Sharpe 2.37) →
walk-forward training (4 folds, 6/1/1 month windows on ES.FUT) →
evaluation (4 fold test sets, checkpoints + norm stats saved).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:48:10 +01:00
jgrusewski
86fda69bfd feat(ml): add walk-forward evaluation binary with financial metrics
Loads trained DQN/PPO checkpoints, runs greedy inference on walk-forward
test windows, computes Sharpe ratio, max drawdown, win rate, profit factor,
and total return per fold. Outputs a JSON evaluation report with aggregate
metrics and sanity checks (beats-random, action diversity, fold consistency).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:09:06 +01:00