← valtivra.org · Dashboard

Economic Risk Engine — Methodology Specification

Version 1.0 — FROZEN 2026-09-04. Supersedes research builds V22–V29.4. Prepared 2026-09-04 from the V29 research audits in data/report/. Any change to Sections 1–8 requires a new, explicitly designated research version; V30 and later product versions implement this specification without altering it.


0. Summary

The product publishes a U.S. Recession Risk Score (0–100) with a regime label (Low / Elevated / High) produced by a ridge-regularised logistic model on eight macro-financial indicators, validated point-in-time against data as it was first published. It separately publishes a Market Stress / Drawdown Monitor built from observable market conditions, which makes no forecast. The product distinguishes three outputs that must never be conflated:

Output What it is Status
Recession Risk Score (0–100) and regime the model's relative risk assessment: percentile of today's model output against its own out-of-sample history primary, validated for ranking (Section 6)
12-month calibrated probability a statistical estimate produced by the calibration policy secondary, labelled not validated (Section 8)
Historical recession frequency by regime a descriptive statistic: how often a recession followed within 12 months when the score was in this regime, 1998–2025 descriptive only; not a probability of anything (Section 7)

Customer interface, fixed order:

RECESSION RISK
72 / 100      ELEVATED      Trend: Rising
12-month calibrated probability: XX %   (not validated — see methodology)
Historical recession frequency in this regime: 22.6 %

No recession probability is published as a headline number, because no probability construction tested passed point-in-time validation (Section 8).

Headline validation figure: point-in-time AUROC 0.82 (95% block-bootstrap interval 0.67–0.94) over 332 out-of-sample months, December 1997 – August 2025, covering the 2001, 2008 and 2020 recessions. The revised-data figure (0.92) is reported only as a measure of the cost of data revisions and is never used as a headline.


1. Target definition

Event. A U.S. recession as dated by the NBER Business Cycle Dating Committee, taken from FRED series USREC (1 = month in recession).

Label. For forecast-origin month t, Y12(t) = 1 if any month t+1 … t+12 is a recession month; 0 if all twelve future months are known and none is a recession month; undefined otherwise. A month whose 12-month window has not yet closed is therefore never scored as a "correct negative". Consequence: the validation record ends 12 months before the most recent data.

Horizon. 12 months, fixed. Rationale: it is the horizon at which the yield curve's documented lead over recessions is strongest, it matches the annual planning cycle of most institutional users, and it is the longest horizon at which the training sample retains enough positive months to fit.

Recessions in the point-in-time validation window. Apr 2001–Nov 2001 (run-up only partly inside the window), Jan 2008–Jun 2009, Mar 2020–Apr 2020. Three events. Every performance claim in this document is conditional on that sample size and says so where it appears.

2. Data sources

Series Source Role Revised after release? Vintage treatment
USREC NBER via FRED target only, never a predictor dating decisions are made with a lag realised label; not vintaged
UNRATE BLS via FRED/ALFRED predictor yes exact ALFRED vintages
PAYEMS BLS via FRED/ALFRED predictor yes exact ALFRED vintages
INDPRO Federal Reserve via FRED/ALFRED predictor yes exact ALFRED vintages
HOUST Census via FRED/ALFRED predictor yes exact ALFRED vintages
UMCSENT U. Michigan via FRED predictor preliminary→final within month; later revisions not verified treated as unrevised (unverified)
DGS10, TB3MS Treasury via FRED predictor (term spread) believed not revised; not independently verified treated as unrevised (unverified)
S&P 500 Shiller monthly (datahub.io copy) spliced with FRED SP500 (last 10 years) predictor (12-month momentum); drawdown monitor price history; not independently verified treated as unrevised (unverified)
NASDAQCOM FRED drawdown monitor only price history; not independently verified treated as unrevised (unverified)
EBP (excess bond premium) Federal Reserve Board excluded from the certified model (Section 4); shown in the Stress Monitor re-estimated historically no vintages exist → cannot be validated point-in-time; excluded from the vintage-clean core audit (recorded in alfred_audit_summary.json)

Licensing status (must be resolved before commercial launch). FRED terms restrict commercial redistribution and require attribution; underlying series carry their owners' terms (BLS, Census, Federal Reserve data are U.S. Government works; UMCSENT is University of Michigan proprietary; S&P 500 index levels are S&P Dow Jones Indices intellectual property, and the Shiller copy is a research dataset). The product displays derived scores and regimes, not redistributed series; a licensing matrix confirming this is acceptable for each source is a V30 deliverable, and a licensed market-data feed replaces the Shiller/FRED splice in production.

Vintage treatment wording. "Exact ALFRED vintages" means the value as published on the forecast date, retrieved from the FRED/ALFRED API. "Treated as unrevised (unverified)" means the series is taken from current data on the assumption that it is not revised after release; that assumption has not yet been independently documented and is listed as an open verification item. No series in this specification is described as "verified unrevised".

3. Point-in-time methodology

  1. For each forecast origin t (month-end), the four revised predictors are taken from FRED API vintage matrices (series/observations, output_type=2, vintage_dates = month-end of t), i.e. the series exactly as published on that date. Unrevised series and market prices are taken from current data.
  2. Features (Section 4) are computed from that information set only; the most recent observation may be for month t−1 or t−2 because of publication lag — the model uses whatever was available, never the later print.
  3. Label embargo. The model used at origin t is trained only on origins s ≤ t − 12 whose label was known by t. No training row can contain an outcome that had not yet occurred.
  4. Minimum sample. No forecast is issued until 120 labelled training months exist.
  5. Every month's model is refit from scratch on its own embargoed history (expanding window). The out-of-sample record is the sequence of these one-step-ahead outputs.
  6. All post-processing (Risk Score percentile, any calibration) is applied with the same rule: the transform used at t is estimated only from out-of-sample outputs dated ≤ t − 12.

The standard track (same procedure on today's revised data, from 1987) is computed alongside solely to quantify the cost of revisions. It is not a product metric.

4. Feature set (frozen)

Feature Definition Why it is in
TERM DGS10 − TB3MS (month-end) yield-curve slope; the dominant recession signal
TERM_change 6-month change in TERM curve steepening/flattening dynamics
UNRATE_12m_change 12-month change in unemployment rate (pp) labour-market turn (Sahm-type signal)
PAYEMS_12m 12-month % change in nonfarm payrolls employment momentum (note: positive coefficient — see §10)
INDPRO_12m 12-month % change in industrial production real-activity momentum
HOUST_12m 12-month % change in housing starts most cyclical sector; leads
UMCSENT_12m 12-month % change in consumer sentiment household expectations
SP500_12m 12-month % change in S&P 500 market's own forward view

Excluded and why. EBP / credit spreads: no vintages, so cannot be certified; also shown in the Model Selection Lab to reduce early warning (2008: 6 of 12 run-up months in High vs 12; 2020: 0) while raising overall AUROC — it confirms recessions late rather than anticipating them. Re-test if vintaged credit data become available. Valuation (CAPE, earnings yield), volatility, drawdown state: tested for the bear-market target only (Section 12); not tested as recession predictors in V29 and not to be added without a designated research version.

5. Model (frozen)

Logistic regression, L2 (ridge) penalty, C = 0.1, class weights balanced, features standardised on the training window, max_iter 5000. Selected by the V29.4 Model Selection Lab against a rule stated before the run (Section 11). The unregularised logistic (C = 1) is the documented incumbent; the logistic + gradient-boosting ensemble is the documented runner-up.

Coefficient signs are reported with the model and must be shown in any "why is risk elevated" explanation as contribution to risk, not translated into economic adjectives (Section 10, "payroll sign").

6. Risk Score calculation

Score(t) = percentile rank of the month's raw model output among all prior out-of-sample outputs dated ≤ t − 12, × 100. Minimum 40 prior outputs before a score is issued. The score is therefore a monotone transform of the model output, ranks exactly as well as the model, and needs no probability interpretation. It is recomputed every month; historical scores are never revised once issued.

7. Regime thresholds (frozen)

Regime Score Historical recession frequency by risk regime (L2 model, point-in-time, Dec 1997–Aug 2025)
Low < 60 0.6 % (159 months)
Elevated 60 – 84.99 22.6 % (53 months)
High ≥ 85 41.4 % (69 months)

Thresholds were fixed at the 60th and 85th percentiles before the Model Selection Lab was run and were not tuned to it.

These frequencies are descriptive historical statistics, not probabilities. They record how often a recession followed within 12 months when the score was in each regime over one 28-year sample containing three recessions. They are to be labelled in the product exactly as "Historical recession frequency by risk regime" and must not be described as probabilities, likelihoods or forecasts until the calibration gate in Section 8 has been passed. The Low regime is the strongest descriptive statement the product makes. Elevated and High differ meaningfully under the L2 model (+19 points); they did not under the unregularised incumbent (+3 points), which is the primary reason for the change of model.

Trend. 3-month change in Score: Rising ≥ +5 points; Stable between −5 and +5; Falling ≤ −5. Presentation logic only; it carries no statistical claim.

8. Calibration policy

No probability is published as a headline. Tested constructions, all strictly walk-forward (V29.1 §B, V29.2): raw output, Platt scaling, Platt shrunk toward the base rate with a fixed factor (0.25 / 0.5 / 0.75), Platt shrunk with a nested, monthly re-estimated factor, and decile-binned empirical frequency. On the point-in-time track none achieves positive Brier skill across periods; the one construction that appeared to (fixed factor 0.5, skill +0.05) was shown by the nested procedure to be a hindsight choice (nested skill −0.09; the nested factor sat at 1.0 — "no shrinkage" — from 2010 to 2020). All constructions have strongly positive skill 2007–2016 and strongly negative skill 2017–2026.

Policy. The Score is the primary output; the probability is a secondary, distinct object and is never derived from, or used to describe, the regime frequencies in Section 7. A probability may be shown in a secondary position only as "walk-forward Platt, nested shrink", explicitly labelled not validated to beat the base rate under point-in-time data, and never as a headline, alert trigger or API default. The validation gate for promoting a probability to headline status: positive point-in-time Brier skill in every 10-year sub-period and calibration slope within 0.8–1.25 and no reliability bin off by more than 10 points. This gate is re-evaluated only when a new recession has fully entered the record.

9. Validation methodology

Scripts in the repository, each reproducible from cached data without network access:

Question Script Output
Ranking, thresholds, per-recession lead, periods, standard-vs-PIT gap recession_performance_report.py report/recession_performance_report.md
Ranking robustness (LORO, rolling windows), calibration constructions, warning usefulness, Risk Score regimes, 2017–26 diagnosis recession_robustness_audit.py report/recession_robustness_audit.md
Nested shrinkage test shrinkage_audit.py report/shrinkage_audit.md
Model comparison model_selection_lab.py report/model_selection_lab.md
Bear-market target and features bear_target_audit.py, bear_feature_audit.py data/bear_*_audit.md

Statistical conventions: AUROC intervals by 12-month block bootstrap (1,000 draws); Brier skill = 1 − Brier/Brier(base rate); calibration slope/intercept by logistic regression of outcome on logit(forecast); false-warning episodes = consecutive months in High outside recession with no recession in the following 12 months.

10. Known limitations (to be disclosed in the product)

The TRUE ALFRED validation window contains only three recession cycles available for evaluation (2001, 2008, 2020), and the point-in-time lead-time analysis covers those cycles only as far as the available window allows (the 2001 run-up lies partly outside it). Performance estimates therefore carry substantial uncertainty; the AUROC interval of 0.67–0.94 reflects it. No claim of consistent lead time is supportable.

  1. Sample size — as stated above; repeated in every performance table.
  2. 2022–2024 false alarm. The score was in High for 24 months (L2) between mid-2022 and 2024 with no recession following. Cause, measured: the inverted yield curve contributed ≈ +5.9 log-odds over the period; no other feature came close. Removing the curve destroys the model (AUROC 0.82 → 0.67), so the false alarm is the price of the signal that gave 12 months' warning on 2008.
  3. 2005–2006 false alarm. 10 months in High two years before the 2008 recession began — early rather than wrong, but a user acting on it would have waited two years.
  4. 2020. The pandemic recession was flagged Elevated (10 of 12 run-up months) but reached High in only 1 run-up month (lead 7). The model did not "predict" COVID; it read late-2019 weakness.
  5. Recent-period ranking. Point-in-time AUROC for 2017–2026 is ≈ 0.45–0.50 for all logistic variants, driven by item 2. Rolling 10-year AUROC fell from 0.91 (window ending 2020) to 0.62 (2024).
  6. Probabilities are not validated (Section 8).
  7. Payroll sign. PAYEMS_12m carries a positive coefficient: strong hiring raises modelled risk (late-cycle effect, collinear with the unemployment change). Explanations must therefore describe each feature's contribution to the score, with its actual reading alongside, and must not render coefficients as adjectives ("labour deteriorating").
  8. Cost of revisions. Same window, same target: AUROC 0.92 on revised data vs 0.82 point-in-time. Roughly a tenth of apparent skill in a conventional backtest comes from knowing revised values. The product reports the lower number.
  9. Publication lag. Features use the latest available print; the "information month" for the revised series is typically one month behind the origin.
  10. Data provenance. EBP excluded for lack of vintages; S&P history from a research copy of Shiller's data pending a licensed feed.

11. Model-selection results (V29.4, point-in-time harness, 464 origins, 332 scored)

Model AUROC 95 % CI 2017–26 worst LORO Elevated → High recession rate false High months (2005–06 / 2022–24) 2008 run-up in High 2020 run-up in High
logistic C=1 (incumbent) 0.816 0.68–0.93 0.49 0.75 32 % → 35 % 44 (11 / 27) 12/12 1/12
logistic L2 C=0.1 (selected) 0.823 0.67–0.94 0.44 0.74 23 % → 41 % 40 (10 / 24) 12/12 1/12
logistic L1 C=0.5 0.821 0.69–0.93 0.49 0.77 39 % → 29 % 38 10/12 0/12
logistic + curve×labour interactions 0.815 0.68–0.93 0.48 0.75 31 % → 36 % 45 12/12 2/12
random forest 0.751 0.59–0.89 0.53 0.69 32 % → 31 % 49 10/12 6/12
gradient boosting 0.754 0.61–0.88 0.57 0.74 22 % → 34 % 38 6/12 9/12
ensemble (logit + GBM) 0.805 0.67–0.92 0.55 0.78 33 % → 36 % 42 11/12 8/12
term spread only (benchmark) 0.701 0.50–0.88 0.63 0.67 15 % → 35 % 32 11/12 5/12
logistic + EBP (not vintage) 0.882 0.77–0.97 0.50 0.84 26 % → 48 % 25 (0 / 22) 6/12 0/12

Pre-stated decision rule. Replace the incumbent only if a candidate (a) keeps AUROC inside the incumbent's interval, (b) keeps ≥ 8 of 12 run-up months in High for 2008 and 2020, and (c) improves High-vs-Elevated separation or cuts 2022–24 false-High months without buying (c) by losing (b). No candidate satisfies (b) for 2020 except the ensemble, which fails (c). Among candidates that match the incumbent on (b), L2 is the only one that improves (c) on both counts; it is adopted. Tree models are inferior on ranking under vintage data. The EBP variant is recorded for future re-test only.

12. Bear-market / drawdown methodology

Finding (V29 steps 1–2, 135 point-in-time configurations). No definition of a forward bear-market target — S&P 500 or NASDAQ; 15/20/25 % decline; 12/18/24-month horizon; measured from the all-time high, the trailing 12-month high, or as a new peak-to-trough onset — is predictable from macro features (all 54 configurations: negative Brier skill; AUROC 0.41–0.64). Market-native features (momentum, drawdown, volatility, curve, EBP) raise AUROC only for "still-below-a-prior-high" definitions, via the current drawdown itself, and do nothing for onset definitions (AUROC ≤ 0.57). Valuation features are pending one run; see the research-candidate note below.

Product consequence. The market component is a Market Stress / Drawdown Monitor — a descriptive composite, not a forecast — built from: current S&P 500 drawdown from its all-time high and from its 12-month high; 12-month realised volatility (monthly) and 3-month realised volatility (daily NASDAQ proxy until a licensed daily S&P feed exists); 12-month momentum and distance from the 10-month moving average; EBP level and 6-month change (credit stress, displayed, not modelled); and the Recession Risk Score as the one forward-looking input. Each input is expressed as a percentile of its own history and averaged with equal weights into a 0–100 Stress score with the same Low/Elevated/High bands. The Drawdown Monitor is an analytical composite, not a statistically validated probability or forecast of future market declines. It carries that sentence verbatim wherever it is displayed, together with: "Describes current market conditions. No tested model forecast market declines reliably under point-in-time validation."

Valuation features (CAPE, earnings yield vs 10-year, dividend yield, real 10-year yield, inflation): research candidate — not included in the production composite. The pending valuation run (RUN_FEATURE_AUDIT.bat) cannot change this specification. If it shows positive onset-definition Brier skill across periods, that result triggers a designated research version and a new audit under the change-control clause; nothing changes silently.

Frozen negative result. "Probability of a bear market" is not published in any form.

13. What the product can and cannot claim

Can claim

Must disclose alongside any of the above

Cannot claim


Change control

🔒 METHODOLOGY SPECIFICATION V1.0 — FROZEN 2026-09-04. Permitted without a new version: bug fixes that do not change any number in Sections 1–8 when re-run; presentation changes; adding disclosures. Everything else — new features, model changes, threshold changes, publishing a probability, changing the bear-market stance — requires a designated research version (V3x-R), its own audit report using the scripts in Section 9, and a revised specification with a new version number.

Attribution and data sources

Unemployment rate and nonfarm payrolls: U.S. Bureau of Labor Statistics. Industrial production, 10-year Treasury constant-maturity yield and 3-month Treasury bill rate (H.15): Board of Governors of the Federal Reserve System. Housing starts: U.S. Census Bureau and U.S. Department of Housing and Urban Development. Recession dates: National Bureau of Economic Research. Index of Consumer Sentiment: University of Michigan, Survey Research Center, Surveys of Consumers (© University of Michigan; used as a model input only, with permission confirmed in writing; the index level is not displayed). All series retrieved from FRED®/ALFRED®, Federal Reserve Bank of St. Louis. Market inputs in the beta use a research data source pending a licensed feed; index levels are never displayed or redistributed.

This product uses the FRED® API but is not endorsed or certified by the Federal Reserve Bank of St. Louis. Not investment advice.