Technical Methodology Whitepaper

Atlas Dashboard
Trust the Math.

A rigorous mathematical framework for real-time macroeconomic risk monitoring

VersionMarch 2026
AuthorAtlas Dashboard
ABN30 782 536 570
JurisdictionMelbourne, Australia
DisclaimerNot financial advice
Abstract

Atlas Dashboard is a real-time macroeconomic risk monitoring platform that aggregates 22 economic indicators into a single composite score, evaluates nine macro scenarios using a Bayesian inference framework, and applies both to user-defined portfolio assessments. This document provides the complete mathematical specification of all three components: the indicator scoring system, the scenario probability engine, and the portfolio assessment pipeline. Every calculation described here is implemented deterministically in the production codebase. The framework is calibrated against nine verified historical stress periods spanning 1974 to 2020.

Contents

1. The Composite Risk Score
  1.1 Indicator Panel
  1.2 Scoring Function Architecture
  1.3 Era-Portable Relative Measures
  1.4 Composite Aggregation
  1.5 Risk Tier Classification
  1.6 Historical Calibration
2. The Scenario Probability Engine
  2.1 Scenario Definitions
  2.2 Signal Strength Calculation
  2.3 Weighted Average Strength
  2.4 Bayesian Update
  2.5 Correlation Adjustments
  2.6 Normalisation
  2.7 Probability Labels
3. Portfolio Assessment
  3.1 Inputs
  3.2 Assessment Pipeline
  3.3 Scope and Limitations
4. Data Sources and Update Schedule
5. Limitations and Future Work


1. The Composite Risk Score

The Atlas Composite Score is a scalar measure of broad macroeconomic stress, computed as the sum of individual risk scores across a panel of 22 economic indicators. The composite ranges from 0 to a theoretical maximum of 25, and maps continuously to one of six named risk tiers. The score is updated twice daily on weekdays — before market open (AM edition) and 90 minutes before the close (PM edition).

1.1 Indicator Panel

Indicators are divided into a macro panel capturing systemic and global signals, and a micro panel capturing market-level sentiment and leverage signals.

IndicatorIDSourceMax Score
Macro Panel
VIX Volatility IndexVIXyfinance ^VIX6.5 (capped)
EUR/USD Exchange RateEURUSDyfinance EURUSD=X~4.0
AUD/USD Exchange RateAUDUSDyfinance AUDUSD=X1.0
Gold Price YoY %GOLD_PRICEyfinance XAUUSD=X / GC=F1.0
WTI Crude Oil YoY %WTI_CRUDEyfinance CL=F2.0
Treasury Net LiquidityTREASURY_LIQUIDITYFRED WALCL − TGA − RRP2.0
US 3Y Treasury Yield3Y_YIELDFRED DGS31.0
US 10Y Treasury Yield10Y_YIELDFRED DGS101.5
US 30Y Treasury Yield30Y_YIELDFRED DGS301.0
High-Yield OAS (bps)HY_OASFRED BAMLH0A0HYM21.5
Fiscal Integrity ScoreFISCAL_RISKComposite (see §1.4)2.0
Bank CDS Proxy (AAA yield)BANK_CDSFRED AAA1.5
SNAP Benefits MomentumSNAP_BENEFITSFRED TRP6001A027NBEAHidden component
Geopolitical Risk ScoreGEOPOLITICALGPR Index + VIX + Gold + Oil2.0
Micro Panel
S&P 500 DrawdownSPX_INDEXyfinance ^GSPC2.5
ASX 200 DrawdownASX_200yfinance ^AXJO1.0
Margin Debt YoY %MARGIN_DEBT_YOYFRED BOGZ1FL663067003Q1.5
Small/Large Cap RatioSMALL_LARGE_RATIOyfinance ^RUT / ^GSPC1.5
Put/Call Ratio (SPY)PUT_CALL_RATIOyfinance SPY options chain1.0
SOFR/OIS Spread (bps)SOFR_OISFRED SOFR − TB3MS1.5
Credit Card Delinquency RateCREDIT_CARD_DELINQUENCIESFRED DRCCLACBS (×100 bps)1.5

1.2 Scoring Function Architecture

Each indicator is scored by a deterministic piecewise function that maps its current reading to a scalar risk contribution. All functions share a common regime structure: a Green regime (benign, low contribution), an Amber regime (elevated, watch signal), and a Red regime (stress confirmed). Functions are monotone within each regime and continuous at boundaries. The general form is:

score(v) = f(v) — piecewise linear over v Green: score ∈ [0.0, 0.5] — normal conditions Amber: score ∈ [0.5, 2.0] — stress building Red: score ∈ [2.0, max] — stress confirmed

A representative set of scoring functions is provided below. All functions are implemented in update_atlas.py and can be inspected in full.

VIX Index

Green (v < 15): score = (v / 15) × 0.5 Amber (15 ≤ v ≤ 25): score = 0.5 + ((v − 15) / 10) × 1.5 Red (v > 25): score = min(6.5, 2.0 + (v − 25) / 10) Cap at 6.5 prevents a single extreme VIX print (e.g. VIX=82 during COVID) from consuming ~31% of the composite scale. Cap is reached at VIX ≈ 70.

High-Yield OAS

Green (v < 400 bps): score = 0.0 Amber (400 ≤ v < 500): score = 0.75 Red (v ≥ 500 bps): score = 1.5

10Y Treasury Yield

Green (v < 4.50%): score = 0.0 Amber (4.50 ≤ v < 4.75%): score = 0.5 Red (v ≥ 4.75%): score = 1.5 ← Atlas pivot point

EUR/USD

Green (v ≥ 1.15): score = max(0, (1.25 − v) / 0.10 × 0.5) Amber (1.05 ≤ v < 1.15): score = 0.5 + ((1.15 − v) / 0.10) × 1.5 Red (v < 1.05): score = 2.0 + (1.05 − v) / 0.05 Logic: lower EUR/USD = stronger USD = tightening global dollar liquidity

1.3 Era-Portable Relative Measures

Three indicators use relative rather than absolute measures, ensuring scoring thresholds do not become stale as nominal price levels shift across market eras and Fed balance sheet regimes:

S&P 500 / ASX 200 — Drawdown from 52-week high: d = (high52w − current) / high52w × 100 Green (d < 10%): score = (d / 10) × 0.5 Amber (10 ≤ d < 20%): score = 0.5 + ((d − 10) / 10) × 1.0 Red (d ≥ 20%): score = min(2.5, 1.5 + (d − 20) / 20) Treasury Net Liquidity — % below 12-month rolling peak: p = (peak12m − current) / peak12m × 100 Green (p < 8%): score = 0.0 Amber (8 ≤ p < 15%): score = 1.0 + ((p − 8) / 7) × 1.0 Red (p > 15%): score = 2.0 WTI Crude Oil — YoY % change: y = (spot − prior_year) / prior_year × 100 Green (y > −15%): score = 0.0 (demand stable) Amber (−30 < y ≤ −15%): score = 0.5 + ((−15 − y) / 15) × 1.5 Red (y ≤ −30%): score = 2.0 (demand destruction)

Rationale: the old absolute WTI thresholds ($55/$65/$75) scored 2017's low-price supply-glut environment as a crisis (Red, 2.85) while correctly scoring 2022's high-price demand regime as benign (Green, 0.0). The YoY measure correctly identifies the demand destruction signal in both eras.

1.4 Composite Aggregation

Two indicators — FISCAL_RISK and GEOPOLITICAL — are composite sub-scores calculated from other indicators rather than fetched directly. They are computed after the primary scoring loop and added to the composite.

Fiscal Integrity Score: computed from 30Y yield stress, Treasury liquidity drain, yield curve inversion (10Y−3Y), and SNAP benefits momentum. Each component deducts up to 25 points from a perfect integrity score of 100. The atlas contribution weight scales inversely with integrity:

risk_deductions = Σ deductioncomponent ∈ [0, 100] integrity_score = max(0, 100 − risk_deductions) atlas_weight = (100 − integrity_score) / 50 ∈ [0, 2] Integrity ≥ 70: Green | 50–69: Amber | < 50: Red

Geopolitical Risk Score: weighted composite of the Caldara-Iacoviello GPR Index, VIX level, Gold YoY momentum, and WTI oil price. A divergence multiplier (1.0×–1.5×) is applied when GPR is elevated but VIX is suppressed — a tail risk underpricing signal.

raw_score = GPR_score + VIX_score + Gold_score + Oil_score ∈ [0, 100] final_score = min(100, raw_score × divergence_multiplier) atlas_weight = final_score / 50 ∈ [0, 2]

The composite is then:

Composite Score = Σ scorei for i = 1 … 22 Score ∈ [0, 25] (theoretical maximum)

1.5 Risk Tier Classification

TierScore RangeDescription
⛵ CALM (LOW RISK)0 – 5Benign macro environment. Base case stability.
🌤 BUILDING (MODERATE RISK)5 – 8Risk signals emerging. Monitor closely.
⚠ CHOPPY (ELEVATED RISK)8 – 12Elevated stress. Caution warranted. Mixed signals.
🌊 STORM WARNING (HIGH RISK)12 – 16High risk environment. Defensive positioning recommended.
⛈ FULL-STORM (SEVERE RISK)16 – 20Severe systemic stress. Full risk-off mode.
🌀 HURRICANE (EXTREME RISK)20 – 25Extreme systemic crisis. Maximum defensive posture.

1.6 Historical Calibration

Tier boundaries were calibrated by running actual FRED and yfinance data for nine historical stress periods through the live scoring functions at each event's peak stress date. Scores reflect what the framework would have produced in real time — not retroactive narrative assignment.

EventPeak DateScoreTier
2017 Low-Volatility Baseline14 Jul 20172.6CALM
2019 Mid-Cycle Recovery22 Feb 20194.8CALM
2018 Q4 Rate Hike Selloff24 Dec 201811.8CHOPPY
2022 Inflation Shock Peak13 Oct 202211.9CHOPPY
2011 European Debt Crisis8 Aug 201111.7CHOPPY
2002 Dot-com / 9-11 Trough9 Oct 200211.8CHOPPY
COVID-19 Collapse16 Mar 202016.9FULL-STORM
Global Financial Crisis10 Oct 200816.3FULL-STORM
OPEC Oil Embargo / Stagflation3 Oct 19746.8*BUILDING*

* 1974 calibration is partial. VIX, HY OAS, EUR/USD, SOFR, and delinquency data are unavailable pre-1991. Score reflects only indicators with historical data coverage. True composite would be materially higher.

Note on GFC and COVID scores

The GFC (16.3, FULL-STORM) scores lower than many expect because Atlas measures broad macro stress — not narrative severity. On 10 October 2008, EUR/USD was 1.34 (USD demand spike, not weakness), WTI was $78/bbl YoY flat, and gold was +13.9% YoY — none crossing their stress thresholds. The crisis was acute in credit and funding markets, accurately reflected in VIX (6.49), HY OAS (1.5), SOFR/TED (1.5), and delinquencies (1.5). COVID (16.9) scores higher because the macro dislocation was genuinely broader: WTI collapsed −51% YoY, AUD/USD hit 0.618, and SPX drawdown was 30%.


2. The Scenario Probability Engine

The scenario engine evaluates nine macro scenarios simultaneously and computes a probability distribution across them. Rather than classifying the market into a single scenario, it quantifies the relative evidence for each — producing a ranked distribution that sums to 100%.

2.1 Scenario Definitions

Each scenario is defined by a name, description, type (defensive or constructive), a set of 6–8 indicator signals, and associated asset class guidance. The nine scenarios are:

ScenarioTypeSignalsKey indicators
USD Repricing / DebasementDefensive8Treasury Liquidity, DXY, 30Y, Gold
StagflationDefensive8Gold, WTI, 10Y, Delinquencies, HY OAS
Hard Landing / Credit CrisisDefensive8HY OAS, Bank CDS, VIX, Delinquencies
Classic RecessionDefensive8Delinquencies, Small/Large, VIX, HY OAS
Liquidity CrisisDefensive7SOFR/OIS, Treasury Liquidity, VIX, HY OAS
Geopolitical ShockDefensive8Geopolitical, WTI, Gold, VIX, AUD/USD
Deflation ScareDefensive810Y, 30Y, WTI, Gold (low), HY OAS
Soft LandingConstructive8VIX (low), HY OAS (tight), SPX above 200MA
Bull Run / Melt-UpConstructive8VIX (low), Put/Call, Margin Debt, SPX YTD

2.2 Signal Strength Calculation

For each signal in a scenario, a continuous strength score s ∈ [−1, +1] is calculated. The strength reflects not just whether a threshold is crossed, but how extreme the reading is relative to its historical distribution. This is the key difference from a binary signal model.

Step 1: Calculate percentile rank of v within historical distribution percentile = rank(v, distributionindicator) ∈ [0, 100] Step 2: Map to strength score If signal condition is MET (v confirms scenario thesis): percentile ≥ 95 → strength = +1.00 (extreme historical reading) percentile ≥ 90 → strength = +0.85 percentile ≥ 75 → strength = +0.65 percentile ≥ 50 → strength = +0.40 else → strength = +0.25 (threshold met, not extreme) If signal condition is NOT MET (v contradicts scenario thesis): percentile ≤ 10 → strength = −0.80 (strongly contradicts) percentile ≤ 25 → strength = −0.50 percentile ≤ 50 → strength = −0.25 else → strength = −0.10 (weakly contradicts)

The graduated status labels displayed on the Actions page correspond to strength ranges:

strength ≥ +0.7 → ✓✓ Strongly Confirms strength ≥ +0.3 → ✓ Confirms strength ≥ +0.1 → ✓ Marginally Confirms |strength| < 0.1 → ~ Near Threshold strength ≤ −0.1 → ✗ Marginally Contradicts strength ≤ −0.3 → ✗ Contradicts strength ≤ −0.7 → ✗✗ Strongly Contradicts

2.3 Weighted Average Signal Strength

Each signal carries a weight reflecting its diagnostic importance for that scenario. The weighted average is computed across all signals in the scenario:

avg_strength = Σ (strengthi × weighti) / Σ weighti Typical weights: critical signals = 1.5, primary = 1.2, supporting = 1.0, confirming = 0.5–0.8 avg_strength ∈ [−1, +1]

2.4 Bayesian Update

The average signal strength modulates a base rate prior via an exponential multiplier. The multiplier uses base 4, calibrated so that a perfectly confirming scenario (+1.0) quadruples the prior, while a perfectly contradicted scenario (−1.0) reduces it to one quarter.

multiplier = 4 ^ avg_strength avg_strength = −1.0 → multiplier = 0.25 (prior quartered) avg_strength = 0.0 → multiplier = 1.00 (prior unchanged) avg_strength = +0.5 → multiplier = 2.00 (prior doubled) avg_strength = +1.0 → multiplier = 4.00 (prior quadrupled) raw_probability = base_rate × multiplier × 100 raw_probability = clamp(raw_probability, 0.5, 95) — floor and ceiling

The base rate is currently 10% (flat across all scenarios). This reflects the prior probability of any given scenario being dominant in the absence of evidence. As the historical observation dataset accumulates to 90+ entries, empirically-derived per-scenario base rates will be substituted.

2.5 Correlation Adjustments

Correlated scenarios share indicators. Without adjustment, shared indicators would contribute to multiple scenario scores simultaneously — inflating correlated pairs at the expense of independent scenarios. A two-pass adjustment is applied before normalisation:

Pass 1 — Snapshot raw scores for all scenarios raw_snapshot = {scenario_key: raw_probability} Pass 2 — Apply pairwise correlation adjustments for each (scenario_A, scenario_B) in correlated_pairs: if correlation < 0 and probB > 20%: B's high probability should dampen A (mutually exclusive) dampening = 1 + (correlation × 0.5 × probB / 100) adjustment_factor × = max(0.5, dampening) if correlation > 0 and probB > 30%: B's high probability corroborates A (co-occur) boost = 1 + (correlation × 0.15 × probB / 100) adjustment_factor × = min(1.3, boost) adjusted_scoreA = raw_scoreA × adjustment_factor

2.6 Normalisation

After correlation adjustment, all nine scenario scores are normalised so they sum to exactly 100%, preserving relative ordering.

probabilityi = (adjusted_scorei / Σ adjusted_scores) × 100 Σ probabilityi = 100% for i = 1 … 9

2.7 Probability Labels and Actionability Threshold

Probabilities are mapped to five qualitative labels. The 10% MODERATE threshold is the actionability boundary — the point at which a scenario warrants consideration in portfolio positioning. The probability bars on the Actions page use a logarithmic scale that visually emphasises this threshold.

LabelRangeInterpretation
UNLIKELY< 5%Data actively contradicts scenario. Can be deprioritised.
LOW5 – 10%Weak signal. Monitor but no action implied.
MODERATE10 – 20%Actionability threshold. Scenario has material evidence.
ELEVATED20 – 35%Strong signal. Portfolio implications should be considered.
HIGH≥ 35%Dominant scenario. Evidence is overwhelming.

3. Portfolio Assessment

The Portfolio Assessment tool applies the quantitative outputs of Sections 1 and 2 to a user-defined portfolio, generating a structured macro thesis. The assessment is grounded in live indicator data and current scenario probabilities — not in generic financial commentary.

3.1 Inputs

Portfolio = { holdings: [{ticker, allocation_%}], sum of allocations = 100% capital: numeric ($AUD or $USD), time_horizon: 1yr | 2yr | 5yr | 10yr, markets: subset of {us, aus, global, commodities, crypto} } Atlas context = { composite_score: current score ∈ [0, 25], regime: current tier label, top_scenarios: scenario_probability_distribution (all 9), key_indicators: current indicator readings and statuses }

3.2 Assessment Pipeline

The portfolio and Atlas context are passed to a structured inference chain (Google Gemini 2.5 Flash) with a schema-enforced output format. The AI is not used to retrieve data or predict markets. It is used as a structured reasoning engine — mapping quantitative regime signals to portfolio-level implications.

The chain produces three outputs:

1. Macro Thesis — A narrative characterisation of the portfolio's positioning relative to the current Atlas regime and the dominant scenario evidence. This is derived from the composite score, tier, and scenario probability distribution.

2. Scenario Stress-Map — For each holding, a structured analysis of its expected behaviour under the top-probability scenarios. This draws on the asset class guidance embedded in each scenario definition (e.g. "Gold: Primary currency hedge → Preserves purchasing power as USD devalues").

3. Verdict — An overall portfolio rating against the macro environment. How well does the current allocation align with the scenarios that current data most strongly supports?

3.3 Scope and Limitations

Important

The Portfolio Assessment is an analytical framing tool, not a financial recommendation system. It does not incorporate individual tax circumstances, liquidity constraints, liability matching, or specific investment objectives. It applies macro-level scenario logic — derived from public data — to portfolio-level composition. All outputs should be interpreted as context for informed decision-making, not as advice to buy, hold, or sell any security.


4. Data Sources and Update Schedule

SourceDataFrequency
FRED (Federal Reserve)Yields, OAS, delinquencies, liquidity, SNAPDaily / Weekly / Quarterly
yfinanceVIX, FX, equity indices, gold, WTI, optionsDaily
GPR Index (Caldara & Iacoviello)Geopolitical risk indexWeekly (manual upload)
Google Custom Search API50 financial news domains for AI contextPer pipeline run
Google Gemini 2.5 FlashAI commentary, scenario analysis, portfolio assessmentPer pipeline run

The pipeline runs twice daily on US weekdays: at 6:00 AM ET (AM edition, pre-market) and 3:00 PM ET (PM edition, 90 minutes before close). Each run publishes a new composite score, scenario probability distribution, and AI commentary. Runs are orchestrated via GitHub Actions with OIDC authentication to AWS.


5. Limitations and Future Work

Base rate priors. Scenario probabilities currently use a flat 10% prior for all scenarios. The historical observation system is accumulating daily snapshots; once 90+ observations are recorded, empirically-derived per-scenario base rates will replace the flat prior, making the engine genuinely Bayesian.

Indicator availability constraints. Several indicators have limited historical coverage (HY OAS from 1996, SOFR from 2018, VIX from 1990, RUT from 1979). Pre-1990 calibration is therefore partial. The TEDRATE (TED spread) proxy is used for pre-2018 funding stress assessment.

Correlation matrix. The current scenario correlation structure is expert-specified rather than empirically derived. Once the historical observation dataset is sufficiently large, correlation coefficients will be estimated from observed scenario co-occurrence frequencies.

Earnings revision indicator. The EARNINGS_REVISION indicator is currently unimplemented (marked N/A). A systematic earnings revision momentum signal based on consensus estimate revisions is planned for a future release.

Outcome labelling. Historical observations are captured at T+0 but outcome labels (what actually happened at T+4, T+8, T+12 weeks) are not yet populated. Retroactive labelling is scheduled for Q3 2026, enabling formal backtesting of the scenario probability model.