What Happens When the Yield Curve Un-Inverts
Which leg did the work: 2-year and 10-year moves over the 91 days before each crossingtable ·
2026-09-19 · 7×9
SPY's change from the crossing-day close, 3, 6 and 12 months after each un-inversiontable ·
2026-09-19 · 2×5
The 2s10s spread by month, full historyseries ·
2026-09-19 · 604×5
The 2s10s over the trailing six months, with the 2-year and 10-year moves that produced itseries ·
2026-09-19 · 26×8
Every 2s10s un-inversion: the crossing and the spread 3, 6 and 12 months latertable ·
2026-09-19 · 7×8
Which leg did the work: 2-year and 10-year moves over the 91 days before each crossing
Which leg did the work: 2-year and 10-year moves over the 91 days before each crossing
| episode | crossed_on | y2_91d_before | y2_at_cross | y10_91d_before | y10_at_cross | y2_change_bp | y10_change_bp | steepener_type |
|---|---|---|---|---|---|---|---|---|
| May 1980 | 1980-05-02 | 12.04 | 10.04 | 11.29 | 10.24 | -200 | -105 | bull steepener (2-year fell most) |
| Oct 1981 | 1981-10-28 | 15.76 | 15.42 | 14.61 | 15.44 | -34 | 83 | bear steepener (10-year rose most) |
| Jul 1982 | 1982-07-19 | 14.18 | 13.52 | 13.66 | 13.68 | -66 | 2 | bull steepener (2-year fell most) |
| Jun 1989 | 1989-06-30 | 9.73 | 8.08 | 9.3 | 8.1 | -165 | -120 | bull steepener (2-year fell most) |
| Dec 2000 | 2000-12-27 | 6 | 5.1 | 5.83 | 5.11 | -90 | -72 | bull steepener (2-year fell most) |
| Mar 2007 | 2007-03-21 | 4.71 | 4.51 | 4.6 | 4.53 | -20 | -7 | bull steepener (2-year fell most) |
| Sep 2024 | 2024-09-04 | 4.72 | 3.76 | 4.29 | 3.77 | -96 | -52 | bull steepener (2-year fell most) |
the exact SQL behind every number
WITH
daily AS
(
SELECT
date,
dateDiff('day', toDate('1970-01-01'), date) AS dnum,
ifNull(toFloat64(max(yield_2_year)), 0.) AS y2,
ifNull(toFloat64(max(yield_10_year)), 0.) AS y10,
y10 - y2 AS spread
FROM global_markets.treasury_yields
WHERE yield_2_year > 0 AND yield_10_year > 0
GROUP BY date
),
scored AS
(
SELECT
date, dnum, y2, y10, spread,
count() OVER (ORDER BY date ROWS BETWEEN 60 PRECEDING AND 1 PRECEDING) AS rows_prior,
sum(spread < 0) OVER (ORDER BY date ROWS BETWEEN 60 PRECEDING AND 1 PRECEDING) AS neg_prior,
sum(spread > 0) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING) AS pos_next
FROM daily
),
candidates AS
(
SELECT
date, dnum, y2, y10, spread,
lagInFrame(dnum, 1, toInt64(-100000)) OVER (ORDER BY dnum ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_dnum
FROM scored
WHERE spread > 0 AND rows_prior = 60 AND neg_prior >= 35 AND pos_next >= 19
),
episodes AS
(
SELECT date AS cross_date, y2, y10, spread
FROM candidates
WHERE dnum - prev_dnum > 180
AND date <= today() - 380
)
SELECT
episode,
crossed_on,
y2_91d_before,
y2_at_cross,
y10_91d_before,
y10_at_cross,
y2_change_bp,
y10_change_bp,
multiIf(
y2_change_bp < 0 AND abs(y2_change_bp) >= abs(y10_change_bp), 'bull steepener (2-year fell most)',
y10_change_bp > 0 AND abs(y10_change_bp) > abs(y2_change_bp), 'bear steepener (10-year rose most)',
'mixed'
) AS steepener_type
FROM
(
SELECT
formatDateTime(e.cross_date, '%b %Y') AS episode,
toString(toDate(e.cross_date)) AS crossed_on,
round(argMinIf(d.y2, d.date, d.date >= addDays(e.cross_date, -91)), 2) AS y2_91d_before,
round(any(e.y2), 2) AS y2_at_cross,
round(argMinIf(d.y10, d.date, d.date >= addDays(e.cross_date, -91)), 2) AS y10_91d_before,
round(any(e.y10), 2) AS y10_at_cross,
round((any(e.y2) - argMinIf(d.y2, d.date, d.date >= addDays(e.cross_date, -91))) * 100) AS y2_change_bp,
round((any(e.y10) - argMinIf(d.y10, d.date, d.date >= addDays(e.cross_date, -91))) * 100) AS y10_change_bp
FROM episodes AS e
CROSS JOIN daily AS d
WHERE d.date BETWEEN addDays(e.cross_date, -100) AND e.cross_date
GROUP BY e.cross_date
)
ORDER BY crossed_on
More from this analysisWhat Happens When the Yield Curve Un-Inverts
Every 2s10s un-inversion: the crossing and the spread 3, 6 and 12 months later
table 7×8
→
SPY's change from the crossing-day close, 3, 6 and 12 months after each un-inversion
table 2×5
→
The 2s10s spread by month, full history
series 604×5
→
The 2s10s over the trailing six months, with the 2-year and 10-year moves that produced it
series 26×8
→
See all 2,401 queries →