{"slug":"flash-crash-2010","qid":"crash_compare","label":"Five famous crash sessions: depth of the low and the bounce off it (SPY)","post_title":"The 2010 Flash Crash, Minute by Minute","post_url":"/blog/flash-crash-2010#q-crash_compare","columns":["session","low_vs_prior_pct","close_vs_prior_pct","bounce_off_low_pct"],"rows":[{"session":"2008-09-29","low_vs_prior_pct":-8.6,"close_vs_prior_pct":-7,"bounce_off_low_pct":1.7},{"session":"2010-05-06","low_vs_prior_pct":-10.1,"close_vs_prior_pct":-3.4,"bounce_off_low_pct":7.5},{"session":"2015-08-24","low_vs_prior_pct":-7.7,"close_vs_prior_pct":-4.1,"bounce_off_low_pct":3.9},{"session":"2018-02-05","low_vs_prior_pct":-4.4,"close_vs_prior_pct":-4.1,"bounce_off_low_pct":0.3},{"session":"2020-03-16","low_vs_prior_pct":-12.4,"close_vs_prior_pct":-11.6,"bounce_off_low_pct":0.9}],"shape":"series","sql":"WITH daily AS (\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n        round(minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS rth_low,\n        round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS rth_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND ((window_start >= toDateTime('2008-09-26 04:00:00') AND window_start < toDateTime('2008-09-30 00:00:00'))\n        OR (window_start >= toDateTime('2010-05-05 04:00:00') AND window_start < toDateTime('2010-05-07 00:00:00'))\n        OR (window_start >= toDateTime('2015-08-21 04:00:00') AND window_start < toDateTime('2015-08-25 00:00:00'))\n        OR (window_start >= toDateTime('2018-02-02 04:00:00') AND window_start < toDateTime('2018-02-06 00:00:00'))\n        OR (window_start >= toDateTime('2020-03-13 04:00:00') AND window_start < toDateTime('2020-03-17 00:00:00')))\n    GROUP BY et_date\n)\nSELECT\n    toString(et_date) AS session,\n    round((rth_low / prev_close - 1) * 100, 1) AS low_vs_prior_pct,\n    round((rth_close / prev_close - 1) * 100, 1) AS close_vs_prior_pct,\n    round((rth_close / rth_low - 1) * 100, 1) AS bounce_off_low_pct\nFROM (\n    SELECT et_date, rth_low, rth_close,\n           lagInFrame(rth_close) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n    FROM daily\n)\nWHERE et_date IN (toDate('2008-09-29'), toDate('2010-05-06'), toDate('2015-08-24'), toDate('2018-02-05'), toDate('2020-03-16'))\nORDER BY et_date","computed_at":"2026-07-26T05:29:33.812959+00:00","elapsed":0.07452903}