Skip to main content

quantwave_core/regimes/
ensemble.rs

1//! Regime Ensemble and Voting
2//!
3//! Combine multiple regime detection models (e.g., HMM, Volatility Clustering, GMM)
4//! using weighted voting to increase the robustness of market state identification.
5
6use crate::regimes::MarketRegime;
7use serde::{Deserialize, Serialize};
8
9/// A weighted ensemble of market regimes.
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct RegimeEnsemble {
12    pub weights: Vec<f64>,
13}
14
15impl RegimeEnsemble {
16    pub fn new(weights: Vec<f64>) -> Self {
17        Self { weights }
18    }
19
20    /// Combines multiple regimes into a single consensus regime.
21    ///
22    /// # Arguments
23    /// * `regimes` - A slice of regimes from different models.
24    pub fn vote(&self, regimes: &[MarketRegime]) -> MarketRegime {
25        if regimes.is_empty() {
26            return MarketRegime::Steady;
27        }
28
29        let mut scores: std::collections::HashMap<MarketRegime, f64> =
30            std::collections::HashMap::new();
31
32        for (i, &regime) in regimes.iter().enumerate() {
33            let weight = self.weights.get(i).unwrap_or(&1.0);
34            *scores.entry(regime).or_insert(0.0) += weight;
35        }
36
37        // Find regime with highest total weight
38        scores
39            .into_iter()
40            .max_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal))
41            .map(|(regime, _)| regime)
42            .unwrap_or(MarketRegime::Steady)
43    }
44}