What Is the 3m10y Spread? The Fed's Yield Curve
The 3m10y spread is the yield curve behind the New York Fed's recession model. Twenty years of readings, every inversion since 1985, and where it sits now.
The 3m10y spread is the difference between the 10-year Treasury yield and the 3-month Treasury bill yield, quoted in basis points (one basis point is a hundredth of a percentage point). It is the yield-curve measure the Federal Reserve Bank of New York feeds into its published recession-probability model, and the one Fed staff research tends to prefer over the more familiar 2s10s spread. When the 10-year yields less than the bill, the spread is negative and the curve is inverted on this measure.
What is the 3m10y spread?
Take the 10-year constant-maturity Treasury yield, subtract the 3-month constant-maturity yield, and multiply by 100 to get basis points. The two legs are different animals. A 3-month bill matures in thirteen weeks, and over a window that short its yield sits within a few basis points of the federal funds rate the Fed sets at each meeting. The 10-year yield is the market's blend of where short rates are expected to average over the coming decade, plus a term premium: the extra yield investors ask for holding a long bond through ten years of uncertainty. Side by side, the spread answers one plain question. How far is the 10-year yield above, or below, where the Fed has set the policy rate right now?
Why does the Fed watch 3m10y instead of 2s10s?
Estrella and Mishkin's 1996 research at the New York Fed built the recession-probability model the bank still updates monthly, and it uses the 3-month bill against the 10-year note. A 2018 paper by Fed Board economists Engstrom and Sharpe made a related argument: most of the curve's forecasting power sits at the front end, between the current policy rate and where the market expects it within about six quarters. The 2-year yield sits between those points, a forecast of the policy rate averaged over two years rather than the rate itself. 2s10s, then, compares two forecasts, while 3m10y compares a forecast (the 10-year) against a fact (the policy rate, as the bill expresses it). The 2022 hiking cycle shows the difference in actual yields.
| month | month_label | three_month_yield | two_year_yield | ten_year_yield |
|---|---|---|---|---|
| 2021-07-01 | Jul 2021 | 0.05 | 0.22 | 1.32 |
| 2021-08-01 | Aug 2021 | 0.05 | 0.22 | 1.28 |
| 2021-09-01 | Sep 2021 | 0.04 | 0.24 | 1.37 |
| 2021-10-01 | Oct 2021 | 0.05 | 0.39 | 1.58 |
| 2021-11-01 | Nov 2021 | 0.05 | 0.51 | 1.56 |
| 2021-12-01 | Dec 2021 | 0.06 | 0.68 | 1.47 |
| 2022-01-01 | Jan 2022 | 0.15 | 0.98 | 1.76 |
| 2022-02-01 | Feb 2022 | 0.31 | 1.44 | 1.93 |
| 2022-03-01 | Mar 2022 | 0.45 | 1.91 | 2.13 |
| 2022-04-01 | Apr 2022 | 0.76 | 2.54 | 2.75 |
| 2022-05-01 | May 2022 | 0.99 | 2.62 | 2.9 |
| 2022-06-01 | Jun 2022 | 1.54 | 3 | 3.14 |
| 2022-07-01 | Jul 2022 | 2.3 | 3.04 | 2.9 |
| 2022-08-01 | Aug 2022 | 2.72 | 3.25 | 2.9 |
| 2022-09-01 | Sep 2022 | 3.22 | 3.86 | 3.52 |
| 2022-10-01 | Oct 2022 | 3.87 | 4.38 | 3.98 |
| 2022-11-01 | Nov 2022 | 4.32 | 4.5 | 3.89 |
| 2022-12-01 | Dec 2022 | 4.36 | 4.29 | 3.62 |
| 2023-01-01 | Jan 2023 | 4.69 | 4.21 | 3.53 |
| 2023-02-01 | Feb 2023 | 4.79 | 4.53 | 3.75 |
The exact SQL behind every number
SELECT
toStartOfMonth(date) AS month,
formatDateTime(month, '%b %Y') AS month_label,
round(avg(toFloat64(yield_3_month)), 2) AS three_month_yield,
round(avg(toFloat64(yield_2_year)), 2) AS two_year_yield,
round(avg(toFloat64(yield_10_year)), 2) AS ten_year_yield
FROM global_markets.treasury_yields
WHERE date >= toDate('2021-07-01')
AND date < toDate('2025-01-01')
AND yield_3_month > 0
AND yield_2_year > 0
AND yield_10_year > 0
GROUP BY month
ORDER BY monthFrom Jul 2021 to Dec 2024, the 3-month yield went from 0.05% to 4.39%, the 2-year from 0.22% to 4.23%, and the 10-year from 1.32% to 4.39%. The paths, more than the endpoints, are the lesson. The 2-year climbed first, months ahead of the first hike in March 2022. The 3-month climbed in steps, each step landing in the weeks after an FOMC decision, then sat on a plateau while the 2-year drifted beneath it. Ahead of the first cut in September 2024 the 2-year fell; the 3-month fell only afterward. A spread built on the 3-month reads the policy rate as it is. A spread built on the 2-year reads it as the market expects it to become.
Twenty years of the 3m10y spread, month by month
The panel below averages each month's daily closes over the past twenty years and plots 3m10y next to 2s10s on one axis.
| month | month_label | spread_3m10y_bps | spread_2s10s_bps |
|---|---|---|---|
| 2006-09-01 | Sep 2006 | -21 | -5 |
| 2006-10-01 | Oct 2006 | -32 | -7 |
| 2006-11-01 | Nov 2006 | -48 | -15 |
| 2006-12-01 | Dec 2006 | -41 | -11 |
| 2007-01-01 | Jan 2007 | -35 | -12 |
| 2007-02-01 | Feb 2007 | -44 | -13 |
| 2007-03-01 | Mar 2007 | -52 | -1 |
| 2007-04-01 | Apr 2007 | -31 | 3 |
| 2007-05-01 | May 2007 | -12 | -2 |
| 2007-06-01 | Jun 2007 | 36 | 12 |
| 2007-07-01 | Jul 2007 | 4 | 19 |
| 2007-08-01 | Aug 2007 | 36 | 36 |
| 2007-09-01 | Sep 2007 | 53 | 51 |
| 2007-10-01 | Oct 2007 | 52 | 56 |
| 2007-11-01 | Nov 2007 | 79 | 81 |
| 2007-12-01 | Dec 2007 | 103 | 98 |
| 2008-01-01 | Jan 2008 | 92 | 127 |
| 2008-02-01 | Feb 2008 | 156 | 176 |
| 2008-03-01 | Mar 2008 | 223 | 189 |
| 2008-04-01 | Apr 2008 | 236 | 163 |
The exact SQL behind every number
SELECT
toStartOfMonth(date) AS month,
formatDateTime(month, '%b %Y') AS month_label,
toInt32(round(avg(toFloat64(yield_10_year) - toFloat64(yield_3_month)) * 100)) AS spread_3m10y_bps,
toInt32(round(avg(toFloat64(yield_10_year) - toFloat64(yield_2_year)) * 100)) AS spread_2s10s_bps
FROM global_markets.treasury_yields
WHERE date >= toStartOfMonth(subtractYears(today(), 20))
AND yield_3_month > 0
AND yield_2_year > 0
AND yield_10_year > 0
GROUP BY month
ORDER BY monthThe series runs from Sep 2006 through Sep 2026, 241 months in all, with the final month a partial reading while it is still in progress. The latest monthly average is 88 bps for 3m10y and 38 bps for 2s10s. Two features repeat in every cycle. The 3m10y line swings through a wider range than 2s10s, one leg of it pinned to the policy rate while the other floats. And it turns later, both into an inversion and out of one: the 2-year moves when the market expects the Fed to act, the 3-month moves when the Fed acts.
Every 3m10y inversion since 1985
An inversion is any stretch in which the spread is negative. Counted on daily closes, the curve can flicker across zero for a day and back, which splits one episode into a dozen fragments. The panel below uses monthly averages instead: an episode starts in the first month whose average spread is below zero and ends with the last consecutive month that stays there. Depth is the lowest monthly average inside the episode.
| began | ended | start_date | months_inverted | deepest_month_bps | average_depth_bps |
|---|---|---|---|---|---|
| Jun 1989 | Aug 1989 | 1989-06-01 | 3 | -16 | -11 |
| Nov 1989 | Dec 1989 | 1989-11-01 | 2 | -7 | -6 |
| Jul 2000 | Jan 2001 | 2000-07-01 | 7 | -70 | -42 |
| Aug 2006 | May 2007 | 2006-08-01 | 10 | -52 | -34 |
| May 2019 | Sep 2019 | 2019-05-01 | 5 | -36 | -17 |
| Feb 2020 | Feb 2020 | 2020-02-01 | 1 | -4 | -4 |
| Nov 2022 | Nov 2024 | 2022-11-01 | 25 | -173 | -115 |
| Mar 2025 | Apr 2025 | 2025-03-01 | 2 | -6 | -5 |
| Jun 2025 | Aug 2025 | 2025-06-01 | 3 | -4 | -3 |
The exact SQL behind every number
SELECT
formatDateTime(min(month), '%b %Y') AS began,
formatDateTime(max(month), '%b %Y') AS ended,
toString(min(month)) AS start_date,
count() AS months_inverted,
toInt32(round(min(spread_bps))) AS deepest_month_bps,
toInt32(round(avg(spread_bps))) AS average_depth_bps
FROM
(
SELECT
month,
spread_bps,
sum(if(spread_bps < 0, 0, 1)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS run_id
FROM
(
SELECT
toStartOfMonth(date) AS month,
avg(toFloat64(yield_10_year) - toFloat64(yield_3_month)) * 100 AS spread_bps
FROM global_markets.treasury_yields
WHERE date >= toDate('1985-01-01')
AND yield_3_month > 0
AND yield_10_year > 0
GROUP BY month
)
)
WHERE spread_bps < 0
GROUP BY run_id
ORDER BY start_dateThat definition produces 9 episodes since 1985. The earliest on the table began in Jun 1989 and lasted 3 months. The most recent began in Jun 2025, lasted 3 months, and bottomed at -4 bps in its deepest month, averaging -3 bps across the whole stretch. On the NBER's business-cycle chronology, recessions began in July 1990, March 2001, December 2007, and February 2020, each within about two years of an episode on this table. That regularity is what the New York Fed model rests on: the 3m10y spread has preceded past recessions, with lead times that ranged from a few months to nearly two years. The lead time is the part no model pins down.
Where is the 3m10y spread today?
The last three months of daily closes, both legs and both spreads:
| date | date_label | three_month_yield | ten_year_yield | spread_3m10y_bps | spread_2s10s_bps |
|---|---|---|---|---|---|
| 2026-06-22 | Jun 22, 2026 | 3.85 | 4.51 | 66 | 27 |
| 2026-06-23 | Jun 23, 2026 | 3.85 | 4.5 | 65 | 34 |
| 2026-06-24 | Jun 24, 2026 | 3.85 | 4.41 | 56 | 30 |
| 2026-06-25 | Jun 25, 2026 | 3.84 | 4.4 | 56 | 31 |
| 2026-06-26 | Jun 26, 2026 | 3.83 | 4.38 | 55 | 31 |
| 2026-06-29 | Jun 29, 2026 | 3.87 | 4.38 | 51 | 28 |
| 2026-06-30 | Jun 30, 2026 | 3.87 | 4.44 | 57 | 30 |
| 2026-07-01 | Jul 1, 2026 | 3.85 | 4.48 | 63 | 31 |
| 2026-07-02 | Jul 2, 2026 | 3.82 | 4.49 | 67 | 35 |
| 2026-07-06 | Jul 6, 2026 | 3.87 | 4.48 | 61 | 35 |
| 2026-07-07 | Jul 7, 2026 | 3.86 | 4.55 | 69 | 36 |
| 2026-07-08 | Jul 8, 2026 | 3.87 | 4.56 | 69 | 35 |
| 2026-07-09 | Jul 9, 2026 | 3.83 | 4.54 | 71 | 38 |
| 2026-07-10 | Jul 10, 2026 | 3.85 | 4.56 | 71 | 35 |
| 2026-07-13 | Jul 13, 2026 | 3.89 | 4.62 | 73 | 36 |
| 2026-07-14 | Jul 14, 2026 | 3.84 | 4.58 | 74 | 40 |
| 2026-07-15 | Jul 15, 2026 | 3.83 | 4.55 | 72 | 42 |
| 2026-07-16 | Jul 16, 2026 | 3.84 | 4.57 | 73 | 41 |
| 2026-07-17 | Jul 17, 2026 | 3.85 | 4.55 | 70 | 37 |
| 2026-07-20 | Jul 20, 2026 | 3.86 | 4.6 | 74 | 39 |
The exact SQL behind every number
SELECT
date,
formatDateTime(date, '%b %e, %Y') AS date_label,
round(max(toFloat64(yield_3_month)), 2) AS three_month_yield,
round(max(toFloat64(yield_10_year)), 2) AS ten_year_yield,
toInt32(round((max(toFloat64(yield_10_year)) - max(toFloat64(yield_3_month))) * 100)) AS spread_3m10y_bps,
toInt32(round((max(toFloat64(yield_10_year)) - max(toFloat64(yield_2_year))) * 100)) AS spread_2s10s_bps
FROM global_markets.treasury_yields
WHERE date >= today() - 90
AND yield_3_month > 0
AND yield_2_year > 0
AND yield_10_year > 0
GROUP BY date
ORDER BY dateAs of Sep 15, 2026, the 3-month yield closed at 4.11% and the 10-year at 5%, a 3m10y spread of 89 bps; 2s10s closed the same session at 33 bps. The sign carries the reading. A positive number means the 10-year yields more than the bill; a negative one means the curve is inverted on this measure. For how the front end arrived here, the Treasury curve through the first half of 2026 walks each tenor month by month, and how markets price Fed rate odds covers the futures-implied path that the 2-year already embeds and the 3-month does not.
Where 2s10s and 3m10y disagreed
The two spreads agree most of the time. The splits are where the teaching is, and three are worth knowing. The panel below counts, for each window, the sessions on which each spread closed below zero, and shows the first and last such close beside the deepest print.
| label | days_2s10s_inverted | days_3m10y_inverted | deepest_2s10s_bps | deepest_3m10y_bps | first_2s10s_inversion | first_3m10y_inversion | last_2s10s_inversion | last_3m10y_inversion |
|---|---|---|---|---|---|---|---|---|
| 2006-07 | 235 | 243 | -19 | -64 | Jan 31, 2006 | Jan 17, 2006 | Jun 5, 2007 | Aug 27, 2007 |
| 2019 | 3 | 104 | -4 | -52 | Aug 27, 2019 | Mar 22, 2019 | Aug 29, 2019 | Oct 10, 2019 |
| 2022-24 | 541 | 535 | -108 | -189 | Apr 1, 2022 | Oct 18, 2022 | Sep 5, 2024 | Dec 12, 2024 |
The exact SQL behind every number
SELECT
label,
countIf(spread_2s10s_bps < 0) AS days_2s10s_inverted,
countIf(spread_3m10y_bps < 0) AS days_3m10y_inverted,
toInt32(round(min(spread_2s10s_bps))) AS deepest_2s10s_bps,
toInt32(round(min(spread_3m10y_bps))) AS deepest_3m10y_bps,
if(countIf(spread_2s10s_bps < 0) > 0,
formatDateTime(minIf(date, spread_2s10s_bps < 0), '%b %e, %Y'), 'never') AS first_2s10s_inversion,
if(countIf(spread_3m10y_bps < 0) > 0,
formatDateTime(minIf(date, spread_3m10y_bps < 0), '%b %e, %Y'), 'never') AS first_3m10y_inversion,
if(countIf(spread_2s10s_bps < 0) > 0,
formatDateTime(maxIf(date, spread_2s10s_bps < 0), '%b %e, %Y'), 'never') AS last_2s10s_inversion,
if(countIf(spread_3m10y_bps < 0) > 0,
formatDateTime(maxIf(date, spread_3m10y_bps < 0), '%b %e, %Y'), 'never') AS last_3m10y_inversion
FROM
(
SELECT
date,
multiIf(date BETWEEN toDate('2006-01-01') AND toDate('2007-12-31'), '2006-07',
date BETWEEN toDate('2019-01-01') AND toDate('2019-12-31'), '2019',
date BETWEEN toDate('2022-01-01') AND toDate('2024-12-31'), '2022-24',
'other') AS label,
(toFloat64(yield_10_year) - toFloat64(yield_2_year)) * 100 AS spread_2s10s_bps,
(toFloat64(yield_10_year) - toFloat64(yield_3_month)) * 100 AS spread_3m10y_bps
FROM global_markets.treasury_yields
WHERE date >= toDate('2006-01-01')
AND date < toDate('2025-01-01')
AND yield_3_month > 0
AND yield_2_year > 0
AND yield_10_year > 0
)
WHERE label != 'other'
GROUP BY label
ORDER BY label2006 to 2007 was broad agreement: 2s10s closed inverted on 235 sessions across the two years and 3m10y on 243, with 3m10y the deeper of the two at -64 bps against -19 bps. A recession began in December 2007, and both measures were on the right side of it.
2019 was a genuine split. 3m10y closed inverted on 104 sessions, the first on Mar 22, 2019 and the last on Oct 10, 2019, and bottomed at -52 bps. 2s10s closed inverted on 3 sessions all year. The Fed cut rates three times between July and October 2019, and the recession that arrived in February 2020 came alongside a pandemic no yield curve could have anticipated. A fair scorecard credits 3m10y with reading the 2019 easing and credits neither measure with foreseeing 2020.
2022 to 2024 was the longest 3m10y inversion on the table above, and the two measures disagreed at both ends. 2s10s first closed below zero on Apr 1, 2022; 3m10y did not until Oct 18, 2022. From there 3m10y went far deeper, bottoming at -189 bps against -108 bps for 2s10s. At the exit, 2s10s posted its last negative close on Sep 5, 2024, in the run-up to the Fed's first cut on September 18, 2024; 3m10y stayed negative until Dec 12, 2024, roughly three months into the cutting cycle. Through the first half of 2026 the NBER had not added a business-cycle peak after February 2020 to its chronology, and on the recession question both measures were wrong for the same stretch of time. On the mechanics, each did its job: 2s10s moved when cuts became expected, 3m10y moved when they were delivered. The macro picture entering the second half of 2026 picks up the story from there.
FAQ
What is the 3m10y spread?
The 3m10y spread is the 10-year Treasury yield minus the 3-month Treasury bill yield, expressed in basis points. A negative reading means the bill yields more than the note, which is called an inverted curve. It is the version of the yield curve used in the New York Fed's recession-probability model.
Is the 3m10y spread a better recession indicator than 2s10s?
Fed research has generally favored 3m10y, or the near-term forward spread, on the argument that the short end reads the current policy rate directly while the 2-year reads a forecast of it. Both measures inverted ahead of the 1990, 2001, 2007, and 2020 recessions, and both inverted from 2022 to 2024 with no recession dated through the first half of 2026. Neither works as a timer.
What does it mean when the 3m10y spread is inverted?
An inverted 3m10y means investors are lending to the Treasury for ten years at a lower yield than the Fed's current policy rate, as the 3-month bill expresses it. Read plainly, the bond market expects short rates over the coming decade to average below today's level once a term premium is allowed for. It describes expected rates; it does not date any event.
How does the New York Fed turn the spread into a recession probability?
The model is a probit regression: it takes the monthly average of the 3m10y spread and maps it to the probability of a recession beginning within the next twelve months, fitted on decades of history. The bank publishes the updated figure each month. Its inputs are its own monthly bill and note series; the panels on this page use the Treasury's constant-maturity 3-month and 10-year yields, and the two spreads can differ by a few basis points in a given month.
Every panel on this page carries the SQL that produced it. To pull the same series for any pair of tenors, or to rebuild the inversion table on daily closes rather than monthly averages, ask the Strasmore terminal in plain English.