March 9, 2009: The Bottom, On the Tape
The turn week: SPY, Citigroup, and the 10-year yield, March 9-13series ·
2026-07-26 · 5×6
One year off the low: the crisis epicenter vs the broad markettable ·
2026-07-26 · 9×5
SPY by half-hour: March 9, 2009 regular sessionseries ·
2026-07-26 · 13×4
Peak to trough to round trip: the whole crisis in one rowscalar ·
2026-07-26 · 1×6156.41
Sixteen weeks after the low: weekly lows, closes, and the running minimumranking ·
2026-07-26 · 16×4
SPY on March 9, 2009: the generational low, receiptedscalar ·
2026-07-26 · 1×1468.84
Four major lows: SPY forward returns at three and twelve monthsseries ·
2026-07-26 · 4×4
March 24, 2020: The Day the Market Turned
Did it hold? The retest that never came, and two recovery clocksscalar ·
2026-07-26 · 1×12338.31
March 24, 2020 ranked against every SPY session on the minute tapescalar ·
2026-07-26 · 1×115,613
SPY by half-hour: March 24, 2020 regular sessionseries ·
2026-07-26 · 13×4
SPY on March 24, 2020: the turn, receiptedscalar ·
2026-07-26 · 1×11222.51
SPY daily close, drawdown, and the 10-year yield: Feb 19 to Mar 23, 2020series ·
2026-07-26 · 24×4
March 24, 2020 across index and sector ETFs: everything up, cyclicals firstranking ·
2026-07-26 · 12×4
SPY closes, March 23-26, 2020: the three-day burstseries ·
2026-07-26 · 4×4
The turn week: SPY, Citigroup, and the 10-year yield, March 9-13
The turn week: SPY, Citigroup, and the 10-year yield, March 9-13
| session | spy_close | spy_change_pct | spy_shares_m | citi_close | ten_year_pct |
|---|---|---|---|---|---|
| 2009-03-09 | 68.07 | -1.1 | 357.4 | 1.05 | 2.89 |
| 2009-03-10 | 72.21 | 6.1 | 401.3 | 1.44 | 2.99 |
| 2009-03-11 | 72.6 | 0.5 | 350.1 | 1.54 | 2.95 |
| 2009-03-12 | 75.51 | 4 | 407.4 | 1.66 | 2.89 |
| 2009-03-13 | 76.09 | 0.8 | 332.7 | 1.78 | 2.89 |
the exact SQL behind every number
WITH daily AS (
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
argMaxIf(toFloat64(close), window_start, ticker = 'SPY' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS spy_close_raw,
round(argMaxIf(toFloat64(close), window_start, ticker = 'C' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS citi_close,
round(toFloat64(sumIf(volume, ticker = 'SPY')) / 1e6, 1) AS spy_shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'C')
AND window_start >= toDateTime('2009-03-06 04:00:00') AND window_start < toDateTime('2009-03-14 00:00:00')
GROUP BY et_date
)
SELECT
toString(d.et_date) AS session,
round(d.spy_close_raw, 2) AS spy_close,
round((d.spy_close_raw / d.prev_close - 1) * 100, 1) AS spy_change_pct,
d.spy_shares_m,
d.citi_close,
t.ten_year_pct
FROM (
SELECT *, lagInFrame(spy_close_raw) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily
) AS d
LEFT JOIN (
SELECT date, round(toFloat64(yield_10_year), 2) AS ten_year_pct
FROM global_markets.treasury_yields
WHERE date BETWEEN '2009-03-09' AND '2009-03-13'
) AS t ON d.et_date = t.date
WHERE d.et_date >= toDate('2009-03-09')
ORDER BY d.et_date
More from this analysisMarch 9, 2009: The Bottom, On the Tape
SPY by half-hour: March 9, 2009 regular session
series 13×4
→
Four major lows: SPY forward returns at three and twelve months
series 4×4
→
Sixteen weeks after the low: weekly lows, closes, and the running minimum
ranking 16×4
→
One year off the low: the crisis epicenter vs the broad market
table 9×5
→
See all 2,170 queries →