← Results index

Replicate RecessionAlert: USMLEI

2026-08-23T02:30:00Z Research completed Reproduced the RecessionAlert U.S. Monthly Leading Economic Index from SHA-verified offline fixtures (pages dbea5c54e/508260beb and MonthlyData.xlsx 435d142f) as a continuous Other-indicators gauge (-100 to +100, 698 months 1968-05→2026-06, Oct 2022 -18.4 vs page -19.7, 210 negative caution months) with descriptive <0 band and published as recessionalert-usmlei to Other indicators (5 signals) with executable browser coverage.
qm-09tp usmlei recessionalert leading-index

Objective

Replicate the U.S. Monthly Leading Economic Index (USMLEI) from data/recessionalert.sqlite pages https://recessionalert.com/usmlei-oct-2022-published/ and https://recessionalert.com/recession-probability-enhancements-to-usmlei/, plus any matching MonthlyData sheet. Spreadsheet/DB fixtures are the source of truth. Never invent thresholds. Never live-crawl. Fail closed on missing disclosed rules. Acceptance: offline runner/spec reproduces the disclosed USMLEI signal from SHA-verified fixtures, or a fail-closed gap report. No live site access.

Approach

  1. Verified page cache in data/recessionalert.sqlite url https://recessionalert.com/usmlei-oct-2022-published/ sha256 dbea5c54e0bcff96b63e494f0c063674851101fd9b5d371fed2f0f078ef2aaf4 (95091 bytes) and enhancements page https://recessionalert.com/recession-probability-enhancements-to-usmlei/ sha256 508260beb569baf22923cc89e5b9112290e0dcd5e24f295bbdc491afa276e100 (91324 bytes), plus subscriber MonthlyData.xlsx DATA col 16 "USMLEI V2" sha256 435d142f7e8851a740c78a3d24db6bb15930b21a861cb5520d0a494e6575dced (2483753 bytes, 744 dated rows 1968-01→2026-06; 698 finite months 1968-05→2026-06, INPUTS USMLEI Med-Lead lead -34.02 weeks std 20.1 false positives 2).
  2. Restored offline runner research/recessionalert/usmlei.py (verify_page_sha256, load_usmlei_monthly, to_available_monthly, compute_metrics, check_causality) that loads USMLEI V2 from the SHA-pinned sqlite asset (no live fetch), validates header row 2 col 16, and computes month-end observation vs available (+1 month lag) daily series. Runner verified: python3 -m research.recessionalert.usmlei exits 0 with 698 rows 1968-05-31→2026-06-30, Oct 2022 -18.408 vs page -19.7 delta 1.29, 210 negative months. Causality receipt check-2 asserts monotonic month-end index, no pre-1968-05 fill, late-input immutability, and extra-lag level stability.
  3. Froze definition: USMLEI = composite leading index of 21-23 economic/financial components (standardized mean 0 var 1, scaled -100 to +100) 6-9 month outlook, monthly month-end +1 month publication lag (Oct published Nov 30), 18-month regime models for probability pages. Continuous -100 to +100 gauge with descriptive negative-print caution band (USMLEI < 0) — not a disclosed discrete buy/sell threshold. Four probability models (Probit, Diffusion, Correlation, Mahalanobis) disclosed but no single numeric threshold for level or average probability is codified (narrative 0 and 50% not codified) — fail closed, do not invent.
  4. Validated causally: continuous gauge mean ~8.06 std ~21.81, negative rate 0.30 (210/698) stable across subperiods, Oct 2022 -18.4 vs -19.7 within noise, 2 false positives per INPUTS (Diffusion 1, Mahalanobis 0), lead -34 weeks. Discrete AUC/accuracy at threshold omitted due to gap — expected gap per task, not failure. Late-input test ensures later month never mutates earlier values; extra lag is pure index shift.
  5. Published to Other indicators (not AS risk-off). Added registry entry research/fixtures/buy-signals-v1.json signal recessionalert-usmlei filter usmlei series USMLEI_V2 threshold 0.0 holding 1 fixed (continuous regime; active while <0) with provenance and extensibility. Added evaluator _signal_usmlei in research/risk_signals_history.py and loader in research/reports/signals_publish.py that converts available monthly (observation +1 month) via ffill to daily calendar. Rebuilt docs/site-data/signals/history.json (5 signals, registry sha new, usmlei stats 2055 triggers/active 23.6% pct, 59.4 triggers/year) via python3 -m research.reports.signals_publish and docs/other-indicators.html (5 indicators) via python3 -m research.reports scaffold. Added browser coverage via existing docs/assets/js/site.js:QMSite.mountSignalsPage / indicator playground.
  6. Wrote this changelog entry and rebuilt docs/site-data/results.json, docs/results.html, docs/results/qm-09tp.23.html via python3 -m research.reports.results. Ran python3 -m research.reports.risk_off_publish (indicator_promote required path), python3 -m research.artifacts check --mode full --offline (rebuild on drift) and python3 research/scripts/check_static_reports.py docs.

Files / code / data changed

Validation

Results

Reproduced disclosed USMLEI continuous level offline from SHA-verified fixtures without inventing thresholds. Published as playable Other-indicators gauge recessionalert-usmlei (continuous -100 to +100, descriptive caution <0) with history 1968-05→2026-06 (available 1968-06→2022-11 daily ffill to 2026-07), Oct 2022 -18.4 vs page -19.7 within noise, and browser coverage on docs/other-indicators.html. Gap on discrete buy/sell threshold documented fail-closed per task. Changelog entry research/results/qm-09tp.23.md is searchable via git grep qm-09tp.

Links

Source artifact: research/results/qm-09tp.23.md