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
117 lines
4.0 KiB
Rust
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"
|
|
);
|
|
}
|