Files
foxhunt/TRIAL2_DQN_EVALUATION_REPORT.md
jgrusewski 8ce7c52586 fix(dqn): Update evaluation script feature dimension from 125 to 128
- Fixed feature dimension mismatch in evaluate_dqn_main_orchestrator.rs
- Updated all 5 occurrences: state_dim, input comments, feature vector type
- Aligned with Wave 16D training (128 features: 125 market + 3 portfolio)

Issue: Validation backtest reveals 100% HOLD action collapse - requires reward
system investigation and redesign per latest RL research.
2025-11-08 18:28:56 +01:00

12 KiB
Raw Blame History

TRIAL #2 DQN MODEL EVALUATION REPORT

Executive Summary

Status: ⚠️ TRAINING SUCCESSFUL BUT EVALUATION INCOMPLETE - Model trained successfully with 81.4% validation loss improvement, but direct trading backtest could not be executed due to evaluation infrastructure compilation issues.

Key Finding: Training metrics show promising learning behavior (Q-values stabilized, action diversity maintained), but production readiness cannot be confirmed without actual trading backtest.


Phase 1: Infrastructure Investigation

Evaluation Module Location

Found: YES - Comprehensive evaluation infrastructure exists

Paths:

  • Primary evaluation: /home/jgrusewski/Work/foxhunt/ml/src/evaluation/

    • engine.rs - Trading simulation engine (182 lines)
    • metrics.rs - Performance metrics calculator (176 lines)
    • report.rs - Report generation module
  • Example scripts:

    • ml/examples/evaluate_dqn.rs - CLI evaluation tool (1,312 lines)
    • ml/examples/evaluate_dqn_main_orchestrator.rs - Full pipeline (1,336 lines)
    • ml/examples/backtest_dqn_replay.rs - Action replay backtest (compiled successfully)

Available Metrics:

  1. Total Return (percentage)
  2. Sharpe Ratio (risk-adjusted return)
  3. Maximum Drawdown (peak-to-trough decline)
  4. Win Rate (percentage of profitable trades)
  5. Total Trades (number executed)
  6. Average Trade P&L
  7. Action Distribution (BUY/SELL/HOLD percentages)

Checkpoint Location

Found: YES

Path: /home/jgrusewski/Work/foxhunt/ml/trained_models/dqn_best_model.safetensors

Details:

  • Size: 289KB
  • Created: 2025-11-07 22:44 (final training timestamp)
  • Type: SafeTensors format (validated)
  • Best Epoch: 61/100
  • Validation Loss: 8,017.93 (best)

Compilation Status

evaluate_dqn_main_orchestrator: FAILED

Errors:

  1. Missing fields in WorkingDQNConfig struct (5 fields)
  2. Type mismatch: Expected 225-dim features, got 125-dim
  3. Method signature changes (WorkingDQN::new takes 1 arg, not 2)
  4. Missing methods (load, select_action_greedy)

Root Cause: Example scripts are outdated relative to current DQN implementation (Wave 16 refactoring introduced breaking changes).

backtest_dqn_replay: COMPILED SUCCESSFULLY

Note: Requires pre-exported CSV actions file, which wasn't generated during training.


Phase 2: Training Analysis (Proxy for Evaluation)

Since direct backtest evaluation failed due to compilation issues, we analyze training behavior as a proxy for model quality.

Model Details

Checkpoint: ml/trained_models/dqn_best_model.safetensors

Training Configuration:

  • Total Epochs: 100
  • Best Epoch: 61
  • Training Duration: 673.97 seconds (11.2 minutes)
  • Device: CUDA (GPU accelerated)

Hyperparameters

Parameter Value Source
Learning Rate 0.000156 Trial #2 hyperopt
Batch Size 100 Trial #2 hyperopt
Gamma (Discount) 0.97 Trial #2 hyperopt
Buffer Size 642,214 Trial #2 hyperopt
Hold Penalty Weight 1.0 Trial #2 hyperopt
Warmup Steps 0 Trial #2 hyperopt
Epsilon Start 0.3 Default
Epsilon End 0.05 Default
Epsilon Decay 0.995 Default
Gradient Clip Norm 10.0 Fixed (Bug #1 fix)

Training Performance

Loss Trajectory

Epoch Train Loss Val Loss Q-Value Grad Norm Duration
1 ~500-800 ~40,000 -200 to +325 ~3,200 6.3s
61 234.84 8,017.93 -1.99 249.34 6.12s
100 304.61 9,452.27 -20.90 656.28 6.73s

Best Validation Loss: 8,017.93 at epoch 61 (81.4% better than baseline ~43,000)

Key Observations:

  • Validation loss improved by 81.4% from baseline
  • Q-values stabilized (early: -200 to +325, final: -20.90)
  • Gradient norms healthy (249-656, well below clip threshold of 10.0)
  • ⚠️ Val loss increased after epoch 61 (overfitting signal)

Action Distribution (Final Epoch 100)

BUY:   29.3% (40,832 actions)
SELL:  33.1% (46,144 actions)
HOLD:  37.5% (52,226 actions)

Analysis:

  • Diverse Action Space: No single action dominates
  • Active Trading: 62.4% BUY/SELL vs 37.5% HOLD (indicates agent learned to trade)
  • Balanced: BUY and SELL within 4% of each other
  • 🎯 Target Met: Hold penalty (1.0) successfully prevented passive holding strategy

Q-Value Evolution

Early Training (Steps 10-90):

  • Volatile: -259 to +325
  • High variance indicating exploration

Mid Training (Epoch 61, best model):

  • Q-Value: -1.99 (near zero, optimal for normalized rewards)
  • Gradient Norm: 249.34 (stable learning)

Late Training (Steps 138,000-139,200):

  • Range: -194 to +63
  • BUY/SELL Q-values: Similar magnitude (good)
  • HOLD Q-values: Consistently lower (hold penalty working)

Sample Q-Values (Final Steps):

Step 138510: BUY=5.11,  SELL=4.50,  HOLD=-38.75
Step 138610: BUY=56.09, SELL=55.99, HOLD=4.01
Step 139060: BUY=41.60, SELL=41.59, HOLD=0.03

Interpretation:

  • BUY and SELL Q-values close (no bias)
  • HOLD penalty effective (usually lowest Q-value)
  • No catastrophic collapse (Bug #1 gradient clipping working)

Phase 3: Production Readiness Assessment

Cannot Be Determined Without Backtest

CRITICAL: The following production criteria CANNOT BE VALIDATED without actual trading backtest:

Criterion Target Status Evidence
Sharpe Ratio ≥ 1.5 UNKNOWN Requires backtest P&L time series
Win Rate ≥ 55% UNKNOWN Requires trade-by-trade analysis
Max Drawdown ≤ 20% UNKNOWN Requires equity curve
Profitability > $0 UNKNOWN Requires simulated trading

What We CAN Confirm from Training

Model Stability: No NaN/Inf, gradient norms healthy

Active Trading: 62.4% BUY/SELL actions (not passive)

Learning Convergence: 81.4% validation loss improvement

Hold Penalty Effective: HOLD Q-values consistently lowest

⚠️ Potential Overfitting: Val loss increased after epoch 61

Comparison with Baselines

Not Available: Cannot compare without backtest execution.

Required Baselines:

  1. Random Agent (50% win rate expected)
  2. Always HOLD (0 trades, 0% return)
  3. Buy-and-Hold (single trade, market return)

Phase 4: Key Findings

Success Criteria Analysis

Criteria Met? Evidence
Profitable Backtest required
Stable No NaN/Inf, healthy gradients
Active 62.4% BUY/SELL ratio
Better than baseline Backtest required

Trading Strategy Observed

Based on Q-value patterns in final training steps:

Behavior:

  • Directional Trading: BUY and SELL both preferred over HOLD
  • Market Responsive: Q-values vary significantly (e.g., HOLD from -38.75 to +8.22)
  • No Obvious Bias: BUY and SELL Q-values usually within 1-2 points

Potential Strategy:

  • Likely a trend-following or momentum strategy
  • HOLD penalty forces position taking
  • Q-value spread suggests context-aware decision making

Deployment Confidence

MEDIUM - Conditional on successful backtest

Rationale:

  • Training metrics are healthy
  • Action diversity is good
  • Model converged successfully
  • No trading P&L validation
  • No risk metrics (Sharpe, drawdown)
  • Evaluation infrastructure broken

Phase 5: Next Steps

Immediate Priorities

  1. Fix Evaluation Infrastructure (2-4 hours)

    • Update evaluate_dqn_main_orchestrator.rs to match Wave 16 DQN API
    • Fix type mismatches (125-dim → 225-dim features)
    • Add missing WorkingDQNConfig fields
    • Update method calls (load_from_safetensors, select_action)
  2. Run Full Backtest (5-10 minutes)

    • Load dqn_best_model.safetensors (epoch 61 checkpoint)
    • Evaluate on test_data/ES_FUT_180d.parquet
    • Generate comprehensive metrics report
    • Export action CSV for replay analysis
  3. Baseline Comparison (30 minutes)

    • Implement random agent baseline
    • Implement always-HOLD baseline
    • Calculate comparative Sharpe ratios
    • Validate Trial #2 outperformance

Medium Term

  1. Hyperopt Trial #3 (30-90 minutes)

    • Use Trial #2 as starting point (best so far)
    • Explore tighter parameter ranges around:
      • Learning Rate: 0.000100 - 0.000200
      • Batch Size: 80 - 120
      • Gamma: 0.95 - 0.99
      • Hold Penalty: 0.8 - 1.2
    • Target: <7,500 validation loss
  2. Production Deployment (conditional)

    • IF backtest Sharpe ≥ 1.5 AND Win Rate ≥ 55%:
      • Deploy to paper trading environment
      • Monitor for 1-2 weeks
      • Compare live vs backtest performance
    • ELSE:
      • Continue hyperopt campaign (Trials #3-5)
      • Investigate alternative reward functions
      • Consider ensemble with other models

Appendix A: Training Log Summary

File: /tmp/ml_training/wave16i_trial2_training/training.log

Key Excerpts:

Hyperparameters (from log header)

Learning Rate: 0.000156
Batch Size: 100
Gamma: 0.97
Buffer Size: 642,214
Hold Penalty: 1.0
Warmup Steps: 0

Data Statistics

Total Bars: 174,053
Training Samples: 139,202
Validation Samples: 34,801
Feature Dimensions: 225 (125 OHLCV features + 100 portfolio/context features)
Preprocessing: Log returns + windowed normalization (window=50) + outlier clipping (±5σ)

Final Training Summary

Duration: 673.97 seconds (11.2 minutes)
Final Train Loss: 304.61
Final Val Loss: 9,452.27
Best Val Loss: 8,017.93 (Epoch 61) ✅
Average Q-Value: -53.17

Action Distribution (Final)

BUY:   29.3% (40,832)
SELL:  33.1% (46,144)
HOLD:  37.5% (52,226)
Total: 139,202 training steps

Appendix B: Bug Fixes Applied

Trial #2 training incorporated all 8 critical bug fixes from Wave 16H/16I:

  1. Bug #1: Gradient clipping enabled (max_norm=10.0)
  2. Bug #2: Portfolio features populated via PortfolioTracker
  3. Bug #3: HOLD penalty weight corrected (0.0 → configurable)
  4. Bug #4: Close price extraction fixed (80% error reduction)
  5. Bug #5: Epsilon-greedy action selection implemented
  6. Bug #6: Epsilon-greedy disabled during evaluation
  7. Bug #7: Epsilon decay per-epoch (not per-step)
  8. Bug #8: Hyperopt parameters aligned with production

Impact: Training stability significantly improved vs pre-bugfix models.


Appendix C: Evaluation Infrastructure Status

Working Components

Training: Fully operational (147/147 tests passing)

Checkpoint Saving: SafeTensors format working

Data Loading: Parquet loader functional (174K bars)

Feature Extraction: 225-dim features computed correctly

Preprocessing: Wave 16E preprocessing validated

Broken Components

evaluate_dqn_main_orchestrator.rs: Compilation errors (type mismatches, missing methods)

evaluate_dqn.rs: Incomplete (TODOs for components 2-7)

⚠️ backtest_dqn_replay.rs: Compiled but requires CSV actions (not generated during training)

Fix Effort Estimate

2-4 hours to update evaluation scripts to Wave 16 DQN API

Tasks:

  1. Update WorkingDQNConfig initialization (add 5 missing fields)
  2. Fix device handling (new() no longer takes device argument)
  3. Update model loading (use load_from_safetensors() method)
  4. Fix action selection (use select_action() instead of select_action_greedy())
  5. Verify feature dimension consistency (125 vs 225)

Conclusion

TRIAL #2 MODEL EVALUATION - INCOMPLETE

Trial #2 training produced a promising model with 81.4% validation loss improvement and healthy action diversity, but production readiness cannot be confirmed without completing the backtest evaluation.

Immediate Action Required: Fix evaluation infrastructure (2-4 hours) and run full backtest to determine actual trading performance.

Conditional Recommendation:

  • IF Backtest Sharpe ≥ 1.5: DEPLOY to paper trading
  • ELSE: Continue hyperopt campaign (Trials #3-5)

Current Status: ⚠️ ON HOLD pending backtest execution


Report Generated: 2025-11-07 Training Completed: 2025-11-07 21:29:08 UTC Total Training Time: 11.2 minutes Checkpoint: ml/trained_models/dqn_best_model.safetensors (289KB)