The yield curve as a recession signal: what fifty years show

In July 2022 the yield on two-year US Treasuries rose above the yield on ten-year ones and stayed there for 26 months. Every time that had happened for more than a few weeks in the previous half century, a recession had followed within two years. This time, more than four years later, none has been declared.

The inverted yield curve is the best-known recession signal there is. So I went back through fifty years of the data to see what it has called, what it has missed, and what that says about how to use it.

Line chart of the 10-year minus 2-year US Treasury yield spread, monthly from 1976 to 2026, with recessions shaded. The spread fell below zero before the recessions of 1980, 1981, 1990, 2001 and 2008, and from July 2022 to August 2024 with no recession following by October 2026.

What an inverted curve is saying

Normally a lender wants more for ten years than for two, so the ten-year yield sits above the two-year and the difference, the spread, is positive. The two-year yield follows where the market thinks the Federal Reserve’s rate will be over the next couple of years. The ten-year yield follows the longer view.

When the two-year rises above the ten-year, the market is saying that rates are high now and will be lower later. The usual reason for rates to be lower later is that the economy has weakened enough for the Fed to cut. That is the whole logic of the signal. There is a second channel too: banks borrow short and lend long, so an inverted curve squeezes the margin on new lending, and credit gets tighter.

Five signals, five recessions

To keep one-month dips out, I count a signal only when the monthly average of the spread has been below zero for three months running. On that rule the ten-year minus two-year spread gave five signals between 1976 and 2019, and a recession followed every one.

Inverted from Months Deepest Recession began Lead Last inverted
Sep 1978 20 −2.14 Feb 1980 17 months Jan 1980
Sep 1980 14 −1.36 Aug 1981 11 months Jul 1981
Jan 1989 6 −0.32 Aug 1990 19 months Mar 1990
Feb 2000 11 −0.41 Apr 2001 14 months Dec 2000
Jun 2006 10 −0.15 Jan 2008 19 months May 2007
Jul 2022 26 −0.93 None by Oct 2026 51 months so far Aug 2024

Monthly averages of the daily spread, in percentage points, from the Federal Reserve through FRED. “Months” is the length of the first unbroken run below zero. Recession dates are the first full month of each recession as dated by the NBER.

The lead time ran from 11 to 19 months and averaged 16. That is the first thing to understand about this indicator. Even when it worked perfectly, it told you that a recession was coming at some point in the next year or two, which is a statement about the cycle and useless for timing a trade.

The second thing is in the last column. In 1990, 2001 and 2008 the curve had already turned positive again before the recession began, by five, four and eight months. The curve stops being inverted when short yields fall, and short yields fall when the market starts pricing rate cuts in earnest. So the end of an inversion has never been an all-clear. In three of the five cases the recession began within eight months of it.

The recession it did not call

The 2020 recession had no signal on this rule. The spread closed below zero on three days in August 2019, and the lowest it reached was −0.04. The curve built from three-month bills did invert, for five months from May 2019.

I would not score that one either way. The recession that arrived in 2020 was caused by a pandemic, and no bond market forecasts those. Whether the slowdown the curve was hinting at in 2019 would have become a recession on its own is something nobody can know.

The signal with no recession

The 2022 inversion is the hard case. The spread first closed below zero on 1 April 2022 and gave a signal on my rule from July. It then stayed inverted for 26 months, the longest run in the series, against 20 months in 1978 to 1980. It closed below zero on 541 trading days. On 3 July 2023 it reached −1.08, the most inverted it had been since 1981.

The economy slowed, but it did not break. Unemployment was 3.5 per cent in July 2022, touched 3.4 per cent in April 2023, rose to 4.5 per cent by November 2025 and was back at 4.1 per cent in October 2026. The NBER has declared no recession. It dates them with a long delay, a full year in the case of the 2008 recession, so “none by October 2026” means none declared. But 51 months have passed since the signal, and the longest lead in the table is 19.

How confident the model was

Counting inversions treats every one alike. The more careful way to use the curve, and the one the New York Fed has published for years, turns the spread into a probability. I fitted the same kind of model, a probit, on 708 months from 1960 to 2018, using the ten-year yield minus the three-month bill, and asked what the spread in each month said about a recession twelve months later:

\[P(\text{recession within 12 months}) = \Phi(\alpha + \beta\,S_t)\]

Φ is the cumulative normal distribution and S is the spread in percentage points. The fit gives α = −0.45 and β = −0.73. A flat curve means a 32 per cent chance of a recession a year later. A curve inverted by one point means 61 per cent.

Line chart of the probability of a US recession 12 months ahead implied by the 10-year minus 3-month Treasury spread, monthly from 1960 to 2026, with recessions shaded. The probability reached 93% before the 1981 recession and 76% in May 2023, after which no recession followed.

The useful comparison is the highest probability the model reached in the two years before each recession. It was 40 per cent before 1970, 68 per cent before 1973, 78 per cent and 93 per cent before the two recessions of 1980 and 1981, then 29 per cent before 1990, 47 per cent before 2001, 43 per cent before 2008 and 41 per cent before 2020. In the last four recessions the curve never said better than even odds.

In May 2023 it said 76 per cent. It stayed above 50 per cent for 21 months, from December 2022 to September 2024. That was the most confident call the model had made since 1981, and none of those months was in the period it was fitted on. It was a true out-of-sample forecast, and it was wrong.

Why I think it failed this time

The first thing to rule out is a distorted curve. The ten-year yield is the market’s expected path of short rates plus a term premium, the extra return investors demand for lending long. If the premium had been crushed, for example by years of central-bank bond buying, the curve could have inverted without anyone expecting cuts. The Federal Reserve’s Kim and Wright model splits the ten-year yield into those two parts, and the deepest month of each inversion since 1990 looks like this:

Deepest month 10-year minus 2-year Term premium Expected path
Apr 2000 −0.41 +1.26 −1.67
Nov 2006 −0.15 +0.54 −0.69
Jul 2023 −0.93 +0.11 −1.04

Monthly averages, percentage points. Expected path is the ten-year yield minus its term premium, minus the two-year yield. Term premium from the Kim and Wright model (FRED series THREEFYTP10).

The premium in July 2023 was small but positive, and the inversion was almost entirely expectations: the market priced the two-year yield about a point above where it expected rates to average over the next ten years. That is the same message as in 2000 and 2006. The curve was not broken. It was forecasting cuts, and the cuts came.

An inverted curve forecasts lower short rates. It has been a recession signal because, in the past, the only thing that brought rates down quickly was a recession. This time there was another route. Inflation fell from 9.1 per cent in June 2022 to 2.6 per cent in October 2024 without a collapse in demand, and the Fed was able to cut in late 2024 and again in late 2025 because prices had slowed, while the economy kept growing. So the curve’s forecast of lower rates came true, and the recession that usually comes with it did not.

The second reason is how slowly the higher rates reached anyone. The federal funds rate went from 0.08 per cent in February 2022 to 5.33 per cent by August 2023, the fastest rise since the early 1980s. A curve signal works through the cost of credit, and this time most of the credit had been fixed in advance. American households had refinanced into 30-year fixed-rate mortgages at the 2020 and 2021 lows, so the rate rise reached new borrowers, not the stock of debt.

The Federal Reserve’s household debt service ratio, payments on mortgages and consumer debt as a share of disposable income, shows it. It was 15.8 per cent at the end of 2007. It fell to 9.1 per cent in the first quarter of 2021, and after the fastest tightening in forty years its highest reading since 2022 has been 11.3 per cent, at the end of 2025. That is still below the 11.7 per cent of the end of 2019, before any of this started. The squeeze the curve was pricing never arrived in household budgets.

The third reason is fiscal. The federal deficit was 6.2 per cent of GDP in 2024 and 5.8 per cent in 2025, with unemployment close to 4 per cent. Tight money was pushing one way and loose budgets the other, which is the argument I made in the piece on how the pandemic changed the channel. A signal calibrated on decades in which monetary policy did most of the work was always going to struggle in one where it did not.

The squeeze on banks was real. Silicon Valley Bank failed on 10 March 2023, two days after the spread had closed at −1.07, and Signature Bank and First Republic followed within two months. The failures were contained, and the tightening of credit that the curve implied did not turn into a recession.

What I do with it now

I still watch the curve. I have stopped treating it as a verdict.

An inversion tells me the market expects the Fed to cut. Whether the cuts come because of a recession or because inflation has fallen is a separate question, and the curve cannot answer it. For that I want indicators that sit closer to real activity: how hard the ethylene crackers are running, consumer confidence, and what the jobs report is saying underneath the headline. When the curve and those agree, I take it seriously. When payrolls keep growing month after month, as they did all through 2023, the curve on its own is not enough.

The three-month version is worth keeping beside it, because the two can disagree. The ten-year minus three-month spread stayed inverted for 25 months from November 2022, and it dipped below zero again for three months from June 2025, by a few hundredths of a point. On my own rule that counts as a fresh signal on that measure. It is a marginal one, but it meets the rule, so it goes on the record.

The ten-year minus two-year spread was +0.35 on 6 November 2026. The Fed raised rates by a quarter point in September 2026, which I covered in the piece on Fed decision days, and when the Fed is tightening the two-year yield usually rises faster than the ten-year. If the curve inverts again I will note the date and start counting, knowing that the last count has run past four years.

Checking it yourself

The curve, recession, probability, term premium, debt service and unemployment figures above come from the script below. It needs pandas and numpy and reads each series straight from FRED, so no API key is required. The probit is fitted by hand, so nothing beyond those two libraries is needed. The inflation and deficit figures are from the pandemic piece, which has its own script.

from math import erf

import numpy as np
import pandas as pd

FRED = "https://fred.stlouisfed.org/graph/fredgraph.csv?id="


def fred(series):
    return pd.read_csv(FRED + series, index_col=0, parse_dates=True,
                       na_values=".").squeeze().dropna()


def runs(negative, least=3):
    """First month, last month and length of each run of inverted months."""
    block = (negative != negative.shift()).cumsum()
    found = [(g.index[0], g.index[-1], len(g))
             for _, g in negative[negative].groupby(block)]
    return [run for run in found if run[2] >= least]


def months(a, b):
    return (b.year - a.year) * 12 + b.month - a.month


daily = fred("T10Y2Y").loc[:"2026-11-06"]     # 10-year minus 2-year yield
spread = daily.resample("MS").mean()
rec = fred("USREC").loc[spread.index[0]:]     # 1 in an NBER recession month
starts = rec.index[(rec == 1) & (rec.shift() == 0)]

print("Signal    months  deepest  recession  lead  last inverted")
matched = set()
for first, last, n in runs(spread < 0):
    if rec.get(first, 0) == 1:
        continue                              # began inside a recession
    low = spread[first:last].min()
    later = starts[starts > first]
    if len(later):
        s = later[0]
        matched.add(s)
        before = spread[first:s - pd.DateOffset(months=1)]
        final = before[before < 0].index[-1]
        print(f"{first:%b %Y}  {n:6}  {low:7.2f}  {s:%b %Y}   {months(first, s):4}"
              f"  {final:%b %Y}")
    else:
        print(f"{first:%b %Y}  {n:6}  {low:7.2f}  none by {rec.index[-1]:%b %Y},"
              f" {months(first, rec.index[-1])} months on")
print("Recessions with no signal first:",
      ", ".join(f"{s:%b %Y}" for s in starts if s not in matched) or "none")

y19 = daily.loc["2019"]
print(f"2019: {int((y19 < 0).sum())} trading days below zero,",
      f"lowest {y19.min():.2f} on {y19.idxmin():%d %b %Y}")
neg = daily.loc["2022":][daily.loc["2022":] < 0]
print(f"2022-24: {len(neg)} trading days below zero, {neg.index[0]:%d %b %Y}",
      f"to {neg.index[-1]:%d %b %Y}, lowest {neg.min():.2f} on {neg.idxmin():%d %b %Y}")
print(f"Latest: {daily.iloc[-1]:+.2f} on {daily.index[-1]:%d %b %Y}")

bills = fred("T10Y3M").loc[:"2026-11-06"].resample("MS").mean()
print("10-year minus 3-month, runs of three months or more:",
      ", ".join(f"{a:%b %Y} ({n})" for a, b, n in runs(bills < 0)))

u = fred("UNRATE").loc["2022":]
print(f"Unemployment: {u['2022-07-01']:.1f}% in Jul 2022, low {u.min():.1f}%",
      f"({u.idxmin():%b %Y}), high {u.max():.1f}% ({u.idxmax():%b %Y}),",
      f"latest {u.iloc[-1]:.1f}% ({u.index[-1]:%b %Y})")

# Why 2022 was different: a probit model, the term premium and debt service
Phi = np.vectorize(lambda z: 0.5 * (1 + erf(z / 2 ** 0.5)))


def probit(x, y):
    """Maximum-likelihood probit of y (0 or 1) on x, by Fisher scoring."""
    X = np.column_stack([np.ones(len(x)), x])
    y = np.asarray(y, float)
    b = np.zeros(2)
    for _ in range(100):
        z = X @ b
        p = np.clip(Phi(z), 1e-12, 1 - 1e-12)
        f = np.exp(-z * z / 2) / np.sqrt(2 * np.pi)
        g = X.T @ (f * (y - p) / (p * (1 - p)))
        H = (X * (f * f / (p * (1 - p)))[:, None]).T @ X
        step = np.linalg.solve(H, g)
        b += step
        if np.abs(step).sum() < 1e-10:
            break
    return b


usrec = fred("USREC")
m3 = (fred("GS10") - fred("TB3MS")).dropna()   # monthly 10-year minus 3-month
fit = pd.DataFrame({"s": m3, "y": usrec.shift(-12)}).loc["1960":"2018"].dropna()
a, b = probit(fit.s, fit.y)
prob = pd.Series(Phi(a + b * m3), index=m3.index)
print(f"Probit, 1960-2018 ({len(fit)} months): P(recession in 12 months) ="
      f" Phi({a:.2f} {b:+.2f} x spread); spread 0: {Phi(a):.0%}, spread -1: {Phi(a - b):.0%}")
begins = usrec.index[(usrec == 1) & (usrec.shift() == 0)]
print("Highest probability in the 24 months before each recession:",
      ", ".join(f"{s:%b %Y} {prob[s - pd.DateOffset(months=24):s - pd.DateOffset(months=1)].max():.0%}"
                for s in begins[begins >= "1962"]))
late = prob.loc["2022":]
over = late.index[late > 0.5]
span = f", {over[0]:%b %Y} to {over[-1]:%b %Y}" if len(over) else ""
print(f"Since 2022: peak {late.max():.0%} ({late.idxmax():%b %Y}); above 50% in {len(over)}"
      f" months{span}; latest {late.iloc[-1]:.0%} ({late.index[-1]:%b %Y})")

month = lambda s: fred(s).loc[:"2026-11-06"].resample("MS").mean()
y10, y2, tp = month("DGS10"), month("DGS2"), month("THREEFYTP10")   # Kim-Wright
print("Deepest month  10y-2y  term premium  expected path (10y - premium - 2y)")
for first, last, n in runs(spread.loc["1990":] < 0):
    worst = spread[first:last].idxmin()
    print(f"{worst:%b %Y}      {spread[worst]:+.2f}         {tp[worst]:+.2f}"
          f"          {y10[worst] - tp[worst] - y2[worst]:+.2f}")

ff, dsr = fred("FEDFUNDS"), fred("TDSP")       # debt service, % of disposable income
q = lambda d: f"Q{(d.month - 1) // 3 + 1} {d.year}"
top = dsr.loc["2022":]
print(f"Fed funds {ff['2022-02-01']:.2f}% (Feb 2022) to {ff.loc['2022':].max():.2f}%"
      f" ({ff.loc['2022':].idxmax():%b %Y})")
print(f"Household debt service: {dsr['2007-10-01']:.1f}% (Q4 2007), {dsr['2019-10-01']:.1f}% (Q4 2019),"
      f" low {dsr.loc['2020':'2021'].min():.1f}% ({q(dsr.loc['2020':'2021'].idxmin())}),"
      f" highest since 2022 {top.max():.1f}% ({q(top.idxmax())}), latest {dsr.iloc[-1]:.1f}% ({q(dsr.index[-1])})")

Run in November 2026 it prints:

Signal    months  deepest  recession  lead  last inverted
Sep 1978      20    -2.14  Feb 1980     17  Jan 1980
Sep 1980      14    -1.36  Aug 1981     11  Jul 1981
Jan 1989       6    -0.32  Aug 1990     19  Mar 1990
Feb 2000      11    -0.41  Apr 2001     14  Dec 2000
Jun 2006      10    -0.15  Jan 2008     19  May 2007
Jul 2022      26    -0.93  none by Oct 2026, 51 months on
Recessions with no signal first: Mar 2020
2019: 3 trading days below zero, lowest -0.04 on 27 Aug 2019
2022-24: 541 trading days below zero, 01 Apr 2022 to 05 Sep 2024, lowest -1.08 on 03 Jul 2023
Latest: +0.35 on 06 Nov 2026
10-year minus 3-month, runs of three months or more: Jun 1989 (3), Jul 2000 (7), Aug 2006 (10), May 2019 (5), Nov 2022 (25), Jun 2025 (3)
Unemployment: 3.5% in Jul 2022, low 3.4% (Apr 2023), high 4.5% (Nov 2025), latest 4.1% (Oct 2026)
Probit, 1960-2018 (708 months): P(recession in 12 months) = Phi(-0.45 -0.73 x spread); spread 0: 32%, spread -1: 61%
Highest probability in the 24 months before each recession: Jan 1970 40%, Dec 1973 68%, Feb 1980 78%, Aug 1981 93%, Aug 1990 29%, Apr 2001 47%, Jan 2008 43%, Mar 2020 41%
Since 2022: peak 76% (May 2023); above 50% in 21 months, Dec 2022 to Sep 2024; latest 11% (Oct 2026)
Deepest month  10y-2y  term premium  expected path (10y - premium - 2y)
Apr 2000      -0.41         +1.26          -1.67
Nov 2006      -0.15         +0.54          -0.69
Jul 2023      -0.93         +0.11          -1.04
Fed funds 0.08% (Feb 2022) to 5.33% (Aug 2023)
Household debt service: 15.8% (Q4 2007), 11.7% (Q4 2019), low 9.1% (Q1 2021), highest since 2022 11.3% (Q4 2025), latest 11.1% (Q2 2026)

Related articles

About the author

Caio Marchesani is a hedge fund manager, trader, engineer and all-round investor. He holds an MEng in Mechanical Engineering from University College London and has spent more than fifteen years in energy and macro markets. After working for Deutsche Bank and hedge funds, he became a partner at Oil Analytics and then set up his own quantitative macro energy fund in London. Outside finance he invests in and builds businesses. He founded Acai Berry Foods, the açaí café brand that has grown from London to the UAE and New York.

Read the full biography

Scroll to Top