{"slug":"covid-stimulus-rally-2020","qid":"rank_since_2003","label":"March 24, 2020 ranked against every SPY session on the minute tape","post_title":"March 24, 2020: The Day the Market Turned","post_url":"/blog/covid-stimulus-rally-2020#q-rank_since_2003","columns":["sessions_measured","first_session","mar24_gain_pct","bigger_days","mar24_rank","bigger_day_dates","burst3_gain_pct","bigger_bursts","vol_vs_30d","vol_vs_250d","mar24_shares_m"],"rows":[{"sessions_measured":5613,"first_session":"2003-09-10","mar24_gain_pct":9.5,"bigger_days":2,"mar24_rank":3,"bigger_day_dates":"2008-10-13, 2008-10-28","burst3_gain_pct":17.5,"bigger_bursts":0,"vol_vs_30d":1.12,"vol_vs_250d":2.86,"mar24_shares_m":232}],"shape":"scalar","sql":"SELECT\n    countIf(isFinite(day_pct)) AS sessions_measured,\n    toString(min(et_date)) AS first_session,\n    round(mar24_d, 1) AS mar24_gain_pct,\n    countIf(isFinite(day_pct) AND day_pct > mar24_d) AS bigger_days,\n    countIf(isFinite(day_pct) AND day_pct > mar24_d) + 1 AS mar24_rank,\n    arrayStringConcat(arraySort(groupArrayIf(toString(et_date), isFinite(day_pct) AND day_pct > mar24_d)), ', ') AS bigger_day_dates,\n    round(mar26_b, 1) AS burst3_gain_pct,\n    countIf(isFinite(burst3_pct) AND burst3_pct > mar26_b) AS bigger_bursts,\n    round(mar24_r30, 2) AS vol_vs_30d,\n    round(mar24_r250, 2) AS vol_vs_250d,\n    round(mar24_shares / 1e6, 0) AS mar24_shares_m\nFROM (\n    SELECT\n        et_date, day_pct, burst3_pct,\n        max(if(et_date = toDate('2020-03-24'), day_pct, -999)) OVER () AS mar24_d,\n        max(if(et_date = toDate('2020-03-26'), burst3_pct, -999)) OVER () AS mar26_b,\n        max(if(et_date = toDate('2020-03-24'), shares / vol_avg_30, -999)) OVER () AS mar24_r30,\n        max(if(et_date = toDate('2020-03-24'), shares / vol_avg_250, -999)) OVER () AS mar24_r250,\n        max(if(et_date = toDate('2020-03-24'), shares, -999)) OVER () AS mar24_shares\n    FROM (\n        SELECT\n            et_date,\n            (close_usd / lagInFrame(close_usd, 1) OVER (ORDER BY et_date ASC ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) - 1) * 100 AS day_pct,\n            (close_usd / lagInFrame(close_usd, 3) OVER (ORDER BY et_date ASC ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) - 1) * 100 AS burst3_pct,\n            shares,\n            avg(shares) OVER (ORDER BY et_date ASC ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING) AS vol_avg_30,\n            avg(shares) OVER (ORDER BY et_date ASC ROWS BETWEEN 250 PRECEDING AND 1 PRECEDING) AS vol_avg_250\n        FROM (\n            SELECT\n                toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n                argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS close_usd,\n                toFloat64(sum(volume)) AS shares\n            FROM global_markets.delayed_stocks_minute_aggs\n            WHERE ticker = 'SPY' AND window_start < toDateTime('2026-01-01 00:00:00')\n            GROUP BY et_date\n            HAVING close_usd > 0\n        )\n    )\n)\nGROUP BY mar24_d, mar26_b, mar24_r30, mar24_r250, mar24_shares","computed_at":"2026-07-26T05:29:12.370732+00:00","elapsed":8.947979569}