Data AnalysisUpdated 875 words, 4 minutes
Sahm rule from FRED data: unemployment and recessions since 1960
The Sahm rule recomputed from the unemployment rate in Python and checked against the real-time series and NBER dates, including the 2024 trigger with no recession.
The Sahm rule is one of the few recession indicators simple enough to compute in three lines from one public series. This article does that, from the unemployment rate on FRED, and then checks the result two ways: against the real-time version of the indicator that FRED publishes, and against the NBER's recession dates. The point is to see what the rule did in each recession since 1960, where it fired without one, and what it reads today.
The rule
From the FRED page for SAHMREALTIME: the indicator "signals the start of a recession when the three-month moving average of the national unemployment rate (U3) rises by 0.50 percentage points or more relative to the minimum of the three-month averages from the previous 12 months." That is the whole definition.
m3 = u.rolling(3, min_periods=2).mean() # three-month average of UNRATE
low12 = m3.shift(1).rolling(12, min_periods=11).min() # lowest such average, previous 12 months
sahm = (m3 - low12).round(2) # signal when >= 0.50
The min_periods arguments are there for one reason: the UNRATE series retrieved on 2026-09-05 has no value for October 2025. With a strict three-month window every reading from October to December 2025 would be missing; with min_periods=2 the October window averages the two months that exist. That is a choice, and it is disclosed in the table below by showing the FRED real-time series next to our computation.
The data
Three monthly series from FRED, retrieved 2026-09-05: UNRATE (BLS, seasonally adjusted, from January 1948), USREC (a 0/1 flag derived from NBER peak and trough months), and SAHMREALTIME (the indicator as it was computable at the time, from December 1959). Our computation uses today's vintage of UNRATE, which has been revised through annual seasonal-factor updates; the real-time series uses the numbers available in each month. Across 800 overlapping months the mean absolute difference between the two is 0.048 points and the largest is 0.37 points, in November 1976.
Recession by recession
Output of python code/sahm-rule-unemployment-recessions.py. For each NBER recession start, the first month from three months before the start onward in which our computed value reached 0.50:
| NBER recession start | first month Sahm >= 0.50 | lag (months) | Sahm that month | real-time series that month |
|---|---|---|---|---|
| 1960-05 | 1960-10 | +5 | 0.63 | 0.93 |
| 1970-01 | 1970-03 | +2 | 0.77 | 0.80 |
| 1973-12 | 1974-07 | +7 | 0.60 | 0.57 |
| 1980-02 | 1980-02 | +0 | 0.53 | 0.30 |
| 1981-08 | 1981-11 | +3 | 0.60 | 0.80 |
| 1990-08 | 1990-10 | +2 | 0.57 | 0.40 |
| 2001-04 | 2001-06 | +2 | 0.50 | 0.53 |
| 2008-01 | 2008-02 | +1 | 0.53 | 0.43 |
| 2020-03 | 2020-04 | +1 | 4.00 | 4.00 |
The rule reached 0.50 within seven months of every recession start since 1960, and within three months for six of the nine. It is a coincident-to-lagging indicator by design: it needs unemployment to have already risen.
The real-time column matters. In February 1980 our revised-data computation reads 0.53 while the real-time series reads 0.30, so in that month the rule as actually computable had not fired; the same is true for October 1990 (0.57 revised, 0.40 real-time) and February 2008 (0.53 versus 0.43). Revised unemployment data makes the rule look a little quicker than it was.
The trigger without a recession
Months where the computed value was at least 0.50, outside any recession, not within twelve months before a recession start, and not within eighteen months after a recession end (the rule stays elevated for a while after every recession because unemployment is still high):
| month | Sahm (revised data) | UNRATE | real-time series |
|---|---|---|---|
| 1992-10 | 0.57 | 7.3 | 0.67 |
| 2003-07 | 0.50 | 6.2 | 0.47 |
| 2003-08 | 0.50 | 6.1 | 0.47 |
| 2024-07 | 0.50 | 4.2 | 0.53 |
| 2024-08 | 0.57 | 4.2 | 0.57 |
| 2024-09 | 0.53 | 4.1 | 0.50 |
The 2024 episode is the clean case: the real-time series reached 0.53 in July 2024 and 0.57 in August, the unemployment rate was 4.2 percent, and USREC records no recession in the two years since. The 1992 and 2003 readings are late tails of the 1990 to 1991 and 2001 recessions, which our eighteen-month filter did not fully exclude; on the real-time data 2003 never reached 0.50.
The recent path
| month | UNRATE | Sahm (revised data) | SAHMREALTIME |
|---|---|---|---|
| 2025-09 | 4.4 | 0.23 | 0.23 |
| 2025-10 | (none) | 0.25 | (none) |
| 2025-11 | 4.5 | 0.35 | 0.43 |
| 2025-12 | 4.4 | 0.35 | 0.35 |
| 2026-01 | 4.3 | 0.30 | 0.30 |
| 2026-03 | 4.3 | 0.20 | 0.20 |
| 2026-06 | 4.2 | 0.07 | 0.07 |
| 2026-07 | 4.1 | -0.03 | -0.03 |
| 2026-08 | 4.1 | -0.07 | -0.07 |
The highest reading since 2023 was 0.57 in August 2024. Through 2025 the value drifted between 0.1 and 0.4 as the unemployment rate rose slowly to 4.5 percent in November 2025, and it has fallen since; in August 2026 the three-month average sits 0.07 points below its twelve-month low, which is what a negative reading means. The November 2025 gap between our 0.35 and the real-time 0.43 comes from how each handles the missing October 2025 month, and we do not know how the real-time series filled it.
What it does not show
A rule that has matched nine recessions and misfired once in sixty-six years is a small sample, and the 2024 miss is recent enough that the thresholds many people quote were set before it happened. The rule was also proposed as a trigger for automatic fiscal transfers, where the cost of a false positive is money sent early, not a wrong forecast; using it as a recession call is a different application with a different loss function.
The lag column depends on the NBER's dates, which are announced many months after the fact, and on today's revised unemployment vintage. The USREC flag can change for recent months. Nothing here predicts the next reading.