From 25ee24aff4519f422e86f50523ac5d4a0b0ec8ce Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Fri, 27 Mar 2026 10:28:25 +0100 Subject: [PATCH] fix: wire bars_per_day + trading_days_per_year to backtest evaluator - bars_per_day: now propagated from DQNHyperparameters to GpuBacktestConfig (was silently using Default 390.0 regardless of hyperparams setting) - trading_days_per_year: added to GpuBacktestConfig, replaces hardcoded 252.0 in annualization_factor computation - Annualization: sqrt(bars_per_day * trading_days_per_year) is now fully configurable for any bar frequency and market calendar Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs | 5 ++++- crates/ml/src/hyperopt/adapters/dqn.rs | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs index 74ba72baf..f3c41baa7 100644 --- a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs +++ b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs @@ -191,6 +191,8 @@ pub struct GpuBacktestConfig { /// CME initial margin ~6% of notional for equity index futures. /// Default: 0.06. pub margin_pct: f32, + /// Trading days per year for annualization. CME equity/futures: 252. Crypto: 365. + pub trading_days_per_year: f32, } impl Default for GpuBacktestConfig { @@ -205,6 +207,7 @@ impl Default for GpuBacktestConfig { ofi_dim: 0, bars_per_day: 390.0, // 1-minute bar frequency (6.5h × 60min) min_hold_bars: 5, + trading_days_per_year: 252.0, margin_pct: 0.06, } } @@ -577,7 +580,7 @@ impl GpuBacktestEvaluator { feature_dim, portfolio_dim: PORTFOLIO_AND_MTF_DIM, state_dim, - annualization_factor: (config.bars_per_day * 252.0).sqrt(), + annualization_factor: (config.bars_per_day * config.trading_days_per_year).sqrt(), config, forward_actions_buf, cublas_forward: None, diff --git a/crates/ml/src/hyperopt/adapters/dqn.rs b/crates/ml/src/hyperopt/adapters/dqn.rs index 99197d57c..3b25ef679 100644 --- a/crates/ml/src/hyperopt/adapters/dqn.rs +++ b/crates/ml/src/hyperopt/adapters/dqn.rs @@ -1766,6 +1766,8 @@ impl DQNTrainer { // directly, eliminating the Candle narrow+cat closure. ofi_dim: if ofi_enabled { 8 } else { 0 }, min_hold_bars: internal_trainer.hyperparams().min_hold_bars as i32, + bars_per_day: internal_trainer.hyperparams().bars_per_day as f32, + trading_days_per_year: internal_trainer.hyperparams().trading_days_per_year as f32, ..Default::default() };