Files
foxhunt/backtesting/tests/test_ml_integration.rs
jgrusewski 2e41b5ba09 SUCCESS: Fixed 70 test compilation errors across 4 packages
Wave 9 parallel agent deployment achieved successful compilation of:
market-data, ml_training_service, backtesting, and risk packages.

## Wave 9: Multi-Package Test Fixes (4 Parallel Agents)

**Agent 1 - market-data** (5 errors → 0)
- Added rust_decimal_macros dev-dependency
- Fixed BookSide vs OrderSide type confusion in tests
- Changed OrderSide to BookSide for order book operations

**Agent 2 - ml_training_service** (3 errors → 0)
- Added tempfile dev-dependency for TempDir in tests
- Fixed DatabaseConfig initialization: connect_timeout, query_timeout
- Fixed MLConfig field access: model_config.model_type

**Agent 3 - backtesting** (30 errors → 0)
- Added missing imports: Order, OrderSide, OrderStatus, Position, Price, Quantity
- Added rust_decimal_macros for dec! macro
- Added num_traits::ToPrimitive trait
- Fixed malformed match statements (lines 781-782, 880-881)
- Added RiskSettings and FeatureSettings to public exports
- Fixed Decimal type imports in test_ml_integration.rs

**Agent 4 - risk** (32 errors → 0)
- Removed non-existent common::basic and common::operations imports
- Added FromPrimitive trait imports for Decimal conversions
- Fixed Position struct initialization (added 9 missing fields)
- Fixed ComplianceConfig initialization (market_abuse_threshold, large_exposure_threshold)
- Fixed Order::new() calls (5 parameters instead of 4)
- Fixed KillSwitch.activate() calls (added user_id and cascade params)
- Changed log::error! to tracing::error!

## Summary

 market-data: COMPILES (0 errors)
 ml_training_service: COMPILES (0 errors)
 backtesting: COMPILES (0 errors)
 risk: COMPILES (0 errors)
 trading_engine: COMPILES (0 errors)
 trading_service: COMPILES (0 errors)

Remaining: ml package (162 errors), tli examples/tests

## Files Modified

- market-data/Cargo.toml
- market-data/tests/basic_test.rs
- services/ml_training_service/Cargo.toml
- services/ml_training_service/src/database.rs
- services/ml_training_service/src/main.rs
- backtesting/src/lib.rs
- backtesting/tests/test_ml_integration.rs
- risk/src/operations.rs
- risk/src/stress_tester.rs
- risk/src/var_calculator/historical_simulation.rs
- risk/src/var_calculator/monte_carlo.rs
- risk/src/compliance.rs
- risk/src/drawdown_monitor.rs
- risk/src/safety/emergency_response.rs
- risk/src/safety/safety_coordinator.rs
- risk/src/safety/position_limiter.rs
- risk/src/safety/trading_gate.rs
2025-09-30 13:29:13 +02:00

117 lines
4.0 KiB
Rust

//! Integration tests for ML models in backtesting framework
use backtesting::{
create_adaptive_strategy_with_config, AdaptiveStrategyConfig,
BacktestConfig, BacktestEngine, RiskSettings, FeatureSettings,
};
use rust_decimal::Decimal;
#[tokio::test]
async fn test_dqn_strategy_integration() {
// Create backtesting engine
let config = BacktestConfig {
initial_capital: Decimal::from(100000),
..Default::default()
};
let mut engine = BacktestEngine::new(config).await.unwrap();
// Set adaptive strategy with DQN model
let adaptive_config = AdaptiveStrategyConfig {
active_models: vec!["DQN".to_string()],
..AdaptiveStrategyConfig::default()
};
let dqn_strategy = Box::new(create_adaptive_strategy_with_config(adaptive_config));
engine.set_strategy(dqn_strategy).await.unwrap();
// Verify strategy is set
let state = engine.get_state().await;
assert!(!state.is_running);
// Note: Actual backtesting would require market data loading
// This test validates the integration is working
}
#[tokio::test]
async fn test_ppo_strategy_integration() {
let config = BacktestConfig::default();
let mut engine = BacktestEngine::new(config).await.unwrap();
// Set adaptive strategy with PPO model
let adaptive_config = AdaptiveStrategyConfig {
active_models: vec!["PPO".to_string()],
..AdaptiveStrategyConfig::default()
};
let ppo_strategy = Box::new(create_adaptive_strategy_with_config(adaptive_config));
engine.set_strategy(ppo_strategy).await.unwrap();
let state = engine.get_state().await;
assert!(!state.is_running);
}
#[tokio::test]
async fn test_tlob_strategy_integration() {
let config = BacktestConfig::default();
let mut engine = BacktestEngine::new(config).await.unwrap();
// Set adaptive strategy with TLOB model
let adaptive_config = AdaptiveStrategyConfig {
active_models: vec!["TLOB".to_string()],
..AdaptiveStrategyConfig::default()
};
let tlob_strategy = Box::new(create_adaptive_strategy_with_config(adaptive_config));
engine.set_strategy(tlob_strategy).await.unwrap();
let state = engine.get_state().await;
assert!(!state.is_running);
}
#[tokio::test]
async fn test_ensemble_strategy_integration() {
let config = BacktestConfig::default();
let mut engine = BacktestEngine::new(config).await.unwrap();
// Set adaptive strategy with multiple ML models (ensemble)
let adaptive_config = AdaptiveStrategyConfig {
active_models: vec!["DQN".to_string(), "PPO".to_string(), "TLOB".to_string()],
..AdaptiveStrategyConfig::default()
};
let ensemble_strategy = Box::new(create_adaptive_strategy_with_config(adaptive_config));
engine.set_strategy(ensemble_strategy).await.unwrap();
let state = engine.get_state().await;
assert!(!state.is_running);
assert_eq!(state.portfolio_value, Decimal::ZERO); // Not yet initialized
}
#[tokio::test]
async fn test_adaptive_strategy_configuration() {
// Create custom adaptive strategy configuration
let config = AdaptiveStrategyConfig {
active_models: vec!["DQN".to_string(), "PPO".to_string(), "TLOB".to_string()],
min_confidence: 0.7, // Higher confidence requirement
max_position_size: 0.05, // 5% position size
lookback_period: 20,
model_update_frequency: 100,
risk_settings: RiskSettings {
max_drawdown: 0.15, // 15% max drawdown
stop_loss: 0.05,
take_profit: 0.10,
kelly_fraction: 0.25,
},
feature_settings: FeatureSettings::default(),
};
let adaptive_strategy = create_adaptive_strategy_with_config(config.clone());
// Test as a Strategy trait object to verify it implements the trait
let strategy: Box<dyn backtesting::Strategy> = Box::new(adaptive_strategy);
// Verify strategy has a name (strategy trait method)
let strategy_name = strategy.name();
assert!(
!strategy_name.is_empty(),
"Strategy should have a non-empty name"
);
}