Stock Returns After the First Fed Rate Hike
Lowest and highest SPY close in the twelve months after each first hiketable ·
2026-09-20 · 3×5
SPY versus its hike-day close, week by week, three cycles alignedtable ·
2026-09-20 · 53×4
SPY forward returns after the first hike of each cycletable ·
2026-09-20 · 3×5
The 2s10s Treasury spread on hike day and twelve months laterranking ·
2026-09-20 · 3×4
Lowest and highest SPY close in the twelve months after each first hike
Lowest and highest SPY close in the twelve months after each first hike
| cycle | low_vs_hike_pct | low_on | high_vs_hike_pct | high_on |
|---|---|---|---|---|
| Jun 30, 2004 | -6.7 | Aug 6, 2004 | 7.2 | Mar 7, 2005 |
| Dec 16, 2015 | -12.1 | Feb 11, 2016 | 9.5 | Dec 13, 2016 |
| Mar 16, 2022 | -18.1 | Oct 12, 2022 | 6 | Mar 29, 2022 |
the exact SQL behind every number
WITH px AS
(
SELECT
date,
toFloat64(close) AS px_close,
multiIf(date <= '2005-06-30', toDate('2004-06-30'),
date <= '2016-12-16', toDate('2015-12-16'),
toDate('2022-03-16')) AS hike_date
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND ((date >= '2004-06-30' AND date <= '2005-06-30')
OR (date >= '2015-12-16' AND date <= '2016-12-16')
OR (date >= '2022-03-16' AND date <= '2023-03-16'))
)
SELECT
formatDateTime(hike_date, '%b %e, %Y') AS cycle,
round(100 * (min(px_close) / argMin(px_close, date) - 1), 1) AS low_vs_hike_pct,
formatDateTime(argMin(date, px_close), '%b %e, %Y') AS low_on,
round(100 * (max(px_close) / argMin(px_close, date) - 1), 1) AS high_vs_hike_pct,
formatDateTime(argMax(date, px_close), '%b %e, %Y') AS high_on
FROM px
GROUP BY hike_date
ORDER BY hike_date
More from this analysisStock Returns After the First Fed Rate Hike
SPY versus its hike-day close, week by week, three cycles aligned
table 53×4
→
SPY forward returns after the first hike of each cycle
table 3×5
→
The 2s10s Treasury spread on hike day and twelve months later
ranking 3×4
→
Record closes per year, SPY (price basis, first four years of the file excluded)
table 20×7
→
See all 3,293 queries →