CHRONOS
Detect Regimes. Adapt Strategies. Preserve Capital
Created on 2nd February 2026
•
CHRONOS
Detect Regimes. Adapt Strategies. Preserve Capital
The problem CHRONOS solves
📊 Pitch Deck / PPT: https://docs.google.com/presentation/d/1UhT-gc1Vy55vGxnvnSx8zyUFcpVsHMz2/edit?usp=sharing&ouid=108309544140241004224&rtpof=true&sd=true
🧠 The Problem It Solves
Static portfolio models fail when markets change — CHRONOS fixes this.
Most retail investors rely on fixed 60/40 allocations or robo-advisors that treat bull markets and crashes the same way.
The result? 35% losses in March 2020 when correlations spiked to 1.0 and “diversified” portfolios collapsed together.
🚀 What CHRONOS Does Differently
Traditional Approach CHRONOS Solution
One model for all market conditions 3 specialized models, each trained exclusively on bull, neutral, or bear market data
Mean-variance optimization (1952) CVaR optimization — minimizes tail risk like hedge funds
Static “set it & forget it” allocation Dynamic regime detection — rotates defensive before crashes
Black-box AI SHAP interpretability — every decision is explainable
📈 Real-World Impact
Protects capital during market stress
2024 Rate Hike Selloff:
CHRONOS −0.62% vs SPY −1.46%
Captures upside in bull markets
14.25% total return in 2024
Democratizes institutional-grade risk management
Tools previously locked behind $1M+ minimums, now accessible to retail investors
👥 Who Uses This
Retail investors seeking hedge-fund style risk management
Financial advisors needing explainable AI for client portfolios
Researchers studying regime-switching financial markets
Challenges I ran into
🛠️ Challenges I Ran Into
⚠️ Challenge 1: Lookahead Bias (The Silent Killer)
The bug
Rolling features were created using:
rolling(window=20).mean()
without .shift(1), leaking future data into training.
How I fixed it
Enforced strict anti-leakage protocol — all features use .shift(1)
Added a validation layer in feature_engineering.py that raises a ValueError if leakage is detected
Used time-based splits only
(Train: 2019–2022 | Val: 2023 | Test: 2024)
⚠️ Challenge 2: HMM Convergence Instability
The bug
hmmlearn.GaussianHMM sometimes:
Collapsed into a single dominant regime
Failed to converge with default settings
How I fixed it
Implemented BIC-based state selection (tested 2–5 states)
Added convergence diagnostics (log-likelihood tracking)
Set random_state=42 and n_iter=1000 for stable convergence
⚠️ Challenge 3: CVaR Optimization Failure
The bug
PyPortfolioOpt.EfficientCVaR occasionally failed with
optimization infeasible due to tight regime constraints or ill-conditioned data.
How I fixed it
Added fallback heuristic allocations per regime:
Euphoria: 70 / 20 / 10 (SPY / TLT / GLD)
Complacency: 50 / 30 / 20
Capitulation: 10 / 60 / 30
Wrapped optimizer in try-except with logging
→ system degrades gracefully, never crashes
⚠️ Challenge 4: Real-Time Dashboard Performance
The bug
Streamlit app reloaded all models on every interaction → 8+ second lag.
How I fixed it
Used @st.cache_data for datasets
Used @st.cache_resource for models
Reduced HMM inference to <10ms via vectorization
Added lazy loading for SHAP plots (computed only when opened)
Tracks Applied (1)