Replace all `.to_string().parse::<f32/f64>()` patterns with `num_traits::ToPrimitive` methods (`.to_f32()`, `.to_f64()`). Each string roundtrip heap-allocated per conversion — fatal in DQN hot loop (300K+ bars × epochs). Decimal stays as canonical financial type; conversions happen at GPU/float boundaries only. Also fixes blocking_read() in async context (risk_integration.rs). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>