diff --git a/adaptive-strategy/src/ensemble/mod.rs b/adaptive-strategy/src/ensemble/mod.rs index 5b11f961d..c31ce8a7a 100644 --- a/adaptive-strategy/src/ensemble/mod.rs +++ b/adaptive-strategy/src/ensemble/mod.rs @@ -731,6 +731,7 @@ mod tests { value: 0.5, confidence: 0.8, features_used: vec![], + metadata: None, }, actual_outcome: None, confidence: 0.8, diff --git a/adaptive-strategy/src/microstructure/mod.rs b/adaptive-strategy/src/microstructure/mod.rs index 6071ca133..7682df68d 100644 --- a/adaptive-strategy/src/microstructure/mod.rs +++ b/adaptive-strategy/src/microstructure/mod.rs @@ -1244,7 +1244,7 @@ impl TradeSignClassifier { #[cfg(test)] mod tests { use super::*; - use super::config::MicrostructureConfig; + use crate::config::MicrostructureConfig; #[test] fn test_microstructure_analyzer_creation() { diff --git a/adaptive-strategy/src/risk/ppo_integration_test.rs b/adaptive-strategy/src/risk/ppo_integration_test.rs index 79c625bbd..2c3143e1b 100644 --- a/adaptive-strategy/src/risk/ppo_integration_test.rs +++ b/adaptive-strategy/src/risk/ppo_integration_test.rs @@ -456,7 +456,7 @@ mod tests { /// Test PPO configuration validation #[test] fn test_ppo_config_validation() { - use super::ppo_position_sizer::PPOPositionSizerConfig; + use crate::risk::ppo_position_sizer::PPOPositionSizerConfig; let config = PPOPositionSizerConfig::default(); diff --git a/adaptive-strategy/src/risk/ppo_position_sizer.rs b/adaptive-strategy/src/risk/ppo_position_sizer.rs index 7cece0d58..dfdf00bd8 100644 --- a/adaptive-strategy/src/risk/ppo_position_sizer.rs +++ b/adaptive-strategy/src/risk/ppo_position_sizer.rs @@ -188,6 +188,28 @@ pub struct ContinuousTrajectory { } impl ContinuousTrajectory { + /// Create a new empty trajectory + pub fn new() -> Self { + Self { + states: Vec::new(), + actions: Vec::new(), + rewards: Vec::new(), + values: Vec::new(), + log_probs: Vec::new(), + dones: Vec::new(), + } + } + + /// Add a step to this trajectory + pub fn add_step(&mut self, step: ContinuousTrajectoryStep) { + self.states.push(step.state); + self.actions.push(step.action.value); + self.rewards.push(step.reward); + self.values.push(step.value); + self.log_probs.push(step.log_prob); + self.dones.push(step.done); + } + /// Get the number of steps in this trajectory /// /// Returns the length of the trajectory, which corresponds to the number @@ -200,6 +222,11 @@ impl ContinuousTrajectory { self.states.len() } + /// Check if the trajectory is empty + pub fn is_empty(&self) -> bool { + self.states.is_empty() + } + /// Get trajectory steps as iterator pub fn steps(&self) -> Vec { (0..self.len()) @@ -229,6 +256,11 @@ pub struct ContinuousAction { } impl ContinuousAction { + /// Create a new continuous action with the given value + pub fn new(value: f64) -> Self { + Self { value: value.clamp(0.0, 1.0) } + } + pub fn position_size(&self) -> f64 { self.value.clamp(0.0, 1.0) } @@ -253,6 +285,27 @@ pub struct ContinuousTrajectoryStep { pub done: bool, } +impl ContinuousTrajectoryStep { + /// Create a new trajectory step + pub fn new( + state: Vec, + action: ContinuousAction, + reward: f64, + value: f64, + log_prob: f64, + done: bool, + ) -> Self { + Self { + state, + action, + reward, + value, + log_prob, + done, + } + } +} + /// Batch of continuous trajectories for PPO training /// /// Contains multiple trajectories collected during policy rollouts @@ -1394,8 +1447,8 @@ mod tests { vec![0.1; 10], ContinuousAction::new(0.5), -1.0, - i as f32, - i as f32 * 0.5, + i as f64, + i as f64 * 0.5, false, )); buffer.add_trajectory(trajectory); diff --git a/adaptive-strategy/src/risk/tests.rs b/adaptive-strategy/src/risk/tests.rs index 315070efe..0895d1fa1 100644 --- a/adaptive-strategy/src/risk/tests.rs +++ b/adaptive-strategy/src/risk/tests.rs @@ -104,11 +104,11 @@ async fn test_market_regime_adjustments() { // Test different market regimes let regimes = vec![ - MarketRegime::BullLowVol, - MarketRegime::BullHighVol, - MarketRegime::BearLowVol, - MarketRegime::BearHighVol, + MarketRegime::Bull, + MarketRegime::HighVolatility, + MarketRegime::Bear, MarketRegime::Crisis, + MarketRegime::LowVolatility, ]; let historical_returns = vec![0.05, -0.02, 0.08, -0.03, 0.06]; @@ -135,9 +135,9 @@ async fn test_market_regime_adjustments() { // Crisis should have the most conservative sizing let crisis_rec = recommendations.iter().find(|(r, _, _)| matches!(r, MarketRegime::Crisis)).unwrap(); - let bull_low_vol_rec = recommendations.iter().find(|(r, _, _)| matches!(r, MarketRegime::BullLowVol)).unwrap(); - - assert!(crisis_rec.1 < bull_low_vol_rec.1, "Crisis regime should recommend smaller positions"); + let bull_rec = recommendations.iter().find(|(r, _, _)| matches!(r, MarketRegime::Bull)).unwrap(); + + assert!(crisis_rec.1 < bull_rec.1, "Crisis regime should recommend smaller positions"); } #[tokio::test] @@ -321,7 +321,7 @@ async fn test_market_regime_updates() { let mut sizer = KellyPositionSizer::new(config).unwrap(); let regimes = vec![ - MarketRegime::BullLowVol, + MarketRegime::Bull, MarketRegime::Crisis, MarketRegime::Sideways, ];