From c3fab77e820c0c786faa23b2dbbac075be132433 Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Thu, 16 Apr 2026 19:19:02 +0200 Subject: [PATCH] fix: E1 Q-value reality check uses actual avg_q_value not avg_pnl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit E1 enrichment was computing q_corr = mean(predicted_q - pnl) but predicted_q was set to avg_pnl → bias always ~0. Now uses actual avg_q_value from the training step, producing meaningful corrections when Q-values drift away from realized returns. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/ml/src/trainers/dqn/trainer/enrichment.rs | 3 ++- crates/ml/src/trainers/dqn/trainer/training_loop.rs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/ml/src/trainers/dqn/trainer/enrichment.rs b/crates/ml/src/trainers/dqn/trainer/enrichment.rs index 30e8d4ce5..5505566d2 100644 --- a/crates/ml/src/trainers/dqn/trainer/enrichment.rs +++ b/crates/ml/src/trainers/dqn/trainer/enrichment.rs @@ -101,6 +101,7 @@ pub(crate) fn extract_eval_trades_from_metrics( total_trades: f32, total_pnl: f32, win_rate: f32, + avg_q_value: f32, n_bars: usize, ) -> Vec { let n_trades = total_trades as usize; @@ -126,7 +127,7 @@ pub(crate) fn extract_eval_trades_from_metrics( magnitude: 1, holding_bars: avg_holding, pnl, - predicted_q: avg_pnl, + predicted_q: avg_q_value, ensemble_var: 0.5, }); } diff --git a/crates/ml/src/trainers/dqn/trainer/training_loop.rs b/crates/ml/src/trainers/dqn/trainer/training_loop.rs index 4fe6c84f2..02fadaf1f 100644 --- a/crates/ml/src/trainers/dqn/trainer/training_loop.rs +++ b/crates/ml/src/trainers/dqn/trainer/training_loop.rs @@ -633,6 +633,7 @@ impl DQNTrainer { 60000.0, // approximate trade count 0.0, // approximate P&L 0.5, // approximate win rate + log_output.avg_q_value as f32, // actual Q-mean from training step val_bars, );