Methodology
Atlas is intentionally conservative in how it frames every output. The core design choice: probability ranges, never point estimates.
Scenario engine
The scenario engine uses a stationary block bootstrap. For each simulated path:
- Pick a random starting day from historical data.
- Take the next 21 days of multi-asset returns from there.
- Pick another random starting day; take the next 21 days.
- Repeat until the desired horizon is filled.
- Apply the portfolio weights to get per-step portfolio returns.
- Cumulate to get the full path.
This preserves both serial dependence (within a 21-day block) and contemporaneous correlation (across assets, since blocks span all assets jointly).
Probability bands
We compute quantiles at every step across all 10,000 paths and render three nested bands: 50%, 80%, 95%. The median is the solid line. There is always at least a 5% chance the actual outcome lies outside the 95% band — historical data is the only oracle the bootstrap has, and that oracle has blind spots (regime change, structural breaks, unprecedented events).
Stress scenarios
Stress scenarios are deterministic shocks layered on top of the distribution. They are not part of the probability density and are not interpreted as "the probability of a stress event." They are strictly hypothetical: "if X happened, what would my portfolio do."
Historical engine
- Log returns are the default (additive across time, symmetric).
- Annualization uses 252 trading days for daily, 52 for weekly, 12 for monthly.
- Sharpe / Sortino / Calmar all use annualized inputs.
- Max drawdown + recovery measured on the wealth path (exp of cumulative log return).
- Factor decomposition uses OLS regression against either real Fama-French factor returns (when fetched from Ken French's data library) or proxy ETFs (SPY/IWM/IWD/QUAL/USMV).
Regime classification
- 4-D features: growth (SPY 6m return), inflation (TIP-IEF spread), liquidity (USD index demeaned), sentiment (VIX demeaned). All z-scored.
- Classifier: KMeans (k=8 default) + Hidden Markov Model ensemble.
- Analog matching: cosine similarity over the feature vector, excluding recent dates from the candidate pool.
ML models
Every ML model returns a DistributionPrediction (samples + quantiles), never a point estimate.
- Random Forest: per-tree predictions sampled as the distribution.
- XGBoost / LightGBM: point + Gaussian residual approximation calibrated to training residual std.
- LSTM (Apple MLX): Bayesian dropout (Gal & Ghahramani 2016) — dropout remains active at inference, N forward passes form the distribution.
- PatchTST (Apple MLX): same Bayesian dropout treatment.
- PyMC Bayesian regression: posterior predictive sampling.
- Gaussian Process: native mean + std at every point.
Backtest
Every model is validated via expanding-window walk-forward
(scikit-learn TimeSeriesSplit). The runner emits an "accuracy string"
("Our RandomForest's 1-month scenario had 67% directional accuracy over
the past 3.4 years") that the UI displays verbatim alongside the model
output. A model decay detector flags models whose recent out-of-
sample hit rate falls more than 1 standard deviation below their trailing
average — those models go into the next monthly retrain queue.