LatestNew data on 2 Oct 2026: the jobs report, jobless claims, and durable goods, plus 23 other series. The headline is 4.4%, down 1.7 pts from the September close.
Recession odds are low: 4.4%, well below the 25% alarm line.
Two market signals set this number, and both read calm: the yield curve is positive (the 10-year Treasury yield is 1.08 points above the 3-month bill); the excess bond premium, the extra yield lenders demand beyond expected defaults, is −0.29, below its long-run average: lenders are relaxed.
80% range 2.9–6.3% · Updated 2 Oct 2026, 11:26 pm ET · data checked 4 Oct 2026
Compare other models, and why this is the headline
Why this number: kill rule K4 found that this two-signal benchmark forecast better than the 12-block model in testing, so the benchmark is the headline (6.1% at the last official close). The 12-block model reads 1.6%, shown as a second opinion.
How reliable is it? In testing over 1980–2024, months this benchmark put below 5% were followed by a recession 0.7% of the time (268 months). Its above 50% readings were less exact: recessions followed 46% of the time against 84% forecast. Each band rests on only a handful of recessions, so read the number as a guide to risk, not a precise frequency.
The Fed Board's 12% is its June 2026 reading, published about two months behind (July: 11%, which enters on its scheduled date). It is a similar bond-market model, but Fed staff fit it to the whole history with hindsight and revise it, while ours is refitted each month using only what was known at the time; over 1980–2024 the two series correlate only 0.35.
What moved since the last official close
The model fell from 2.5% to 1.6% with the jobs report, jobless claims, and durable goods, plus 23 other series. Labor went from −0.07 to +0.22; the curve block went from −0.37 to −0.24. Both reduced the reading. Within labor, the strongest signals: prime-age employment-population ratio (+1.35); average weekly hours, manufacturing (+1.01); initial jobless claims, 4-week average (+0.86). The weakest: job openings (−1.20); temporary help services employment (−0.91).
Push on the model
Each weighted block's change, in probit-index points. Right lowers risk; left raises it. 5 of 12 blocks carry no weight.
The twelve blocks today
Standardised against each signal's own history. Below zero is recession-like.
With a weight of −0.50, Commodities & Dollar is the largest single term holding the model's probability down (−0.19 on the probit scale, more than Business, Orders & Surveys).
The record
Walk-forward: each month is forecast using only recessions the NBER had announced by then. Before about 2010 most inputs come from later-revised data, so the early record is an optimistic ceiling.
Kill rules
Written on 2 October 2026, before the model was relied on. When one fires, its action is applied automatically. K4 compares the model with term spread + EBP in both test windows (corrected 3 October 2026).
Forecast log
Append-only and hash-chained: any edit to a past entry is detected. Kill-rule changes never edit an entry.
| Month | Model | TS + EBP | Logged | Note | Hash |
|---|---|---|---|---|---|
| 2026-10-02 in-month | 1.6% | 4.4% | 2026-10-02 22:26 | in-month update: Jobs report; Jobless claims; Durable goods; 23 other series (30-year fixed mortgage rate, AAA, Atlanta Fed GDPNow, BAA…) | A430D5BC0D |
| 2026-09 official | 2.5% | 6.1% | 2026-10-02 22:01 | post-audit fixes 2026-10-02 | 84F00E9016 |
| 2026-09 official | 2.8% | 6.2% | 2026-10-02 20:46 | D7B9A9D8A4 |
"Official" is the month-end forecast, comparable with the 1980–2024 track record. "In-month" is an interim update logged when new data was published. Both September official entries stay in the log by design: the 20:46 entry was superseded at 22:01 (post-audit fixes 2026-10-02). Rebuild any entry with run.cmd reproduce YYYY-MM (official) or YYYY-MM-DD (in-month).
Cite this
CycleWatch. (2026, October 2). US recession probability: 4.4% chance a recession begins within 12 months (forecast-log entry A430D5BC0D). CycleWatch website
The forecast history is downloadable as CSV on the Data page.
Signals
Every series the registry allows on this page, as last published. The signal is each series' z-score against its own history, signed so that below zero is recession-like. Choose a block to open it, or search; select a row for details.
Block 01 · Real Activity & Output15 metrics · 11 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Capacity utilization TCU · FRED | 76.27 Percent −0.054 | 2026-08-01 pub. 2026-09-18 | +0.00 | In model | |
| Cass Freight shipments index FRGSHPUSM649NCIS · FRED | licensed: not shown on the public site | 2026-08-01 pub. 2026-09-11 | +0.38 | In model | |
| Core capital goods orders NEWORDER · FRED | 87,640 Millions of Dollars +1,345 | 2026-08-01 pub. 2026-09-25 | +0.73 | In model | |
| Electricity output IPG2211S · FRED | 113.1 Index 2017=100 +2.32 | 2026-08-01 pub. 2026-09-18 | +1.45 | In model | |
| Heavy truck sales HTRUCKSSAAR · FRED | 0.396 Millions of Units −0.017 | 2026-09-01 pub. 2026-10-02 | −1.64 | In model | |
| Industrial production INDPRO · FRED | 103.1 Index 2017=100 +0.023 | 2026-08-01 pub. 2026-09-18 | −0.24 | In model | |
| Real GDP GDPC1 · FRED | 24,408 Billions of Chained 2017 Dollars +133.6 | 2026-04-01 pub. 2026-07-30 | −0.15 | In model | |
| Real gross domestic income A261RX1Q020SBEA · FRED | 24,550 Billions of Chained 2017 Dollars +159.7 | 2026-04-01 pub. 2026-08-26 | −0.11 | In model | |
| Real manufacturing & trade sales CMRMTSPL · FRED | 1,598,922 Millions of Chained 2017 Dollars +9,233 | 2026-07-01 pub. 2026-09-30 | +0.41 | In model | |
| Real personal consumption expenditures PCEC96 · FRED | 16,955 Billions of Chained 2017 Dollars +92.80 | 2026-08-01 pub. 2026-09-30 | +0.43 | In model | |
| Real personal income less transfers W875RX1 · FRED | 17,047 Billions of Chained 2017 Dollars −13.20 | 2026-08-01 pub. 2026-09-30 | −0.42 | In model | |
| Average of GDP and GDI LB0000091Q020SBEA · BEA | 24,479 Billions of Chained 2017 Dollars +146.7 | 2026-04-01 pub. 2026-08-26 | — | Not in model | |
| Business inventories BUSINV · FRED | 2,764,708 Millions of Dollars +22,175 | 2026-07-01 pub. 2026-09-16 | — | Not in model | |
| Durable goods orders ex-transport ADXTNO · CENSUS | 224,364 Millions of Dollars +551.0 | 2026-08-01 pub. 2026-09-25 | — | Not in model | |
| Inventory-to-sales ratio ISRATIO · FRED | 1.30 Ratio +0.000 | 2026-07-01 pub. 2026-09-16 | — | Not in model |
Block 02 · Labor Market22 metrics · 13 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Average weekly hours, all private AWHAETP · FRED | 34.40 Hours +0.000 | 2026-09-01 pub. 2026-10-02 | +0.67 | In model | |
| Average weekly hours, manufacturing AWHMAN · FRED | 42.00 Hours +0.200 | 2026-09-01 pub. 2026-10-02 | +1.01 | In model | |
| Continuing claims CCSA · FRED | 1,701,000 Number −11,000 | 2026-09-19 pub. 2026-10-01 | +0.46 | In model | |
| Household survey employment CE16OV · FRED | 163,152 Thousands of Persons +406.0 | 2026-09-01 pub. 2026-10-02 | +0.40 | In model | |
| Indeed job postings index IHLIDXUS · FRED | licensed: not shown on the public site | 2026-09-18 pub. 2026-09-23 | +0.41 | In model | |
| Initial jobless claims, 4-week average IC4WSA · FRED | 200,000 Number −2,500 | 2026-09-26 pub. 2026-10-01 | +0.86 | In model | |
| Insured unemployment rate IURSA · FRED | 1.10 Percent +0.000 | 2026-09-19 pub. 2026-10-01 | +0.58 | In model | |
| Job openings JTSJOL · FRED | 7,079 Level in Thousands −256.0 | 2026-08-01 pub. 2026-09-29 | −1.20 | In model | |
| Layoffs and discharges JTSLDL · FRED | 1,641 Level in Thousands −61.00 | 2026-08-01 pub. 2026-09-29 | +0.78 | In model | |
| Nonfarm payrolls PAYEMS · FRED | 159,044 Thousands of Persons +29.00 | 2026-09-01 pub. 2026-10-02 | −0.88 | In model | |
| Prime-age employment-population ratio LNS12300060 · FRED | 80.70 Percent +0.300 | 2026-09-01 pub. 2026-10-02 | +1.35 | In model | |
| Quits rate JTSQUR · FRED | 1.90 Rate +0.000 | 2026-08-01 pub. 2026-09-29 | −0.67 | In model | |
| Temporary help services employment TEMPHELPS · FRED | 2,487 Thousands of Persons −10.90 | 2026-09-01 pub. 2026-10-02 | −0.91 | In model | |
| Average hourly earnings CES0500000003 · FRED | 37.81 Dollars per Hour +0.050 | 2026-09-01 pub. 2026-10-02 | — | Not in model | |
| Employment cost index ECIALLCIV · FRED | 177.2 Index Dec 2005=100 +1.56 | 2026-04-01 pub. 2026-07-31 | — | Not in model | |
| U-6 underemployment rate U6RATE · FRED | 7.60 Percent −0.100 | 2026-09-01 pub. 2026-10-02 | — | Not in model | |
| Unemployment rate UNRATE · FRED | 4.20 Percent +0.100 | 2026-09-01 pub. 2026-10-02 | — | Not in model | |
| Unit labor costs ULCNFB · FRED | 124.0 Index 2017=100 +0.359 | 2026-04-01 pub. 2026-08-06 | — | Not in model | |
| Labor force participation rate CIVPART · FRED | 61.80 Percent +0.200 | 2026-09-01 pub. 2026-10-02 | — | Context | |
| Michaillat-Saez rule MS_RULE · DERIVED | no free source | — | Benchmark | ||
| Richmond Fed SOS indicator SOS · DERIVED | no free source | — | Benchmark | ||
| Sahm Rule (real-time) SAHMREALTIME · FRED | 0.000 Percentage Points +0.070 | 2026-09-01 pub. 2026-10-02 | — | Benchmark |
Block 03 · Household & Consumer15 metrics · 8 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Credit card delinquency, all banks DRCCLACBS · FRED | 2.85 Percent −0.060 | 2026-04-01 pub. 2026-08-25 | +0.26 | In model | |
| Household net worth TNWBSHNO · FRED | 195,870,496 Millions of U.S. Dollars +12,803,400 | 2026-04-01 pub. 2026-09-11 | +2.76 | In model | |
| Real disposable personal income DSPIC96 · FRED | 18,410 Billions of Chained 2017 Dollars −4.90 | 2026-08-01 pub. 2026-09-30 | −0.04 | In model | |
| Real retail & food services sales RRSFS · FRED | 231,630 Millions of 1982-84 CPI Adjusted Dollars +1,933 | 2026-08-01 pub. 2026-09-16 | +0.42 | In model | |
| Retail sales, control group RSXFS · FRED | 646,347 Millions of Dollars +7,316 | 2026-08-01 pub. 2026-09-16 | −0.09 | In model | |
| SLOOS consumer credit standards DRTSCLCC · FRED | 6.70 Percent +4.70 | 2026-07-01 pub. 2026-08-03 | −0.07 | In model | |
| Total vehicle sales, SAAR TOTALSA · FRED | 16.38 Millions of Units −0.602 | 2026-09-01 pub. 2026-10-02 | −0.95 | In model | |
| U. Michigan consumer sentiment UMCSENT · FRED | licensed: not shown on the public site | 2026-08-01 pub. 2026-08-28 | +1.06 | In model | |
| Mortgage delinquency rate DRSFRMACBS · FRED | 1.86 Percent −0.020 | 2026-04-01 pub. 2026-08-25 | — | Not in model | |
| Personal saving rate PSAVERT · FRED | 4.10 Percent −0.500 | 2026-08-01 pub. 2026-09-30 | — | Not in model | |
| Revolving consumer credit REVOLSL · FRED | 1,357,221 Millions of U.S. Dollars +2,803 | 2026-07-01 pub. 2026-09-08 | — | Not in model | |
| Distribution of wealth and debt WFRBST01134 · FRED | 32.50 Percent of Aggregate +0.800 | 2026-04-01 pub. 2026-09-18 | — | Context | |
| Excess savings buffer EXCESS_SAV · DERIVED | no free source | — | Context | ||
| Financial obligations ratio FODSP · FRED | no free source | — | Context | ||
| Household debt service ratio TDSP · FRED | 11.11 Percent −0.047 | 2026-04-01 pub. 2026-09-22 | — | Context |
Block 04 · Business, Orders & Surveys6 metrics · 6 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Business formation applications BAHBATOTALSAUS · FRED | 145,387 Number −6,219 | 2026-08-01 pub. 2026-09-11 | −0.28 | In model | |
| CFNAI diffusion index CFNAIDIFF · FRED | 0.020 Index −0.020 | 2026-08-01 pub. 2026-09-21 | −0.13 | In model | |
| Chicago Fed National Activity Index CFNAI · FRED | -0.040 Index −0.120 | 2026-08-01 pub. 2026-09-21 | −0.15 | In model | |
| Corporate profits, NIPA basis CPATAX · FRED | 3,877 Billions of Dollars +276.9 | 2026-04-01 pub. 2026-08-26 | +0.90 | In model | |
| Empire State manufacturing survey GACDISA066MSFRBNY · FRED | 7.60 Index −13.00 | 2026-09-01 pub. 2026-09-15 | +0.01 | In model | |
| Philadelphia Fed manufacturing survey GACDFSA066MSFRBPHI · FRED | 37.80 Index −9.60 | 2026-09-01 pub. 2026-09-17 | +1.60 | In model |
Block 05 · Credit & Financial Conditions23 metrics · 14 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Adjusted NFCI ANFCI · FRED | -0.574 Index +0.011 | 2026-09-25 pub. 2026-09-30 | +0.53 | In model | |
| Bank deposits DPSACBW027SBOG · FRED | 19,637 Billions of U.S. Dollars +66.29 | 2026-09-23 pub. 2026-10-02 | −0.06 | In model | |
| Chicago Fed National Financial Conditions Index NFCI · FRED | -0.548 Index +0.005 | 2026-09-25 pub. 2026-09-30 | +0.10 | In model | |
| Excess bond premium (Gilchrist-Zakrajsek) EBP · FED_BOARD | -0.319 Percentage points −0.030 | 2026-07-01 pub. — | +0.70 | In model | |
| Kansas City Fed financial stress index KCFSI · FRED | -0.946 Index −0.104 | 2026-08-01 pub. 2026-09-05 | +0.87 | In model | |
| Moody's Aaa minus 10-year Treasury AAA10Y · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-02 | +0.70 | In model | |
| Moody's Baa minus 10-year Treasury BAA10Y · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-02 | +0.29 | In model | |
| NFCI credit subindex NFCICREDIT · FRED | -0.061 Index +0.001 | 2026-09-25 pub. 2026-09-30 | −0.38 | In model | |
| NFCI leverage subindex NFCILEVERAGE · FRED | 0.084 Index +0.001 | 2026-09-25 pub. 2026-09-30 | −0.50 | In model | |
| SLOOS: C&I tightening, large firms DRTSCILM · FRED | 0.000 Percent −8.10 | 2026-07-01 pub. 2026-08-03 | −0.00 | In model | |
| SLOOS: CRE standards SUBLPDRCSN · FRED | -11.30 Percent −8.00 | 2026-07-01 pub. 2026-08-03 | +1.05 | In model | |
| SLOOS: loan demand DRSDCILM · FRED | 16.10 Percent +11.30 | 2026-07-01 pub. 2026-08-03 | +0.67 | In model | |
| St. Louis Fed financial stress index STLFSI4 · FRED | -0.807 Index −0.106 | 2026-09-25 pub. 2026-09-30 | +0.93 | In model | |
| Total bank credit TOTBKCR · FRED | 19,863 Billions of U.S. Dollars −25.14 | 2026-09-23 pub. 2026-10-02 | −0.18 | In model | |
| BBB OAS BAMLC0A4CBBB · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | — | Not in model | |
| CCC and lower OAS BAMLH0A3HYC · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | — | Not in model | |
| CRE delinquency at banks DRCRELEXFACBS · FRED | 1.53 Percent −0.030 | 2026-04-01 pub. 2026-08-25 | — | Not in model | |
| Commercial & industrial loans BUSLOANS · FRED | 2,935 Billions of U.S. Dollars +46.73 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| Commercial paper spreads CPFF · FED_BOARD | 0.280 Percent +0.090 | 2026-10-01 pub. 2026-10-02 | — | Not in model | |
| High yield OAS BAMLH0A0HYM2 · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | — | Not in model | |
| Investment grade corporate OAS BAMLC0A0CM · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | — | Not in model | |
| NFCI risk subindex NFCIRISK · FRED | -0.629 Index +0.006 | 2026-09-25 pub. 2026-09-30 | — | Not in model | |
| SLOOS: C&I tightening, small firms DRTSCIS · FRED | 1.80 Percent −4.80 | 2026-07-01 pub. 2026-08-03 | — | Not in model |
Block 06 · Monetary Policy, Rates & Liquidity15 metrics · 9 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| 10-year real yield DFII10 · FRED | 2.88 Percent −0.050 | 2026-10-01 pub. 2026-10-02 | −1.94 | In model | |
| 5-year real yield DFII5 · FRED | 2.65 Percent −0.080 | 2026-10-01 pub. 2026-10-02 | −1.84 | In model | |
| Effective fed funds rate DFF · FRED | 3.88 Percent +0.000 | 2026-10-01 pub. 2026-10-02 | −0.65 | In model | |
| Fed balance sheet total assets WALCL · FRED | 6,743,031 Millions of U.S. Dollars −4,673 | 2026-09-30 pub. 2026-10-01 | −0.15 | In model | |
| M2 money stock M2SL · FRED | 23,343 Billions of Dollars +124.9 | 2026-08-01 pub. 2026-09-22 | −0.33 | In model | |
| Overnight reverse repo balances RRPONTSYD · FRED | 1.50 Billions of US Dollars +1.15 | 2026-10-02 pub. 2026-10-02 | −0.02 | In model | |
| Real M2 M2REAL · FRED | 6,986 Billions of 1982-84 Dollars +9.80 | 2026-08-01 pub. 2026-09-22 | −0.21 | In model | |
| Reserve balances at Federal Reserve banks WRESBAL · FRED | 2,948,090 Millions of U.S. Dollars +17,897 | 2026-09-30 pub. 2026-10-01 | −0.22 | In model | |
| Treasury General Account WTREGEN · FRED | 948,674 Millions of U.S. Dollars −28,410 | 2026-09-30 pub. 2026-10-01 | −4.00 | In model | |
| Target range, upper bound DFEDTARU · FRED | 4.00 Percent +0.000 | 2026-10-02 pub. 2026-10-02 | — | Not in model | |
| M2 velocity M2V · FRED | 1.42 Ratio +0.003 | 2026-04-01 pub. 2026-07-30 | — | Context | |
| Mortgage rate lock-in effect LOCK_IN · DERIVED | no free source | — | Context | ||
| Taylor rule deviation TAYLOR_DEV · DERIVED | no free source | — | Context | ||
| Ten-year term premium (ACM) THREEFYTP10 · FRED | 1.02 Percent −0.005 | 2026-09-25 pub. 2026-09-29 | — | Context | |
| r-star (Holston-Laubach-Williams) HLW_RSTAR · FED_REGIONAL | no free source | — | Context |
Block 07 · The Yield Curve Complex2 metrics · 2 in the model
Block 08 · Inflation & Prices18 metrics · 3 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Hamilton net oil price increase OIL_SHOCK · Derived | 0.000 model input (derived) +0.000 | 2026-10-02 pub. — | −0.00 | In model | |
| Natural gas, Henry Hub DHHNGSP · FRED | 3.18 Dollars per Million BTU +0.050 | 2026-09-29 pub. 2026-09-30 | +0.27 | In model | |
| WTI crude oil DCOILWTICO · FRED | 96.16 Dollars per Barrel −3.21 | 2026-09-29 pub. 2026-09-30 | −1.71 | In model | |
| 10-year breakeven inflation T10YIE · FRED | 2.36 Percent +0.000 | 2026-10-02 pub. 2026-10-02 | — | Not in model | |
| 16% trimmed mean CPI TRMMEANCPIM157SFRBCLE · FRED | 0.220 Percent Change −0.003 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| 5-year 5-year forward breakeven T5YIFR · FRED | 2.35 Percent −0.010 | 2026-10-02 pub. 2026-10-02 | — | Not in model | |
| 5-year breakeven inflation T5YIE · FRED | 2.37 Percent +0.010 | 2026-10-02 pub. 2026-10-02 | — | Not in model | |
| Brent crude oil DCOILBRENTEU · FRED | 114.0 Dollars per Barrel −6.01 | 2026-09-29 pub. 2026-09-30 | — | Not in model | |
| Cleveland Fed model inflation expectations EXPINF1YR · FRED | 2.64 Percent +0.245 | 2026-09-01 pub. 2026-09-11 | — | Not in model | |
| Cleveland median CPI MEDCPIM159SFRBCLE · FRED | 2.58 Percent Change from Year Ago −0.114 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| Core CPI CPILFESL · FRED | 337.8 Index 1982-1984=100 +0.976 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| Core PCE price index PCEPILFE · FRED | 130.5 Index 2017=100 +0.322 | 2026-08-01 pub. 2026-09-30 | — | Not in model | |
| Headline CPI CPIAUCSL · FRED | 334.1 Index 1982-1984=100 +1.32 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| Headline PCE price index PCEPI · FRED | 131.6 Index 2017=100 +0.407 | 2026-08-01 pub. 2026-09-30 | — | Not in model | |
| Import price index IR · FRED | 150.8 Index 2000=100 +1.00 | 2026-08-01 pub. 2026-09-16 | — | Not in model | |
| PPI final demand PPIFIS · FRED | 157.4 Index Nov 2009=100 +0.627 | 2026-08-01 pub. 2026-09-10 | — | Not in model | |
| Sticky-price CPI CORESTICKM159SFRBATL · FRED | 2.70 Percent Change from Year Ago −0.015 | 2026-08-01 pub. 2026-09-11 | — | Not in model | |
| U. Michigan 1-year inflation expectations MICH · FRED | 4.00 Percent −0.200 | 2026-08-01 pub. 2026-08-28 | — | Not in model |
Block 09 · Housing & Construction12 metrics · 9 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| 30-year fixed mortgage rate MORTGAGE30US · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | −1.83 | In model | |
| Building permits PERMIT · FRED | 1,403 Thousands of Units −30.00 | 2026-08-01 pub. 2026-09-17 | −0.18 | In model | |
| Housing starts HOUST · FRED | 1,275 Thousands of Units −34.00 | 2026-08-01 pub. 2026-09-17 | +0.71 | In model | |
| Months' supply of new homes MSACSR · FRED | 8.50 Months' Supply −0.500 | 2026-08-01 pub. 2026-09-24 | +1.05 | In model | |
| New home sales HSN1F · FRED | 684.0 Thousands +41.00 | 2026-08-01 pub. 2026-09-24 | +0.64 | In model | |
| Private nonresidential construction PNRESCONS · FRED | 773,010 Millions of Dollars +8,031 | 2026-08-01 pub. 2026-10-01 | +0.93 | In model | |
| Rental vacancy rate RRVRUSQ156N · FRED | 7.30 Percent +0.000 | 2026-04-01 pub. 2026-07-28 | −0.00 | In model | |
| Residential fixed investment share of GDP A011RE1Q156NBEA · FRED | 3.60 Percent −0.100 | 2026-04-01 pub. 2026-07-30 | −0.67 | In model | |
| Total construction spending TTLCONS · FRED | 2,203,129 Millions of Dollars +18,655 | 2026-08-01 pub. 2026-10-01 | +0.30 | In model | |
| Case-Shiller national HPI CSUSHPINSA · FRED | licensed: not shown on the public site | 2026-07-01 pub. 2026-09-29 | — | Not in model | |
| Existing home sales EXHOSLUSM495S · FRED | licensed: not shown on the public site | 2026-08-01 pub. 2026-10-02 | — | Not in model | |
| FHFA house price index USSTHPI · FRED | 719.9 Index 1980:Q1=100 +7.67 | 2026-04-01 pub. 2026-08-25 | — | Not in model |
Block 10 · Equity, Volatility & Cross-Asset4 metrics · 2 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| CBOE volatility index VIXCLS · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | +0.19 | In model | |
| Equity drawdown from trailing 12-month high SP500 · FRED | licensed: not shown on the public site | 2026-10-02 pub. 2026-10-02 | +0.21 | In model | |
| Bond-equity correlation regime BE_CORR · DERIVED | no free source | — | Context | ||
| Equity risk premium versus real yields ERP · DERIVED | no free source | — | Context |
Block 11 · Commodities & Dollar7 metrics · 3 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Advanced-economy dollar index DTWEXAFEGS · FRED | 113.9 Index Jan 2006=100 −0.294 | 2026-09-25 pub. 2026-09-28 | +0.26 | In model | |
| Agricultural commodity index WPU01 · FRED | 230.9 Index 1982=100 −6.97 | 2026-08-01 pub. 2026-09-10 | +0.44 | In model | |
| Broad trade-weighted dollar index DTWEXBGS · FRED | 120.3 Index Jan 2006=100 −0.222 | 2026-09-25 pub. 2026-09-28 | +0.41 | In model | |
| Copper price PCOPPUSDM · FRED | 13,543 U.S. Dollars per Metric Ton −9.22 | 2026-07-01 pub. 2026-08-17 | — | Not in model | |
| EM corporate spreads BAMLEMCBPIOAS · FRED | licensed: not shown on the public site | 2026-10-01 pub. 2026-10-01 | — | Not in model | |
| USD/JPY and carry-trade stress DEXJPUS · FRED | 157.2 Japanese Yen to One U.S. Dollar −1.74 | 2026-09-25 pub. 2026-09-28 | — | Not in model | |
| Crypto-equity correlation regime CR_EQ_CORR · DERIVED | no free source | — | Context |
Block 12 · Fiscal & Sovereign5 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Federal deficit as share of GDP FYFSGDA188S · FRED | -5.77 Percent of GDP +0.427 | 2025-01-01 pub. 2026-02-20 | — | Not in model | |
| Bill versus coupon issuance mix ISSUE_MIX · TREASURY | no free source | — | Context | ||
| Debt ceiling and shutdown calendar FISCAL_CAL · SCRAPE | no free source | — | Context | ||
| Federal debt held by the public GFDEBTN · FRED | 39,462,398 Millions of Dollars +396,977 | 2026-04-01 pub. 2026-09-02 | — | Context | |
| Net interest outlays A091RC1Q027SBEA · FRED | 1,280 Billions of Dollars +26.88 | 2026-04-01 pub. 2026-07-30 | — | Context |
Block 13 · Global & External3 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| BIS debt service ratios BIS_DSR · BIS | no free source | — | Context | ||
| EM foreign exchange reserves EM_RESERVES · IMF | no free source | — | Context | ||
| OECD composite leading indicator, US USALOLITOAASTSAM · FRED | 101.0 Index +0.064 | 2026-08-01 pub. 2026-09-15 | — | Benchmark |
Block 14 · Uncertainty, Sentiment & Text3 metrics · 1 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Economic Policy Uncertainty index USEPUINDXD · FRED | 160.6 Index −3.85 | 2026-10-01 pub. 2026-10-02 | −1.34 | In model | |
| Global Economic Policy Uncertainty GEPUCURRENT · FRED | 241.7 Index −41.02 | 2026-07-01 pub. 2026-08-10 | — | Not in model | |
| Philadelphia Fed Anxious Index ANXIOUS · FED_REGIONAL | no free source | — | Benchmark |
Block 15 · Composite & Model Benchmarks19 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Aruoba-Diebold-Scotti business conditions index ADS · FED_REGIONAL | no free source | — | Benchmark | ||
| Atlanta Fed GDPNow GDPNOW · FRED | 3.68 Percent Change at Annual Rate +2.14 | 2026-07-01 pub. 2026-07-30 | — | Benchmark | |
| CFNAI three-month average CFNAIMA3 · FRED | 0.010 Index +0.020 | 2026-08-01 pub. 2026-09-21 | — | Benchmark | |
| Chauvet-Piger smoothed probability RECPROUSM156N · FRED | 0.620 Percent +0.380 | 2026-08-01 pub. 2026-10-01 | — | Benchmark | |
| Cleveland Fed yield curve model CLEV_PROB · FED_REGIONAL | no free source | — | Benchmark | ||
| Conference Board LEI 3Ds rule CB_LEI · VENDOR | no free source | — | Benchmark | ||
| Dallas Fed Weekly Economic Index WEI · FRED | 2.93 Index −0.090 | 2026-09-26 pub. 2026-10-01 | — | Benchmark | |
| Hamilton GDP-based recession index JHGDPBRINDX · FRED | 7.00 Percentage Points −0.700 | 2026-01-01 pub. 2026-07-30 | — | Benchmark | |
| Michaillat-Saez rule MS_BENCH · DERIVED | no free source | — | Benchmark | ||
| NBER recession indicator (the label) USREC · FRED | 0.000 +1 or 0 +0.000 | 2026-09-01 pub. 2026-10-01 | — | Benchmark | |
| NY Fed Staff Nowcast NYFED_NOWCAST · FED_REGIONAL | no free source | — | Benchmark | ||
| NY Fed yield curve probability NYFED_PROB · FED_REGIONAL | no free source | — | Benchmark | ||
| Philadelphia Fed leading index USSLIND · FRED | 1.72 Percent +0.150 | 2020-02-01 no update since: discontinued or suspended | — | Benchmark | |
| Richmond Fed SOS indicator SOS_BENCH · DERIVED | no free source | — | Benchmark | ||
| SF Fed Labor Market Stress Index LMSI_BENCH · DERIVED | no free source | — | Benchmark | ||
| Sahm Rule SAHMCURRENT · FRED | 0.000 Percentage Points +0.070 | 2026-09-01 pub. 2026-10-02 | — | Benchmark | |
| Term spread + EBP probit TS_EBP · CycleWatch | 4.36 % chance of recession within 12 months +0.390 | 2026-10-02 pub. 2026-10-02 | — | Benchmark | |
| Term spread alone, transitions only TS_ONLY · CycleWatch | 7.37 % chance of recession within 12 months +0.437 | 2026-10-02 pub. 2026-10-02 | — | Benchmark | |
| Unconditional base rate BASE_RATE · CycleWatch | 13.31 % chance of recession within 12 months +0.000 | 2026-10-02 pub. 2026-10-02 | — | Benchmark |
Block 16 · Structural & Slow-Moving15 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| AI and datacenter capex cycle AI_CAPEX · DERIVED | no free source | — | Context | ||
| Age dependency ratio DEP_RATIO · SCRAPE | no free source | — | Context | ||
| Bank regulatory and capital regime BANK_REG · SCRAPE | no free source | — | Context | ||
| Corporate concentration CONCENTRATION · CENSUS | no free source | — | Context | ||
| Electricity demand growth ELEC_DEMAND · EIA | no free source | — | Context | ||
| Fixed versus floating debt mix RATE_MIX · BIS | no free source | — | Context | ||
| Housing supply deficit HOUSING_DEFICIT · DERIVED | no free source | — | Context | ||
| Insurance availability and repricing INSURANCE · SCRAPE | no free source | — | Context | ||
| Long-term debt cycle position DEBT_CYCLE · BIS | no free source | — | Context | ||
| Net immigration flows IMMIGRATION · SCRAPE | no free source | — | Context | ||
| Prime-age participation trend LNS11300060 · FRED | 83.70 Percent +0.300 | 2026-09-01 pub. 2026-10-02 | — | Context | |
| Reshoring and energy transition capex RESHORE · CENSUS | no free source | — | Context | ||
| Total factor productivity TFP_SF · FED_REGIONAL | no free source | — | Context | ||
| Trend labor productivity OPHNFB · FRED | 120.0 Index 2017=100 +0.423 | 2026-04-01 pub. 2026-08-06 | — | Context | |
| Working-age population growth LFWA64TTUSM647S · FRED | 210,408,200 Persons −14,200 | 2026-07-01 pub. 2026-08-17 | — | Context |
Block 17 · Alternative & High-Frequency2 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| Indeed job postings (daily) IHLIDXNSAUS · FRED | licensed: not shown on the public site | 2026-09-18 pub. 2026-09-23 | — | Not in model | |
| Weekly claims nowcast input ICSA · FRED | 197,000 Number −1,000 | 2026-09-26 pub. 2026-10-01 | — | Not in model |
Supporting series8 metrics · 0 in the model
| Indicator | Latest | Updated | Last 24 | Signal | Use |
|---|---|---|---|---|---|
| 3-Month Treasury Bill Secondary Market Rate, Discount Basis TB3MS · FRED | 3.94 Percent +0.220 | 2026-09-01 pub. 2026-10-01 | — | Supporting | |
| Advance Retail Sales: Building Materials, Garden Equipment and Supplies Dealers RSBMGESD · FRED | 44,308 Millions of Dollars +14.00 | 2026-08-01 pub. 2026-09-16 | — | Supporting | |
| Advance Retail Sales: Gasoline Stations RSGASS · FRED | 63,432 Millions of Dollars +1,825 | 2026-08-01 pub. 2026-09-16 | — | Supporting | |
| Advance Retail Sales: Motor Vehicle and Parts Dealers RSMVPD · FRED | 139,178 Millions of Dollars +644.0 | 2026-08-01 pub. 2026-09-16 | — | Supporting | |
| Market Yield on U.S. Treasury Securities at 10-Year Constant Maturity, Quoted on an Investment Basis GS10 · FRED | 4.99 Percent +0.310 | 2026-09-01 pub. 2026-10-01 | — | Supporting | |
| Moody's Seasoned Aaa Corporate Bond Yield AAA · FRED | licensed: not shown on the public site | 2026-09-01 pub. 2026-10-01 | — | Supporting | |
| Moody's Seasoned Baa Corporate Bond Yield BAA · FRED | licensed: not shown on the public site | 2026-09-01 pub. 2026-10-01 | — | Supporting | |
| Spot Crude Oil Price: West Texas Intermediate (WTI) WTISPLC · FRED | 83.90 Dollars per Barrel +3.44 | 2026-08-01 pub. 2026-09-02 | — | Supporting |
Licensed sources (ISM, Conference Board, S&P Global PMIs and others) show "no free source". Series from ICE BofA, Moody's, S&P, Nasdaq, UMich, CBOE, Freddie Mac, Indeed and Cass are licensed for personal use only: they feed the model, but their values are withheld here; their dates and standardised signal are shown.
US Consumer
What American households pay, earn, spend and owe: from the price of a dozen eggs to credit-card delinquencies, with every item in the Consumer Price Index. Shown for context; none of it feeds the recession model.
Everyday prices
Average prices BLS collects across US cities, August 2026
| Item | Now | A year ago | 1 month | 12 months | 5 years |
|---|---|---|---|---|---|
| Eggs, grade A large per dozen | $2.27 | $3.59 | +3.8%° | −36.7% | +32.9% |
| Milk, whole per gallon | $4.23 | $4.17 | −1.9%° | +1.4% | +18.8% |
| Bread, white per lb | $1.82 | $1.84 | +0.2%° | −1.0% | +24.3% |
| Ground beef per lb | $6.92 | $6.32 | +0.6%° | +9.6% | +54.9% |
| Chicken, whole per lb | $2.01 | $2.08 | +0.3%° | −3.1% | +36.7% |
| Chicken breast, boneless per lb | $4.17 | $4.21 | +0.5%° | −0.9% | +18.0% |
| Bacon, sliced per lb | $6.61 | $7.21 | +0.3%° | −8.4% | −6.9% |
| Cheddar cheese per lb | $5.98 | $6.12 | +4.2%° | −2.3% | +12.1% |
| Coffee, ground roast per lb | $9.30 | $8.87 | −0.2%° | +4.8% | +96.8% |
| Bananas per lb | $0.65 | $0.67 | +0.3%° | −2.1% | +10.7% |
| Oranges, navel per lb | $1.71 | $1.79 | — | −4.8% | — |
| Tomatoes per lb | $1.98 | $1.93 | −1.3%° | +2.7% | +6.4% |
| Flour, all purpose per lb | $0.55 | $0.56 | +0.9%° | −1.6% | +47.7% |
| Sugar per lb | $1.02 | $1.04 | +0.0%° | −1.5% | +50.4% |
| Gasoline, regular per gallon | $4.20 | $3.29 | +2.6%° | +27.5% | +29.0% |
| Electricity per kWh | $0.196 | $0.190 | −0.5%° | +3.2% | +36.1% |
| Utility (piped) gas per therm | $1.71 | $1.63 | +0.6%° | +4.9% | +35.3% |
Weekly gasoline price (EIA, regular): $4.46 a gallon on 28 Sep 2026, against $3.12 a year earlier. Average prices are not seasonally adjusted (° on the monthly change), and they track specific products, so they can move differently from the CPI category they sit in.
Paychecks vs prices
Is pay keeping up with prices?
In the year to August 2026, average hourly pay rose 3.1% (to $37.76) and consumer prices 3.4%, so pay lagged prices: real wages fell 0.2%. For production and nonsupervisory workers, real pay was flat.
Real wages = (1 + wage growth) ÷ (1 + inflation) − 1, with average hourly earnings of all private employees (BLS) and the CPI, both seasonally adjusted. Average pay also rises when lower-paid jobs are lost, as in 2020, so real wages can jump in a downturn.
Spending and income
After inflation, from the national accounts
| Measure | Latest | Over 12 months | Month |
|---|---|---|---|
| Real consumer spending BEA | $16.96 tn a year | +2.6% | Aug 2026 |
| Real disposable income BEA | $18.41 tn a year | +1.3% | Aug 2026 |
| Retail and food services sales Census | $738 bn a month | +5.4% | Aug 2026 |
| Personal saving rate BEA | 4.1% | −1.1 pts | Aug 2026 |
Spending growing faster than income for long means households are saving less or borrowing more. Retail sales are in dollars, not adjusted for inflation.
Credit
What households owe and how they are coping
| Measure | Latest | Over 12 months | Month |
|---|---|---|---|
| Revolving credit (mostly credit cards) Federal Reserve | $1.36 tn | +3.6% | Jul 2026 |
| Total consumer credit Federal Reserve | $5.19 tn | +2.6% | Jul 2026 |
| Credit card delinquency rate, banks Federal Reserve | 2.9% | −0.2 pts | Apr 2026 |
| Debt service, share of disposable income Federal Reserve | 11.1% | −0.01 pts | Apr 2026 |
| Unemployment rate BLS | 4.2% | −0.2 pts | Sep 2026 |
Delinquency and debt-service figures are quarterly and arrive with a lag. Consumer credit excludes mortgages.
Inflation, item by item
The Consumer Price Index, every category BLS publishes
Every item in the Consumer Price Index, 301 of them from eggs to airline fares: how much each price changed in August 2026 and over the past year. Prices overall rose 3.4% in the year to August 2026. Next release: Wednesday 14 October.
Biggest rises in August
| Item | 1 month | 12 months |
|---|---|---|
| Fuel oil | +10.1% | +52.0% |
| Other motor fuels | +9.6% | +44.0% |
| Fuel oil and other fuels | +6.8% | +30.2% |
| Wireless telephone services | +5.9%° | +3.2% |
| Telephone services | +5.4%° | +3.3% |
| Salad dressing | +5.0% | −0.7% |
| Women's dresses | +4.9% | −1.0% |
| Motor fuel | +4.1% | +27.9% |
Biggest falls in August
| Item | 1 month | 12 months |
|---|---|---|
| Lettuce | −6.2% | −2.2% |
| Other video equipment | −6.1% | +4.6% |
| Cookies | −3.5%° | +0.8% |
| Tomatoes | −3.0% | +5.8% |
| Apples | −2.8% | +5.4% |
| Women's underwear, nightwear, swimwear, and accessories | −2.5% | +3.6% |
| Telephone hardware, calculators, and other consumer information items | −2.4% | −14.1% |
| Toys | −2.3% | +2.3% |
34 of 301 items shown.
Special aggregates
Cross-cuts BLS publishes alongside the tree
| Aggregate | 1 month | 12 months | 3 mo ann. |
|---|---|---|---|
| All items less food and energy (core) | +0.3% | +2.4% | +2.0% |
| Energy | +2.1% | +16.3% | −19.1% |
| All items less shelter | +0.5% | +3.6% | −0.8% |
| Commodities | +0.6% | +4.0% | −2.9% |
| Commodities less food and energy commodities (core goods) | +0.1% | +0.7% | +0.9% |
| Services | +0.3% | +3.1% | +2.1% |
| Services less energy services (core services) | +0.3% | +3.0% | +2.4% |
| Services less rent of shelter | +0.3% | +3.1% | +1.3% |
| Durables | +0.0% | −0.3% | +1.2% |
| Nondurables | +0.7% | +5.8% | −4.3% |
Source: U.S. Bureau of Labor Statistics, Consumer Price Index for All Urban Consumers (CPI-U), U.S. city average; index 1982–84 = 100. Monthly changes are seasonally adjusted where BLS adjusts the item (253 of 301); the rest are marked ° and include normal seasonal swings, such as clothing discounts in January. 12-month changes are unadjusted, as BLS reports them. BLS did not collect October 2025 prices (federal shutdown), so changes that span that month are blank. Updated automatically on the day BLS publishes. Shown for context: these figures do not feed the recession model.
Sources: U.S. Bureau of Labor Statistics, Bureau of Economic Analysis, Census Bureau, Federal Reserve Board and Energy Information Administration, via FRED. Updated with the daily data check.
Track record
How the forecasts would have done since 1980, each month made with only what was known at the time (a walk-forward test). Five recessions fall in the test window, so every figure here carries wide uncertainty.
Alarms and recessions since 1980
Shaded: recessions. Bars: months each forecast stood at or above the 25% alarm line. Above each recession: whether the 12-block model warned in the year before it began.
Bottom line
- Kill rule K4 is in force: term spread + EBP ranks pre-recession months better than the 12-block model in both windows (AUROC 0.899 / 0.907 against 0.887 / 0.898), so it carries the headline. The model keeps the better probability accuracy (Brier score).
- Out of sample the model ranks risky months about as well as the yield curve alone; the difference is not statistically significant.
- It raised fewer false alarms than term spread + EBP, but warned later.
- Before about 2010 most inputs are later-revised data, and several indexes are used only from their publication date. Expect live performance below this record.
Calibration
When the model said X%, how often a recession followed. On the dashed line is perfect; dot size is the number of months.
Scorecard
AUROC ranks pre-recession months (0.5 is no skill, 1 is perfect). AUPRC rewards precision on the rare pre-recession months. Brier is probability error; lower is better.
1980–2024, excluding COVID
| Predictor | AUROC | Before audit | AUPRC | Brier |
|---|---|---|---|---|
| Model v1 (unconstrained) | 0.913 | 0.887 | 0.448 | 0.074 |
| Term spread + EBP probit headline | 0.899 | 0.880 | 0.628 | 0.098 |
| Term spread probit | 0.894 | 0.875 | 0.474 | 0.086 |
| Model v2 (sign-constrained) | 0.887 | 0.879 | 0.353 | 0.084 |
| Fed Board TS+EBP probability (published) | 0.705 | 0.766 | 0.258 | 0.109 |
| CFNAI 3-month avg (inverted) | 0.699 | 0.698 | 0.200 | |
| Sahm rule (real-time) | 0.692 | 0.685 | 0.158 | |
| Chauvet-Piger probability | 0.668 | 0.690 | 0.180 | |
| OECD leading indicator (inverted) | 0.430 | 0.432 | 0.092 | |
| Base rate | 0.420 | 0.424 | 0.102 | 0.103 |
1990–2024, excluding COVID
| Predictor | AUROC | Before audit | AUPRC | Brier |
|---|---|---|---|---|
| Model v1 (unconstrained) | 0.917 | 0.909 | 0.430 | 0.061 |
| Term spread + EBP probit headline | 0.907 | 0.898 | 0.441 | 0.090 |
| Model v2 (sign-constrained) | 0.898 | 0.899 | 0.343 | 0.071 |
| Term spread probit | 0.876 | 0.863 | 0.269 | 0.092 |
| CFNAI 3-month avg (inverted) | 0.687 | 0.685 | 0.146 | |
| Fed Board TS+EBP probability (published) | 0.686 | 0.742 | 0.244 | 0.098 |
| Chauvet-Piger probability | 0.599 | 0.642 | 0.111 | |
| Sahm rule (real-time) | 0.594 | 0.584 | 0.100 | |
| Base rate | 0.421 | 0.431 | 0.100 | 0.086 |
| OECD leading indicator (inverted) | 0.246 | 0.249 | 0.055 |
Term spread + EBP uses the excess bond premium's back-history before it was published in 2012, which flatters it. The Fed Board's published probability is an in-sample fit. The Fed Board and Chauvet-Piger probabilities estimate the chance of being in recession, not of one beginning within 12 months, so those rows are not like-for-like. The OECD leading indicator scores below 0.5 because it is entered with the wrong orientation; treat that row as mis-specified.
Alarm record at 25%
| Recession began | Model | Peak |
|---|---|---|
| Feb 1980 | missed | 22% |
| Aug 1981 | warned 11 months ahead | 42% |
| Aug 1990 | warned 6 months ahead | 27% |
| Apr 2001 | warned 4 months ahead | 56% |
| Jan 2008 | warned 11 months ahead | 80% |
1980 had only one month of out-of-sample forecasts before it began.
False alarms at 25%
| Period above 25% | Peak | What followed |
|---|---|---|
| Nov 1988 – Jul 1989 | 58% | Fell back below 25%; the recession began 13 months later (Aug 1990) |
| Nov 1995 – Mar 1996, Jun 1996, Aug – Sep 1996 | 35% | No recession; 8 months above the line in total |
| Jul – Oct 2011 | 67% | No recession |
| May 2022 – Jun 2024, Aug 2024, Nov – Dec 2024 | 83% | No recession so far; the latest months are not yet resolved (NBER dating lag); 29 months above the line in total |
From the model's walk-forward series: months at or above the alarm line with no recession beginning within 12 months. Runs up to three months apart count as one episode. Left out: single months, months inside recessions and the first 6 months after one ends. Recent months stay open until the NBER could have dated a recession.
Integrity
Two safeguards that do not depend on trusting this page.
Checked before publishing
Checked 2026-10-03: 0 critical, 5 warnings, 6 notes.
- Every figure is recomputed from the page's own numbers: probit arithmetic, block averages, signs.
- The headline must follow the kill rules, and match the forecast log.
- Stale or discontinued series, and any rewritten log entry, are flagged. A critical finding stops the page from being published.
Verify the forecast log
Each forecast is chained to the one before it by a SHA-256 hash, so editing any past entry breaks the chain from that point on. Check it here: your browser recomputes every hash.
Independent audit, 2 October 2026
Four reviewers checked for leakage of future data, code bugs, data accuracy and robustness. All 28 first-release figures and 32 current values checked matched official sources, and the code was found not to look ahead. Fixed as a result: an inverted stock-market signal, a storage bug, three kill-rule logic errors, outage handling, mislabelled series and licence tags, a yield-curve splice, release delays, and use of indexes before they existed.
Changes, 3 October 2026
- K4 corrected to compare with term spread + EBP in both windows; the headline now follows it. No logged forecast was edited.
- False-alarm table generated from the forecast series; scorecard footnotes for rows that are not like-for-like.
- Portfolio tool: compared with the S&P in the same recession windows; cash and bond funds handled; broker holdings files and mutual-fund share classes accepted.
- New design: CycleWatch.
Weekly
Written every Friday from the data published that week: the releases, the markets and what moved the model.
Latest week · headline 4.4% (term spread + EBP), model 1.6%
- Kill rule K4 is triggered: the term spread + EBP benchmark, 4.4% this week, is the headline. The model figures below are the 12-block model's.
- Recession probability 1.6%, down from 2.5% (official September) (yield curve alone: 7.4%).
- Nonfarm payrolls: +29k in September 2026 (prior +133k).
- Unemployment rate: 4.2% in September 2026 (prior 4.1%).
- Initial jobless claims: 197k (week to 26 Sep; prior 198k).
- Continuing jobless claims: 1,701k (week to 19 Sep; prior 1,712k).
- Core PCE inflation: 3.0% year on year in August 2026 (prior 3.0%).
- Real income (ex transfers): -0.1% on the month in August 2026 (prior +0.2%).
- Biggest model mover: Labor Market (-0.07 to +0.22), reducing risk.
- Next week: Chicago Fed National Financial Conditions Index (Wed); Unemployment Insurance Weekly Claims Report (Thu).
What came out
| Nonfarm payrolls | +29k in September 2026 (prior +133k) | Fri 02 Oct |
| Unemployment rate | 4.2% in September 2026 (prior 4.1%) | Fri 02 Oct |
| Initial jobless claims | 197k (week to 26 Sep; prior 198k) | Thu 01 Oct |
| Continuing jobless claims | 1,701k (week to 19 Sep; prior 1,712k) | Thu 01 Oct |
| Core PCE inflation | 3.0% year on year in August 2026 (prior 3.0%) | Wed 30 Sep |
| Real income (ex transfers) | -0.1% on the month in August 2026 (prior +0.2%) | Wed 30 Sep |
| Real consumer spending | +0.6% on the month in August 2026 (prior +0.1%) | Wed 30 Sep |
| Job openings (JOLTS) | 7.08m in August 2026 (prior 7.33m) | Tue 29 Sep |
| Chicago Fed financial conditions | -0.5 in week to 25 Sep (prior -0.6) | Wed 30 Sep |
stronger weaker than the prior reading, for the economy.
Markets this week
| Market | Level | Week |
|---|---|---|
| Yield curve (10y − 3m) | 1.09% | +16 bp |
| 10-year Treasury yield (latest day; the Signals tab shows the monthly average) | 5.24% | +7 bp |
| WTI oil | 96.16 | +12.8% |
| Broad dollar index | 120.33 | +0.0% |
What moved the model
| Labor Market | -0.07 → +0.22 | reducing risk |
| The Yield Curve Complex | -0.37 → -0.24 | reducing risk |
| Uncertainty, Sentiment & Text | -4.00 → -1.34 | no weight in the model |
| Household & Consumer | +0.54 → +0.42 | no weight in the model |
A block score averages every signal in the block against its own history, so it can improve after a weak headline release (a small payroll gain, say) when its other signals, such as claims, hours and employment rates, strengthen. The Today tab lists the strongest and weakest signals in the block that moved most.
Coming up next week
| Wed 07 Oct | Chicago Fed National Financial Conditions Index |
| Thu 08 Oct | Unemployment Insurance Weekly Claims Report |
Portfolio
See how your holdings have behaved in past recessions, weighted by today's odds. Your files are read on this device only: nothing is uploaded, sent or saved.
Choose one or more CSV exports: Yahoo Finance portfolio files (Symbol, Current Price, Quantity, Transaction Type) or broker holdings downloads such as Vanguard's (Account Number, Symbol, Shares, Share Price, Total Value). Each Yahoo file is one portfolio; each account in a broker file becomes its own portfolio. Identical files are counted once.
Risk library: 1,728 stocks and ETFs, built 03 Oct 2026. Recession probability used: 4.4%, the term spread + EBP headline while kill rule K4 stands (the model reads 1.6%).
Method
Every layer of the calculation for this forecast (2 Oct 2026), with the Python behind each step. The headline is the term spread + excess bond premium benchmark; both are shown in full.
The headline: term spread + excess bond premium
A two-variable probit, the benchmark kill rule K4 names. It carries the headline while it beats the 12-block model out of sample.
| Term | Input x | Weight β | β × x |
|---|---|---|---|
| Intercept | -0.5228 | ||
| 10-year minus 3-month Treasury spread, percentage points | +1.0800 | -0.8549 | -0.9233 |
| Excess bond premium, percentage points | -0.2886 | +0.9152 | -0.2641 |
| Total (η) | -1.7103 |
Probability = Φ(-1.7103) = 4.36% (matches the logged figure)
Fitted at this forecast on 527 months (1973-04 to 2024-04) whose outcome the NBER had made known, covering the recessions that began after Nov 1973, Jan 1980, Jul 1981, Jul 1990, Mar 2001 and Dec 2007. No penalty and no sign constraint: a steeper curve lowers the probability and a higher excess bond premium raises it, as estimated. The inputs are the month's average spread and the latest published premium; the premium's history before 2012 was not available in real time, which flatters this model's record.
View the Python · recession.live.benchmark_detail 33 lines
def benchmark_detail(T: pd.Timestamp, scores: Optional[pd.DataFrame] = None,
paths: Optional[pd.DataFrame] = None) -> Optional[dict]:
"""
The term spread + EBP probit at decision date T, refitted exactly as
forecast() fits it (same training rows, same penalty), for the Method tab:
coefficients, today's inputs, eta and the probability. None if the stored
features no longer reach T.
"""
from scipy.stats import norm
fd = features.FEATURE_DIR
scores = pd.read_parquet(fd / "block_scores.parquet") if scores is None else scores
paths = pd.read_parquet(fd / "feature_paths.parquet") if paths is None else paths
panel = _panel(scores, paths)
if T not in panel.index:
return None
blocks = model.block_columns(panel)
present = panel[blocks].notna().sum(axis=1) >= model.MIN_BLOCKS_PRESENT
tr = model._training_rows(panel, T) & present
rows = tr & panel["term_spread"].notna() & panel["ebp"].notna()
fit = Probit(1e-6).fit(panel.loc[rows, ["term_spread", "ebp"]].values, panel.loc[rows, "y"].values)
x = panel.loc[T, ["term_spread", "ebp"]]
if x.isna().any():
return None
a, b1, b2 = (float(v) for v in fit.beta)
eta = a + b1 * float(x["term_spread"]) + b2 * float(x["ebp"])
peaks = sorted(str(p)[:7] for p in panel.loc[rows & (panel["y"] == 1), "peak"].dropna().unique())
lo, hi = (float(v) for v in fit.interval(x.values.astype(float)[None, :])[0])
return {"intercept": a, "b_ts": b1, "b_ebp": b2, "ts": float(x["term_spread"]), "ebp": float(x["ebp"]),
"eta": eta, "p": float(norm.cdf(eta)), "interval_80": (lo, hi),
"train_months": int(rows.sum()), "peaks": peaks,
"first": f"{panel.index[rows].min():%Y-%m}", "last": f"{panel.index[rows].max():%Y-%m}"}
View the Python · recession.live.headline 13 lines
def headline(f: dict) -> dict:
"""
The number published as the headline. The model's own forecast is always
logged; when a triggered kill rule says so, the benchmark is published
instead (if it could be computed for the same date).
"""
rules = [k["id"] for k in f.get("kill_criteria", [])
if k["status"] == "TRIGGERED" and k["id"] in BENCHMARK_HEADLINE_RULES]
bench = f["benchmarks"].get(K4_BENCHMARK)
if rules and bench is not None:
return {"series": "benchmark", "probability": bench, "rules": rules}
return {"series": "model", "probability": f["probability"], "rules": rules}
View the Python · recession.live.k4_status 30 lines
def k4_status(scorecard: Optional[pd.DataFrame] = None) -> tuple[str, str]:
"""
K4 from the latest Stage 4 scorecard: TRIGGERED if the term spread + EBP
benchmark (the one the rule's action names) beats the model on AUROC in
EITHER window. The first version compared against the plain term spread
on 1990+ only, which reported "ok" while the named benchmark was ahead in
both windows (page corrections, 3 Oct 2026). AUPRC is reported, not judged.
"""
if scorecard is None:
sc = model.STAGE4_DIR / "scorecard.csv"
if not sc.exists():
return "pending", "no scorecard yet"
scorecard = pd.read_csv(sc)
card = scorecard.set_index(["window", "predictor"])
auroc, auprc, lost = [], [], []
for window, short in K4_WINDOWS:
try:
m, b = card.loc[(window, V2)], card.loc[(window, K4_BENCHMARK)]
except KeyError:
return "pending", f"scorecard has no {short} rows for the model and {K4_BENCHMARK}"
auroc.append(f"{m['AUROC']:.3f} vs {b['AUROC']:.3f} ({short})")
auprc.append(f"{m['AUPRC']:.3f} vs {b['AUPRC']:.3f}")
if b["AUROC"] > m["AUROC"]:
lost.append(short)
detail = (f"AUROC: model vs term spread + EBP {', '.join(auroc)}. "
f"AUPRC: {' and '.join(auprc)}.")
if lost:
detail += f" Benchmark ahead on AUROC in {' and '.join(lost)}."
return ("TRIGGERED" if lost else "ok"), detail
The 12-block model, step by step
- Collect the data as it was known. Every series is stored with each version ever published (FRED/ALFRED), so the model only sees figures released by the decision date. Before a series' first archived vintage, its earliest vintage is used with a conservative release delay.
- Transform each series into a change or spread (table below). Monthly changes are averaged over 3 months, because a single month is mostly noise. Daily and weekly series are averaged to months first.
View the Python · recession.features.apply_transform 25 lines
def apply_transform(x: pd.Series, tx: R.Tx, freq: str) -> pd.Series: ppy = PERIODS_PER_YEAR[freq] if tx is R.Tx.NONE: y = x elif tx is R.Tx.DIFF: y = x.diff() elif tx is R.Tx.DIFF2: y = x.diff().diff() elif tx is R.Tx.LOG_DIFF: y = 100 * _log(x).diff() elif tx is R.Tx.LOG_DIFF2: y = 100 * _log(x).diff().diff() elif tx is R.Tx.YOY: y = 100 * (x / x.shift(ppy) - 1) elif tx is R.Tx.PCT_6M_ANN: y = 100 * ((x / x.shift(max(ppy // 2, 1))) ** 2 - 1) elif tx is R.Tx.MAX_3Y_INCREASE: lp = 100 * _log(x) y = (lp - lp.shift(1).rolling(3 * ppy, min_periods=3 * ppy).max()).clip(lower=0) else: raise NotImplementedError(f"transform {tx.value} is not used by any Stage 3 feature") if tx in DIFF_LIKE and freq == "M": y = y.rolling(SMOOTH_MONTHS, min_periods=SMOOTH_MONTHS).mean() return y - Standardise each one against its own history up to that month only: z = (value − median) ÷ scale, where scale = interquartile range ÷ 1.349 (the standard deviation's equivalent for normal data), capped at ±4. Both are shown for every factor below.
View the Python · recession.features.expanding_robust_z 16 lines
def expanding_robust_z(paths: pd.DataFrame) -> pd.DataFrame: """ z(T) from the median and IQR of the feature's own real-time path up to T. Event-type features (the Hamilton oil shock is zero most months; oil was price-controlled before 1973) have an IQR of zero. There the scale falls back to the expanding standard deviation, so a rare non-zero value still registers instead of dividing by zero. """ ex = paths.expanding(MIN_HISTORY_MONTHS) med = ex.median() scale = (ex.quantile(0.75) - ex.quantile(0.25)) / 1.349 scale = scale.where(scale > 0, ex.std()) z = (paths - med) / scale.where(scale > 0) return z.replace([np.inf, -np.inf], np.nan).clip(-Z_CLIP, Z_CLIP) - Orient and average: multiply by −sign so negative always means recession-like, then average within each block. Indexes are left out before the date they were first published.
View the Python · recession.features.block_scores 15 lines
def block_scores(z: pd.DataFrame, specs: list[Spec], included: list[str]) -> tuple[pd.DataFrame, pd.DataFrame]: """Equal-weight mean of signed z within each block. Negative = recessionary.""" sign = {s.key: s.sign for s in specs} z = mask_unpublished(z) signed = pd.DataFrame({k: -sign[k] * z[k] for k in included}) block_of = {s.key: s.block for s in specs} names = {b.number: b.name for b in R.BLOCKS} scores, counts = {}, {} for b in sorted({block_of[k] for k in included}): cols = [k for k in included if block_of[k] == b] label = f"B{b:02d} {names[b]}" scores[label] = signed[cols].mean(axis=1) counts[label] = signed[cols].notna().sum(axis=1) return pd.DataFrame(scores), pd.DataFrame(counts) - Combine with a probit: probability = Φ(intercept + Σ weight × block score), where Φ is the standard normal distribution.
View the Python · recession.model.Probit 61 lines
class Probit: """ Probit with an L2 penalty on slopes. Fisher-information covariance for intervals. sign_constrained=True forces every slope <= 0: inputs are block scores oriented so that NEGATIVE = recessionary (registry sign convention), so a weaker block may only RAISE the probability. The constraint encodes the registry's declared signs; it is not estimated from the data. """ def __init__(self, lam: float, sign_constrained: bool = False): self.lam = lam self.sign_constrained = sign_constrained self.beta: np.ndarray | None = None self.cov: np.ndarray | None = None @staticmethod def _X(x: np.ndarray) -> np.ndarray: return np.column_stack([np.ones(len(x)), x]) def fit(self, x: np.ndarray, y: np.ndarray) -> "Probit": X = self._X(x) pen = np.full(X.shape[1], self.lam) pen[0] = 0.0 def nll(b): eta = X @ b ll = y * norm.logcdf(eta) + (1 - y) * norm.logcdf(-eta) # d/deta of the log-likelihood, computed stably g_pos = np.exp(norm.logpdf(eta) - norm.logcdf(eta)) g_neg = np.exp(norm.logpdf(eta) - norm.logcdf(-eta)) grad = -(X.T @ (y * g_pos - (1 - y) * g_neg)) + pen * b return -ll.sum() + 0.5 * (pen * b * b).sum(), grad b0 = np.zeros(X.shape[1]) b0[0] = norm.ppf(np.clip(y.mean(), 0.01, 0.99)) bounds = ([(None, None)] + [(None, 0.0)] * (X.shape[1] - 1)) if self.sign_constrained else None res = minimize(nll, b0, jac=True, method="L-BFGS-B", bounds=bounds) self.converged = bool(res.success) if not res.success: import warnings warnings.warn(f"Probit did not converge: {res.message}") self.beta = res.x eta = X @ self.beta w = norm.pdf(eta) ** 2 / np.clip(norm.cdf(eta) * norm.cdf(-eta), 1e-12, None) H = X.T @ (X * w[:, None]) + np.diag(pen) self.cov = np.linalg.pinv(H) return self def predict(self, x: np.ndarray) -> np.ndarray: return norm.cdf(self._X(x) @ self.beta) def interval(self, x: np.ndarray, q=(0.1, 0.9), draws: int = 4000, seed: int = 0) -> np.ndarray: """Probability quantiles from parameter uncertainty (Laplace approximation).""" rng = np.random.default_rng(seed) # Unclipped draws: clipping constrained slopes at 0 pushed the whole # interval upward and off-centre from the point estimate (audit B). B = rng.multivariate_normal(self.beta, self.cov, size=draws) p = norm.cdf(self._X(x) @ B.T) return np.quantile(p, q, axis=1).TView the Python · recession.live.forecast 87 lines
def forecast(scores: Optional[pd.DataFrame] = None, paths: Optional[pd.DataFrame] = None, counts: Optional[pd.DataFrame] = None, decision: Optional[str] = None, as_of: Optional[str] = None) -> dict: """ decision="YYYY-MM": the official month-end forecast for that month. as_of="YYYY-MM-DD": an in-month update using everything published by that day (requires the Stage 3 paths to include that date: run_stage3(extra_date=...)). """ fd = features.FEATURE_DIR scores = pd.read_parquet(fd / "block_scores.parquet") if scores is None else scores paths = pd.read_parquet(fd / "feature_paths.parquet") if paths is None else paths counts = pd.read_parquet(fd / "block_counts.parquet") if counts is None else counts panel = _panel(scores, paths) blocks = model.block_columns(panel) present = panel[blocks].notna().sum(axis=1) >= model.MIN_BLOCKS_PRESENT if as_of is not None: T = pd.Timestamp(as_of).normalize() # in-month (event) update elif decision: T = pd.Timestamp(decision) + pd.offsets.MonthEnd(0) # official month-end else: T = panel.index[present & panel.index.is_month_end][-1] earlier = panel.index[present & (panel.index < T)] prev = earlier[-1] kind = "month-end" if T.is_month_end else "in-month" Xb = panel[blocks].fillna(0.0) tr = model._training_rows(panel, T) & present y = panel.loc[tr, "y"].values v2 = Probit(model.RIDGE_LAMBDA, sign_constrained=True).fit(Xb.loc[tr].values, y) ts_rows = tr & panel["term_spread"].notna() ts = Probit(1e-6).fit(panel.loc[ts_rows, ["term_spread"]].values, panel.loc[ts_rows, "y"].values) te_rows = ts_rows & panel["ebp"].notna() tsebp = Probit(1e-6).fit(panel.loc[te_rows, ["term_spread", "ebp"]].values, panel.loc[te_rows, "y"].values) x, xp = Xb.loc[[T]].values, Xb.loc[[prev]].values p, p_prev = float(v2.predict(x)[0]), float(v2.predict(xp)[0]) lo, hi = (float(v) for v in v2.interval(x)[0]) beta = v2.beta[1:] def bench(fit, cols, when): row = panel.loc[[when], cols] return float(fit.predict(row.values)[0]) if row.notna().all(axis=None) else None ind = model.indicator_benchmarks(pd.DatetimeIndex([T])).iloc[0] block_rows = {} for j, b in enumerate(blocks): now, before = float(Xb.loc[T, b]), float(Xb.loc[prev, b]) recent = counts[b].loc[:T].iloc[-25:-1] block_rows[b] = { "score": round(now, 3), "score_prev": round(before, 3), "weight": round(float(beta[j]), 6), "contribution": round(float(beta[j] * now), 4), # probit index units; + = more risk "change_contribution": round(float(beta[j] * (now - before)), 4), "factors": int(counts.loc[T, b]) if T in counts.index and pd.notna(counts.loc[T, b]) else 0, "usual_factors": int(recent.max()) if len(recent) else 0, } out = { "decision_month": f"{T:%Y-%m}", "kind": kind, "as_of": f"{T:%Y-%m-%d}", "compared_with": f"{prev:%Y-%m-%d}", "probability": round(p, 4), "probability_exact": p, "intercept": round(float(v2.beta[0]), 6), "ridge_lambda": model.RIDGE_LAMBDA, "interval_80": [round(lo, 4), round(hi, 4)], "probability_prev_month_same_model": round(p_prev, 4), "alarm_threshold": DECISIONS.alarm_threshold, "alarm": p >= DECISIONS.alarm_threshold, "benchmarks": { "Term spread + EBP probit": bench(tsebp, ["term_spread", "ebp"], T), "Term spread probit": bench(ts, ["term_spread"], T), "Fed Board TS+EBP probability (published)": _num(ind["Fed Board TS+EBP probability (published)"]), "Chauvet-Piger probability": _num(ind["Chauvet-Piger probability"]), "Sahm rule (real-time)": _num(ind["Sahm rule (real-time)"]), }, "blocks": block_rows, "features_included": None, # filled by the caller from the Stage 3 report "train_months": int(tr.sum()), "base_rate": round(float(y.mean()), 4), # what "no skill" would have forecast (K3) "recessions_in_training": int(panel.loc[tr & (panel["y"] == 1), "peak"].nunique()), } out["flags"] = flags(out) out["kill_criteria"] = kill_status(out) out["explanation"] = explain(out) return out
| Transform | What it computes |
|---|---|
| NONE | the level as published |
| DIFF | change from the previous period |
| LOG_DIFF | 100 × change in the logarithm, about the % change from the previous period |
| YOY | % change from a year earlier |
| MAX_3Y_INCREASE | rise above the highest level of the previous 3 years (Hamilton's net oil price increase) |
From raw data to block scores
Open a block to see every factor: its value, the median and scale it is standardised with, its z-score and its signed contribution.
Real Activity & Outputblock score +0.077 = average of 11 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Real GDP | GDPC1 | LOG_DIFF | 0.549 | 0.632 | 0.548 | -0.15 | -1 | -0.15 |
| Real gross domestic income | A261RX1Q020SBEA | LOG_DIFF | 0.653 | 0.721 | 0.642 | -0.11 | -1 | -0.11 |
| Industrial production | INDPRO | LOG_DIFF | 0.139 | 0.235 | 0.396 | -0.24 | -1 | -0.24 |
| Capacity utilization | TCU | DIFF | 0.037 | 0.037 | 0.321 | +0.00 | -1 | +0.00 |
| Real personal income less transfers | W875RX1 | LOG_DIFF | 0.129 | 0.228 | 0.234 | -0.42 | -1 | -0.42 |
| Real personal consumption expenditures | PCEC96 | LOG_DIFF | 0.337 | 0.248 | 0.206 | +0.43 | -1 | +0.43 |
| Real manufacturing & trade sales | CMRMTSPL | LOG_DIFF | 0.428 | 0.263 | 0.399 | +0.41 | -1 | +0.41 |
| Core capital goods orders | NEWORDER | LOG_DIFF | 1.27 | 0.379 | 1.22 | +0.73 | -1 | +0.73 |
| Heavy truck sales | HTRUCKSSAAR | LOG_DIFF | -4.78 | 0.280 | 3.08 | -1.64 | -1 | -1.64 |
| Cass Freight shipments index | FRGSHPUSM649NCIS | YOY | licensed | +0.38 | -1 | +0.38 | ||
| Electricity output | IPG2211S | YOY | 7.00 | 1.95 | 3.47 | +1.45 | -1 | +1.45 |
Labor Marketblock score +0.220 = average of 13 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Nonfarm payrolls | PAYEMS | LOG_DIFF | 0.032 | 0.142 | 0.125 | -0.88 | -1 | -0.88 |
| Household survey employment | CE16OV | LOG_DIFF | 0.182 | 0.117 | 0.163 | +0.40 | -1 | +0.40 |
| Initial jobless claims, 4-week average | IC4WSA | YOY | -14.38 | -3.59 | 12.61 | -0.86 | +1 | +0.86 |
| Continuing claims | CCSA | YOY | -11.06 | -4.38 | 14.46 | -0.46 | +1 | +0.46 |
| Insured unemployment rate | IURSA | DIFF | -0.033 | -0.008 | 0.043 | -0.58 | +1 | +0.58 |
| Average weekly hours, manufacturing | AWHMAN | DIFF | 0.100 | 0.000 | 0.099 | +1.01 | -1 | +1.01 |
| Average weekly hours, all private | AWHAETP | DIFF | 0.033 | 0.000 | 0.049 | +0.67 | -1 | +0.67 |
| Temporary help services employment | TEMPHELPS | LOG_DIFF | -0.276 | 0.328 | 0.665 | -0.91 | -1 | -0.91 |
| Quits rate | JTSQUR | DIFF | -0.033 | 0.000 | 0.049 | -0.67 | -1 | -0.67 |
| Job openings | JTSJOL | LOG_DIFF | -2.09 | 0.230 | 1.94 | -1.20 | -1 | -1.20 |
| Layoffs and discharges | JTSLDL | LOG_DIFF | -2.35 | -0.422 | 2.49 | -0.78 | +1 | +0.78 |
| Prime-age employment-population ratio | LNS12300060 | DIFF | 0.167 | 0.033 | 0.099 | +1.35 | -1 | +1.35 |
| Indeed job postings index | IHLIDXUS | YOY | licensed | +0.41 | -1 | +0.41 | ||
Household & Consumerblock score +0.419 = average of 8 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Real disposable personal income | DSPIC96 | LOG_DIFF | 0.214 | 0.224 | 0.231 | -0.04 | -1 | -0.04 |
| U. Michigan consumer sentiment | UMCSENT | DIFF | licensed | +1.06 | -1 | +1.06 | ||
| Retail sales, control group | RSXFS | LOG_DIFF | 0.377 | 0.403 | 0.294 | -0.09 | -1 | -0.09 |
| Real retail & food services sales | RRSFS | LOG_DIFF | 0.321 | 0.179 | 0.335 | +0.42 | -1 | +0.42 |
| Total vehicle sales, SAAR | TOTALSA | LOG_DIFF | -1.67 | 0.173 | 1.94 | -0.95 | -1 | -0.95 |
| Credit card delinquency, all banks | DRCCLACBS | DIFF | -0.060 | -0.020 | 0.156 | -0.26 | +1 | +0.26 |
| Household net worth | TNWBSHNO | LOG_DIFF | 6.76 | 1.90 | 1.76 | +2.76 | -1 | +2.76 |
| SLOOS consumer credit standards | DRTSCLCC | NONE | 6.70 | 5.60 | 16.01 | +0.07 | +1 | -0.07 |
Business, Orders & Surveysblock score +0.325 = average of 6 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Empire State manufacturing survey | GACDISA066MSFRBNY | NONE | 7.60 | 7.43 | 15.89 | +0.01 | -1 | +0.01 |
| Philadelphia Fed manufacturing survey | GACDFSA066MSFRBPHI | NONE | 37.80 | 10.75 | 16.92 | +1.60 | -1 | +1.60 |
| Chicago Fed National Activity Index | CFNAI | NONE | -0.040 | 0.050 | 0.608 | -0.15 | -1 | -0.15 |
| CFNAI diffusion index | CFNAIDIFF | NONE | 0.020 | 0.070 | 0.378 | -0.13 | -1 | -0.13 |
| Corporate profits, NIPA basis | CPATAX | YOY | 18.16 | 6.78 | 12.59 | +0.90 | -1 | +0.90 |
| Business formation applications | BAHBATOTALSAUS | LOG_DIFF | -0.364 | 0.092 | 1.62 | -0.28 | -1 | -0.28 |
Credit & Financial Conditionsblock score +0.338 = average of 14 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Moody's Baa minus 10-year Treasury | BAA10Y | DIFF | licensed | -0.29 | +1 | +0.29 | ||
| Moody's Aaa minus 10-year Treasury | AAA10Y | DIFF | licensed | -0.70 | +1 | +0.70 | ||
| Excess bond premium (Gilchrist-Zakrajsek) | EBP | NONE | -0.289 | -0.047 | 0.344 | -0.70 | +1 | +0.70 |
| Chicago Fed National Financial Conditions Index | NFCI | NONE | -0.555 | -0.505 | 0.476 | -0.10 | +1 | +0.10 |
| Adjusted NFCI | ANFCI | NONE | -0.585 | -0.265 | 0.604 | -0.53 | +1 | +0.53 |
| NFCI credit subindex | NFCICREDIT | NONE | -0.062 | -0.259 | 0.513 | +0.38 | +1 | -0.38 |
| NFCI leverage subindex | NFCILEVERAGE | NONE | 0.084 | -0.235 | 0.641 | +0.50 | +1 | -0.50 |
| St. Louis Fed financial stress index | STLFSI4 | NONE | -0.787 | -0.268 | 0.558 | -0.93 | +1 | +0.93 |
| Kansas City Fed financial stress index | KCFSI | NONE | -0.946 | -0.410 | 0.619 | -0.87 | +1 | +0.87 |
| SLOOS: C&I tightening, large firms | DRTSCILM | NONE | 0.000 | 0.000 | 17.79 | +0.00 | +1 | -0.00 |
| SLOOS: CRE standards | SUBLPDRCSN | NONE | -11.30 | 7.00 | 17.38 | -1.05 | +1 | +1.05 |
| SLOOS: loan demand | DRSDCILM | NONE | 16.10 | 0.000 | 23.94 | +0.67 | -1 | +0.67 |
| Total bank credit | TOTBKCR | YOY | 6.08 | 6.69 | 3.33 | -0.18 | -1 | -0.18 |
| Bank deposits | DPSACBW027SBOG | YOY | 6.64 | 6.81 | 2.87 | -0.06 | -1 | -0.06 |
Monetary Policy, Rates & Liquidityblock score -1.040 = average of 9 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Effective fed funds rate | DFF | DIFF | 0.084 | 0.001 | 0.129 | +0.65 | +1 | -0.65 |
| 5-year real yield | DFII5 | DIFF | 0.193 | -0.006 | 0.108 | +1.84 | +1 | -1.84 |
| 10-year real yield | DFII10 | DIFF | 0.176 | -0.006 | 0.093 | +1.94 | +1 | -1.94 |
| M2 money stock | M2SL | YOY | 5.66 | 6.63 | 2.93 | -0.33 | -1 | -0.33 |
| Real M2 | M2REAL | YOY | 2.19 | 2.99 | 3.81 | -0.21 | -1 | -0.21 |
| Fed balance sheet total assets | WALCL | YOY | 2.07 | 3.76 | 11.52 | -0.15 | -1 | -0.15 |
| Reserve balances at Federal Reserve banks | WRESBAL | LOG_DIFF | -0.717 | -0.065 | 2.93 | -0.22 | -1 | -0.22 |
| Overnight reverse repo balances | RRPONTSYD | DIFF | -0.177 | 0.002 | 7.61 | -0.02 | -1 | -0.02 |
| Treasury General Account | WTREGEN | LOG_DIFF | 18,333 | 0.028 | 1.23 | +4.00 | +1 | -4.00 |
The Yield Curve Complexblock score -0.239 = average of 2 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| 10-year minus 3-month Treasury spread | T10Y3M | NONE | 1.08 | 1.28 | 1.48 | -0.14 | -1 | -0.14 |
| 10-year minus 2-year Treasury spread | T10Y2Y | NONE | 0.455 | 0.778 | 0.945 | -0.34 | -1 | -0.34 |
Inflation & Pricesblock score -0.479 = average of 3 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| WTI crude oil | DCOILWTICO | LOG_DIFF | 4.59 | 0.000 | 2.69 | +1.71 | +1 | -1.71 |
| Hamilton net oil price increase | OIL_SHOCK | MAX_3Y_INCREASE | 0.000 | 0.000 | 3.84 | +0.00 | +1 | -0.00 |
| Natural gas, Henry Hub | DHHNGSP | LOG_DIFF | -2.17 | -0.024 | 7.96 | -0.27 | +1 | +0.27 |
Housing & Constructionblock score +0.104 = average of 9 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Building permits | PERMIT | LOG_DIFF | -0.166 | 0.310 | 2.58 | -0.18 | -1 | -0.18 |
| Housing starts | HOUST | LOG_DIFF | 2.52 | 0.014 | 3.55 | +0.71 | -1 | +0.71 |
| New home sales | HSN1F | LOG_DIFF | 2.43 | 0.160 | 3.54 | +0.64 | -1 | +0.64 |
| Months' supply of new homes | MSACSR | DIFF | -0.233 | 0.000 | 0.222 | -1.05 | +1 | +1.05 |
| 30-year fixed mortgage rate | MORTGAGE30US | DIFF | licensed | +1.83 | +1 | -1.83 | ||
| Residential fixed investment share of GDP | A011RE1Q156NBEA | DIFF | -0.100 | 0.000 | 0.148 | -0.67 | -1 | -0.67 |
| Total construction spending | TTLCONS | LOG_DIFF | 0.530 | 0.317 | 0.701 | +0.30 | -1 | +0.30 |
| Private nonresidential construction | PNRESCONS | LOG_DIFF | 1.03 | 0.143 | 0.956 | +0.93 | -1 | +0.93 |
| Rental vacancy rate | RRVRUSQ156N | DIFF | 0.000 | 0.000 | 0.297 | +0.00 | +1 | -0.00 |
Equity, Volatility & Cross-Assetblock score +0.202 = average of 2 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Equity drawdown from trailing 12-month high | SP500 | NONE | licensed | -0.21 | +1 | +0.21 | ||
| CBOE volatility index | VIXCLS | NONE | licensed | -0.19 | +1 | +0.19 | ||
Commodities & Dollarblock score +0.368 = average of 3 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Broad trade-weighted dollar index | DTWEXBGS | LOG_DIFF | -0.320 | 0.010 | 0.810 | -0.41 | +1 | +0.41 |
| Advanced-economy dollar index | DTWEXAFEGS | LOG_DIFF | -0.163 | 0.087 | 0.962 | -0.26 | +1 | +0.26 |
| Agricultural commodity index | WPU01 | YOY | -2.45 | 1.42 | 8.85 | -0.44 | +1 | +0.44 |
Uncertainty, Sentiment & Textblock score -1.341 = average of 1 signed values
| Factor | Series | Transform | Value | Median | Scale | z-score | Sign | Signed z |
|---|---|---|---|---|---|---|---|---|
| Economic Policy Uncertainty index | USEPUINDXD | NONE | 160.6 | 98.34 | 46.42 | +1.34 | +1 | -1.34 |
From block scores to a probability
| Block | Score x | Weight β | β × x |
|---|---|---|---|
| Intercept | -1.8917 | ||
| Real Activity & Output | +0.0770 | -0.1163 | -0.0090 |
| Labor Market | +0.2200 | -0.4037 | -0.0888 |
| Household & Consumer | +0.4190 | +0.0000 | +0.0000 |
| Business, Orders & Surveys | +0.3250 | -0.4564 | -0.1483 |
| Credit & Financial Conditions | +0.3380 | +0.0000 | +0.0000 |
| Monetary Policy, Rates & Liquidity | -1.0400 | +0.0000 | -0.0000 |
| The Yield Curve Complex | -0.2390 | -0.6519 | +0.1558 |
| Inflation & Prices | -0.4790 | -0.0854 | +0.0409 |
| Housing & Construction | +0.1040 | +0.0000 | +0.0000 |
| Equity, Volatility & Cross-Asset | +0.2020 | -0.1231 | -0.0249 |
| Commodities & Dollar | +0.3680 | -0.5043 | -0.1856 |
| Uncertainty, Sentiment & Text | -1.3410 | +0.0000 | -0.0000 |
| Total (η) | -2.1515 |
Probability = Φ(-2.1515) = 1.57% (logged: 1.57%)
Does one recession drive the weights?
The model refitted 7 more times, leaving out one recession's run-up each time
| Block | All 7 recessions | Range, one left out | Weakest without | Times at zero |
|---|---|---|---|---|
| Real Activity & Output | -0.12 | -0.30 to -0.03 | Jan 1980 | 0 |
| Labor Market | -0.40 | -0.48 to -0.22 | Mar 2001 | 0 |
| Business, Orders & Surveys | -0.46 | -0.58 to -0.25 | Jul 1990 | 0 |
| The Yield Curve Complex | -0.65 | -0.75 to -0.58 | Mar 2001 | 0 |
| Inflation & Prices | -0.09 | -0.16 to -0.05 | Mar 2001 | 0 |
| Equity, Volatility & Cross-Asset | -0.12 | -0.19 to +0.00 | Mar 2001 | 1 |
| Commodities & Dollar | -0.50 | -0.58 to -0.41 | Nov 1973 | 0 |
Weights that fall below half their size, or to zero, when one recession is dropped rest mainly on that episode: Real Activity & Output and Equity, Volatility & Cross-Asset. Stability is not proof of forecasting power: these fits still learn from the same history. The out-of-sample test is the scorecard behind kill rule K4, which this model currently loses to the two-signal benchmark.
View the Python · recession.live.weight_stability 28 lines
def weight_stability(T: pd.Timestamp, scores: Optional[pd.DataFrame] = None,
paths: Optional[pd.DataFrame] = None) -> Optional[pd.DataFrame]:
"""
Leave one recession out: refit the 12-block model exactly as forecast()
does at decision date T, once with all training months and once without
each recession's run-up (the months labelled for that peak). A weight that
holds its size whichever recession is dropped rests on more than one
episode; one that collapses when a single recession is removed is fragile.
Rows: "all" and each left-out peak; columns: one weight per block.
"""
fd = features.FEATURE_DIR
scores = pd.read_parquet(fd / "block_scores.parquet") if scores is None else scores
paths = pd.read_parquet(fd / "feature_paths.parquet") if paths is None else paths
panel = _panel(scores, paths)
blocks = model.block_columns(panel)
present = panel[blocks].notna().sum(axis=1) >= model.MIN_BLOCKS_PRESENT
Xb = panel[blocks].fillna(0.0)
tr = model._training_rows(panel, T) & present
peaks = sorted(panel.loc[tr & (panel["y"] == 1), "peak"].dropna().unique())
names = {b.number: b.name for b in R.BLOCKS}
label = lambda c: f"B{int(c[1:3]):02d} {names.get(int(c[1:3]), c)}" if c[:1] == "B" and c[1:3].isdigit() else c
rows = {}
for drop in [None] + peaks:
keep = tr & ~(panel["peak"] == drop) if drop is not None else tr
fit = Probit(model.RIDGE_LAMBDA, sign_constrained=True).fit(Xb.loc[keep].values, panel.loc[keep, "y"].values)
rows["all" if drop is None else str(drop)[:7]] = fit.beta[1:]
return pd.DataFrame(rows, index=[label(c) for c in blocks]).T
How the weights are fit
- Refitted at every forecast on 640 months covering 7 recessions: only months whose outcome the NBER had announced by the decision date, ending at least 12 months before it (the forecast horizon), so no answer leaks in.
- A ridge penalty (λ = 10.0) shrinks the weights toward zero, because seven recessions cannot pin down twelve weights precisely.
- Every weight is constrained to be zero or negative: a weaker block can only raise the probability. Blocks at zero add nothing once the others are known.
- 2020 is excluded as an exogenous shock.
View the Python · recession.model._training_rows 6 lines
def _training_rows(panel: pd.DataFrame, origin: pd.Timestamp) -> pd.Series:
return (panel["y"].notna()
& (panel["known_from"] <= origin)
& (panel.index <= origin - pd.offsets.MonthEnd(EMBARGO_MONTHS))
& ~panel["exogenous"].astype(bool))
The 80% range and the backtest
- 80% range (0.7–3.4%). 4,000 sets of weights are drawn from their estimated uncertainty (a Laplace approximation of the fit); the range holds the middle 80% of the resulting probabilities. It covers uncertainty in the weights only; the audit estimated model-choice uncertainty at roughly 2–11% for this month.
- Backtest. From January 1980 each month is forecast with a model refitted every 12 months on the recessions announced by then, using the data as it was known then. The Track record section scores those forecasts. Before about 2010 most inputs come from later-revised data, so that record is an optimistic ceiling.