Skip to main content

quantwave_core/features/
regime.rs

1//! Basic regime feature helpers for ML pipelines.
2//!
3//! For MVP we provide simple converters from existing regime outputs
4//! (e.g. MarketRegime labels or probs) into feature-friendly vectors.
5//!
6//! This will be expanded when full regime probability outputs are exposed
7//! from the regimes module.
8//!
9//! Sources: regimes/mod.rs (MarketRegime enum), quantwave-4ub research notes.
10
11use crate::regimes::MarketRegime;
12
13/// Simple one-hot or embedding style features from a regime label.
14/// For richer work, use actual probability vectors from HMM/GMM etc.
15#[derive(Debug, Clone, Copy, PartialEq)]
16pub struct RegimeFeatures {
17    /// One-hot style (or embedded) vector. Length depends on regime set.
18    pub regime_vector: [f64; 5], // Bull, Bear, Crisis, Steady, Cluster placeholder
19    pub regime_label: MarketRegime,
20}
21
22pub fn regime_to_features(regime: MarketRegime) -> RegimeFeatures {
23    let mut vec = [0.0; 5];
24    let idx = match regime {
25        MarketRegime::Bull => 0,
26        MarketRegime::Bear => 1,
27        MarketRegime::Crisis => 2,
28        MarketRegime::Steady => 3,
29        MarketRegime::Cluster(c) => 4.min(c as usize),
30    };
31    if idx < 5 {
32        vec[idx] = 1.0;
33    }
34    RegimeFeatures {
35        regime_vector: vec,
36        regime_label: regime,
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_regime_to_features_bull() {
46        let f = regime_to_features(MarketRegime::Bull);
47        assert_eq!(f.regime_vector[0], 1.0);
48        assert_eq!(f.regime_label, MarketRegime::Bull);
49    }
50}