diff --git a/crates/ml/src/dqn/reward.rs b/crates/ml/src/dqn/reward.rs index cdba24ac1..2d0f22bec 100644 --- a/crates/ml/src/dqn/reward.rs +++ b/crates/ml/src/dqn/reward.rs @@ -926,13 +926,9 @@ impl RewardFunction { // |ln(P_{t+1} / P_t)| measures the magnitude of the price change (velocity) let volatility = next_log_return.abs(); - // BUG FIX: Scale hold_penalty_weight to percentage units - // Config value: 0.5-2.0 (raw scalar from hyperopt) - // Scaled value: 0.0005-0.002 (50-200 basis points = 0.05-0.2%) - // This makes hold penalty comparable to transaction costs (0.05-0.15%), not 30x weaker - let hold_penalty_scale = Decimal::try_from(1000.0) - .unwrap_or(Decimal::ONE); - let hold_penalty_pct = self.config.hold_penalty_weight / hold_penalty_scale; + // Hold penalty weight used directly (0.01-2.0 range from hyperopt). + // Previously divided by 1000, making it 0.00001 — negligible vs tx costs (0.05-0.15%). + let hold_penalty_pct = self.config.hold_penalty_weight; // Compare volatility to movement threshold let hold_reward = if volatility < self.config.movement_threshold {