inversions
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-28, from what-is-the-5s30s-spread.
| started | ended | session_count | deepest_spread_bps | average_spread_bps |
|---|---|---|---|---|
| Jan 26, 2000 | Sep 15, 2000 | 163 | -61 | -40 |
| Sep 19, 2000 | Sep 26, 2000 | 6 | -4 | -2 |
| Oct 26, 2000 | Nov 1, 2000 | 5 | -7 | -4 |
| Feb 9, 2006 | Mar 13, 2006 | 22 | -12 | -5 |
| Apr 1, 2022 | Apr 7, 2022 | 5 | -12 | -8 |
| Sep 13, 2022 | Oct 21, 2022 | 28 | -43 | -21 |
| Oct 28, 2022 | Nov 8, 2022 | 8 | -18 | -9 |
| Nov 17, 2022 | Dec 27, 2022 | 27 | -27 | -11 |
| Dec 29, 2022 | Jan 6, 2023 | 6 | -12 | -5 |
| Feb 3, 2023 | Mar 10, 2023 | 25 | -46 | -22 |
| Jun 9, 2023 | Aug 2, 2023 | 37 | -36 | -16 |
| Aug 11, 2023 | Aug 17, 2023 | 5 | -7 | -4 |
| Aug 21, 2023 | Aug 31, 2023 | 9 | -14 | -7 |
| Sep 6, 2023 | Sep 22, 2023 | 13 | -12 | -5 |
- Rows × columns
- 14 × 5
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
started |
text | 14 distinct values (Apr 1, 2022, Aug 11, 2023, Aug 21, 2023…) | |
ended |
text | 14 distinct values (Apr 7, 2022, Aug 17, 2023, Aug 2, 2023…) | |
session_count |
number | 5 to 163 | count |
deepest_spread_bps |
number | -61 to -4 | |
average_spread_bps |
number | -40 to -2 |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH daily AS
(
SELECT
date,
toFloat64(yield_30_year) - toFloat64(yield_5_year) AS spread
FROM global_markets.treasury_yields
WHERE date >= subtractYears(today(), 30)
AND yield_5_year > 0
AND yield_30_year > 0
),
islands AS
(
SELECT
date,
spread,
row_number() OVER (ORDER BY date)
- row_number() OVER (PARTITION BY spread < 0 ORDER BY date) AS island
FROM daily
)
SELECT
formatDateTime(min(date), '%b %e, %Y') AS started,
formatDateTime(max(date), '%b %e, %Y') AS ended,
count() AS session_count,
round(min(spread) * 100, 0) AS deepest_spread_bps,
round(avg(spread) * 100, 0) AS average_spread_bps
FROM islands
WHERE spread < 0
GROUP BY island
HAVING session_count >= 5
ORDER BY min(date)
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.