2010 Flash Crash minute by minute wey happun
May 6, 2010: about one trillion dollars of market value vanish and mostly return inside 36 minutes. Na di minute tape of di flash crash, wey dem receipt.
For May 6, 2010, US stock market crash and e heal back inside small more than half hour — na di flash crash, wey still be di strangest stretch of trading for modern market history. Close to one trillion dollars of market value vanish and mostly come back; along di way, big-name stocks print for $0.01 and for $100000 per share. Below: di minute tape, di clock times, di named stocks — and one stored query dey behind every number. Expand any panel for di SQL.
Di day, for one row
The exact SQL behind every number
WITH
(
SELECT argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-05 00:00:00') AND window_start < toDateTime('2010-05-06 04:00:00')
) AS prior_rth_close
SELECT
round(prior_rth_close, 2) AS prior_close,
round(toFloat64(argMinIf(open, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)), 2) AS rth_open,
round((toFloat64(argMinIf(open, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) / prior_rth_close - 1) * 100, 1) AS gap_pct,
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,
formatDateTime(toTimeZone(argMinIf(window_start, (toFloat64(low), toInt64(toUnixTimestamp(window_start))), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 'America/New_York'), '%H:%i') AS low_et,
round(toFloat64(argMaxIf(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,
round((toFloat64(argMaxIf(close, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) / prior_rth_close - 1) * 100, 1) AS day_change_pct,
round((minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / prior_rth_close - 1) * 100, 1) AS low_vs_prior_pct,
round(toFloat64(sum(volume)) / 1e6, 1) AS day_shares_m,
countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS rth_minute_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-06 04:00:00') AND window_start < toDateTime('2010-05-06 23:59:00')Di day don already dey on edge — na Greek-debt headline tape all morning — and SPY just dey drift go down from im $116.26 open. Den di floor just vanish: di day low of $105 print for 14:45 ET, -10.1% below di prior close of $116.83. By di time bell ring, SPY don manage climb back to $112.88 — -3.4% for di day, but still far above di bottom of dat air pocket. Volume: 639.9 million shares, one of di heaviest SPY sessions for im time.
Di crash, minute by minute
Half-hour charts dey hide dis event; if you check am for one-minute resolution, e dey clear well-well. Na SPY from 2:00 to 3:30 pm ET:
The exact SQL behind every number
SELECT
formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_minute,
round(toFloat64(close), 2) AS close_usd,
round(toFloat64(low), 2) AS low_usd,
round(toFloat64(volume) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-06 18:00:00') AND window_start < toDateTime('2010-05-06 19:30:00')
ORDER BY window_startDi joint SEC–CFTC post-mortem put di event from around 2:32 pm ET, wen one big automated sell program start to work one order of roughly 75,000 E-mini S&P 500 futures contracts (about $4.1 billion), to around 3:08 pm, wen broad prices don retrace most of di plunge — thirty-six minutes from start to finish. Di tape wey dey up match dat arc. SPY end di 14:32 minute for $113.15. Twelve minutes later, di 14:44 minute trade 9.21 million shares — against 1.44 million for one calm minute like 14:05 — and di 14:45 minute print di day low of $105. By di close of di 15:08 minute, SPY stand for $113.63 — above where di slide start. One full round trip for about half an hour.
Only one halt fire for di whole day, and e last five seconds. For 2:45:28 pm ET — inside di same minute as di low wey dey up — di CME Stop Logic functionality pause E-mini futures trading, according to di official report, and bids return wen dem lift am. Di market-wide circuit breakers of 2010 dey keyed to di Dow for 10, 20 and 30 percent thresholds, and di rules wey dey in force dat time no specify any halt at all for one ten-percent decline wey happen dat late for di session; none fire. Single-stock circuit breakers never exist yet — dem be among di inventions of dis day.
Wetin cause the selling
Regulators no ever dey confused about who be the seller. The SEC–CFTC report talk about one single mutual-fund complex — wey press accounts call Waddell & Reed — wey dey use one automated algorithm to sell E-mini contracts at a rate wey tie to volume, without any care for price or time. As volume blow up, the algorithm sell faster, inside one market where high-frequency middlemen don stop to absorb inventory and don start to dey pass am back and forth — the report call am "hot potato" volume. Five years later, another name join that day: US authorities arrest London trader Navinder Singh Sarao for April 2015, for spoofing the E-mini order book — e dey layer orders wey e no ever plan to execute — on May 6 and plenty other days. E plead guilty for 2016 and dem sentence am for January 2020. How much im orders matter that afternoon still dey cause argument; the structural lesson wey dey below no depend on am.
Where the selling dey sharp pass
The exact SQL behind every number
SELECT
formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_minute,
round(toFloat64(open), 2) AS minute_open,
round(toFloat64(low), 2) AS minute_low,
round(toFloat64(open) - toFloat64(low), 2) AS drop_within_minute_usd,
round(toFloat64(volume) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-06 18:00:00') AND window_start < toDateTime('2010-05-06 19:30:00')
ORDER BY drop_within_minute_usd DESC
LIMIT 5Di single worst minute drop $5.72 from im open to im low — for 14:49 ET, on top 4.98 million shares inside sixty seconds. Wetin di tape show simple and e dey last: price need standing buyers, and for some minutes dem no dey at all. Dis na di strongest argument wey dem ever record to understand wetin market order dey do — every stop-loss wey fire for dat window turn to market order wey dey hunt for bids wey no dey. Di NBBO na di heartbeat of market, and dat afternoon e flatline.
One kobo and $100,000: the crazy prints
When the real buy orders disappear, the new orders wey dey come just dey match with any quote wey remain — including those market-maker "stub quotes" wey dem park far-far from any sensible price. The raw trade record still get those prints:
The exact SQL behind every number
SELECT
ticker,
round(min(toFloat64(price)), 2) AS lowest_print,
round(max(toFloat64(price)), 2) AS highest_print,
countIf(toFloat64(price) <= 0.05) AS penny_prints,
countIf(toFloat64(price) >= 99999) AS hundred_k_prints,
count() AS prints
FROM global_markets.stocks_trades
WHERE ticker IN ('ACN', 'AAPL', 'BID', 'PG')
AND sip_timestamp >= toDateTime('2010-05-06 18:30:00') AND sip_timestamp < toDateTime('2010-05-06 19:30:00')
GROUP BY ticker
ORDER BY ticker ASCAccenture (ACN), na consultancy wey dey trade near $41.49 that afternoon, record 43 prints for five cents or less, and e reach bottom for $0.01. For the other side, Apple print 2 trades for $100000 per share, and Sotheby's do the same thing 2 times.
The exchanges later cancel every trade wey happen more than 60 percent away from the reference price before the crash — and that rule na im explain why the record no balance. ACN penny prints die, so the lowest surviving minute-bar low, $17.74, dey -57.2% below the reference — just inside the cancellation boundary. Procter & Gamble no ever print for stub: im worst trade for that window, $39.37, na -36.7% below im reference, so every stop-loss wey sell there keep the fill. ACN penny prints cross that line and dem erase am; P&G worst fill stay inside am and e stand. That arbitrary boundary teach more traders about order types pass any pamphlet wey dem ever print.
How far the damage spread
Same window, we dey use only honored tape — the minute aggregates, measured from each name im 2:30 pm price:
The exact SQL behind every number
SELECT
ticker,
round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 870), 2) AS pre_crash_1430,
round(minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 871 AND 915), 2) AS crash_low,
round((minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 871 AND 915) / argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 870) - 1) * 100, 1) AS low_vs_1430_pct,
formatDateTime(toTimeZone(argMinIf(window_start, (toFloat64(low), toInt64(toUnixTimestamp(window_start))), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 871 AND 915), 'America/New_York'), '%H:%i') AS low_et,
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) / argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 870) - 1) * 100, 1) AS close_vs_1430_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('ACN', 'PG', 'MMM', 'IWM', 'DIA', 'SPY')
AND window_start >= toDateTime('2010-05-06 04:00:00') AND window_start < toDateTime('2010-05-06 23:59:00')
GROUP BY ticker
ORDER BY low_vs_1430_pct ASCThe dispersion na the story. ACN im surviving low sit -57.2% under im reference and P&G own -36.7%, while the broad ETFs bottom for single-digit percentages down — DIA, the Dow-tracking ETF, -6.5% and IWM -5.2%. Those DIA minutes dem report am around the world as the largest intraday point drop for Dow history wey reach that date. The last column na the recovery receipt: each of the six close within about three percent of im 2:30 pm level, as if the middle hour no even happen.
How May 6 take compare with oda crash days
Put dis flash crash side-by-side with di oda famous one-day wrecks wey dey di minute-bar era (dis equities tape go back reach 2003; Black Monday 1987 happen before am):
The exact SQL behind every number
WITH daily AS (
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
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,
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
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND ((window_start >= toDateTime('2008-09-26 04:00:00') AND window_start < toDateTime('2008-09-30 00:00:00'))
OR (window_start >= toDateTime('2010-05-05 04:00:00') AND window_start < toDateTime('2010-05-07 00:00:00'))
OR (window_start >= toDateTime('2015-08-21 04:00:00') AND window_start < toDateTime('2015-08-25 00:00:00'))
OR (window_start >= toDateTime('2018-02-02 04:00:00') AND window_start < toDateTime('2018-02-06 00:00:00'))
OR (window_start >= toDateTime('2020-03-13 04:00:00') AND window_start < toDateTime('2020-03-17 00:00:00')))
GROUP BY et_date
)
SELECT
toString(et_date) AS session,
round((rth_low / prev_close - 1) * 100, 1) AS low_vs_prior_pct,
round((rth_close / prev_close - 1) * 100, 1) AS close_vs_prior_pct,
round((rth_close / rth_low - 1) * 100, 1) AS bounce_off_low_pct
FROM (
SELECT et_date, rth_low, rth_close,
lagInFrame(rth_close) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily
)
WHERE et_date IN (toDate('2008-09-29'), toDate('2010-05-06'), toDate('2015-08-24'), toDate('2018-02-05'), toDate('2020-03-16'))
ORDER BY et_dateMay 6, 2010 no be di deepest hole for di table: March 16, 2020 trade -12.4% below im prior close against -10.1% for di flash crash. But no oda day near am for di bounce. SPY close 7.5% above im May 6 low, versus 3.9% for di next-best recovery for di set (August 24, 2015 — e self na mini flash crash) and just 1.7% and 0.9% for di Lehman-era and COVID crash days. A repricing dey stay down till close; a liquidity hole dey snap back dat same afternoon.
Di V hold?
Two kweshon dey decide wetin crash be: how fast di old price come back, and weda di panic low ever trade again. Both of dem get answer wey dey clear:
The exact SQL behind every number
WITH
(
SELECT minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-06 04:00:00') AND window_start < toDateTime('2010-05-07 00:00:00')
) AS flash_low
SELECT
round(any(flash_low), 2) AS flash_crash_low,
round(any(may5_close), 2) AS may5_close,
toString(any(first_above_date)) AS first_close_above_may5,
countIf(et_date > toDate('2010-05-06') AND et_date <= first_above_date) AS sessions_until_reclaim,
toString(any(first_below_date)) AS first_close_below_low,
round(anyIf(close_usd, et_date = first_below_date), 2) AS close_that_session,
countIf(et_date > toDate('2010-05-06') AND et_date <= first_below_date) AS sessions_until_break
FROM (
SELECT et_date, close_usd, flash_low, may5_close,
min(if(et_date > toDate('2010-05-06') AND close_usd < flash_low, et_date, toDate('2100-01-01'))) OVER () AS first_below_date,
min(if(et_date > toDate('2010-05-06') AND close_usd > may5_close, et_date, toDate('2100-01-01'))) OVER () AS first_above_date
FROM (
SELECT et_date, close_usd, flash_low,
max(if(et_date = toDate('2010-05-05'), close_usd, 0)) OVER () AS may5_close
FROM (
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
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 close_usd,
flash_low
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2010-05-05 04:00:00') AND window_start < toDateTime('2011-01-01 00:00:00')
GROUP BY et_date
)
)
)Di reclaim come fast: SPY close back above im May 5 close of $116.83 just 4 sessions later, on 2010-05-12. Di V hold — for some time. But di flash-crash low no remain as aberration: 37 sessions after di crash, on 2010-06-29, SPY close at $104.22 — below di $105 panic low — during di European sovereign-debt selloff wey control dat summer. Di difference na di whole point: di flash crash reach dat price in minutes, with no news, and bounce; di summer reach dere over weeks and stay. Price na wetin you fit transact for dis second; value na wetin survive di afternoon.
Wetin change after
Di flash crash bring di modern circuit-breaker system: single-stock Limit Up/Limit Down bands and revised market-wide halts, machinery wey show for later crises (March 2020 halts na im direct pikin). Dem ban stub quotes; dem formalize clearly-erroneous-trade rules; large futures orders now dey face price-aware execution scrutiny. Di market structure wey you dey trade today, na substantially drafted from di aftermath of dose thirty-six minutes.
Flash crash FAQ
Wetin cause di 2010 flash crash?
Di official SEC/CFTC report yarn say one automated E-mini sell program wey worth like $4.1 billion dey execute inside thin liquidity. High-frequency middlemen first amplify di volume, den dem comot. Press accounts point to mutual-fund firm Waddell & Reed as di seller; later dem prosecute trader Navinder Sarao for spoofing di same market dat day. Wetin di tape show be say: liquidity vanish, and prices fall go wherever di next resting bid dey — sometimes na one penny.
Wetin time di flash crash start and end?
Di regulators' timeline run from around 2:32 pm ET, wen di automated selling start, go reach roughly 3:08 pm, wen broad prices don retrace most of di plunge — na 36 minutes. SPY low print for 14:45 ET, -10.1% below di prior close, and di journey back to pre-slide levels take about 23 minutes from di bottom.
Which stocks dem affect for di 2010 flash crash?
Nearly everi ting fall, but di famous casualties na names wey dia bids vanish totally: Accenture print as low as $0.01, Apple and Sotheby's print at $100000, and Procter & Gamble trade go down to $39.37 — -36.7% below im afternoon level. Dem cancel trades wey pass 60 percent from pre-crash prices; P&G fills stand.
Trading halt during di flash crash?
No market-wide circuit breaker fire on May 6, 2010 — di rules wey dey in force dat time no specify any halt for dat kain decline wey happen late for session. Di only pause for dat day last five seconds: CME Stop Logic briefly halt E-mini futures at 2:45:28 pm ET, di same minute as di index low. Dem create single-stock circuit breakers and Limit Up/Limit Down bands after di event.
E fit happen again?
Smaller versions don happen — individual symbols dey hit LULD halts routinely, and mini flash events dey recur. Di 2010-scale market-wide version, di halt machinery wey e inspire don contain am so far. Di honest answer be say di structural ingredient — liquidity wey fit withdraw in milliseconds — na permanent tin.
Data notes
Full data notes
- Di minute-by-minute panel 15:09 bar get one stray 108.37 low minutes afta di recovery don happen, and di same bar dey show among di steepest-minute table rows — e align with late-reported prints, wey di aggregates put for di minute wey dem arrive. May 6 tape carry plenty of dem.
- Canceled trades and di aggregates: ACN raw tape show $0.01 prints while im minute-bar low na $17.74 — di minute aggregates reflect di post-cancellation record, di raw trade tape na di original prints.
- Di dispersion panel "2:30 pm reference" na each name last regular-session minute-bar close at or before 2:30 pm ET; di crash window na 2:31–3:15 pm.
- QQQ no dey di cross-name panels: for 2010 e trade under di ticker QQQQ.
Every panel wey dey above na stored, versioned query over di historical tape — expand di SQL to see each measurement. You wan feel dis day instead of read am? E be one of di playable scenarios for di Strasmore Labs trading simulator.