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) <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-03-27 10:28:25 +01:00
parent 5ac1c9502a
commit 25ee24aff4
2 changed files with 6 additions and 1 deletions

View File

@@ -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,

View File

@@ -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()
};