O Flash Crash de 2010 minuto a minuto
Veja o que aconteceu em 6 de maio de 2010 quando quase um trilhão de dólares em valor de mercado sumiu e retornou em trinta e seis minutos.
Em 6 de maio de 2010, o mercado de ações dos EUA sofreu um colapso e se recuperou em pouco mais de meia hora — o flash crash, ainda o período de negociação mais estranho da história moderna dos mercados. Quase um trilhão de dólares em valor de mercado desapareceu e, em sua maioria, retornou; durante o processo, empresas conhecidas registraram preços de $0.01 e $100000 por ação. Abaixo: o registro minuto a minuto, os horários, as ações citadas — e uma consulta armazenada por trás de cada número. Expanda qualquer painel para ver o SQL.
O dia, em uma linha
O SQL exato por trás de cada número
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')O dia já começou nervoso — com manchetes sobre a dívida grega durante toda a manhã — e o SPY caiu em relação à sua abertura de $116.26. Em seguida, o suporte desapareceu: a mínima do dia de $105 foi registrada às 14:45 ET, -10.1% abaixo do fechamento anterior de $116.83. No fechamento, o SPY recuperou para $112.88 — uma alta de -3.4% no dia, mas ainda muito acima do fundo do vácuo de liquidez. Volume: 639.9 milhões de ações, uma das sessões de maior volume do SPY em sua história.
O crash, minuto a minuto
Gráficos de meia hora escondem este evento; em resolução de um minuto, ele é inequívoco. Aqui está o SPY das 14:00 às 15:30 ET:
O SQL exato por trás de cada número
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_startO relatório conjunto da SEC–CFTC cronometra o evento de aproximadamente 14:32 ET, quando um grande programa de venda automatizado começou a executar uma ordem de cerca de 75.000 contratos E-mini S&P 500 (cerca de US$ 4,1 bilhões), até aproximadamente 15:08, quando os preços amplos haviam recuperado a maior parte da queda — trinta e seis minutos de ponta a ponta. O tape acima reflete esse arco. O SPY encerrou o minuto 14:32 a US$ 113.15. Doze minutos depois, o minuto 14:44 negociou 9.21 milhões de ações — contra 1.44 milhões em um minuto calmo como o 14:05 — e o minuto 14:45 registrou a mínima do dia de US$ 105. Ao fechamento do minuto 15:08, o SPY estava a US$ 113.63 — acima de onde a queda começou. Um ciclo completo de ida e volta em cerca de meia hora.
Houve um único halt durante todo o dia, e ele durou cinco segundos. Às 14:45:28 ET — dentro do mesmo minuto da mínima acima — a funcionalidade Stop Logic da CME pausou a negociação dos futuros E-mini, conforme o relatório oficial, e as ofertas retornaram quando a pausa foi levantada. Os circuit breakers de mercado de 2010 eram baseados no Dow com gatilhos de 10, 20 e 30 por cento, e as regras vigentes na época não previam nenhum halt para uma queda de dez por cento tão tarde na sessão; nenhum foi acionado. Circuit breakers de ações individuais ainda não existiam — eles estão entre as invenções deste dia.
O que causou a liquidação
A origem da venda nunca foi um mistério para os reguladores. O relatório da SEC–CFTC descreveu um único complexo de fundos mútuos — identificado pela imprensa como Waddell & Reed — que utilizava um algoritmo automatizado para vender contratos E-mini. A velocidade das vendas era baseada no volume, sem considerar o preço ou o horário. Com a explosão do volume, o algoritmo vendeu de forma mais acelerada em um mercado onde intermediários de alta frequência pararam de absorver o estoque e passaram a repassá-lo entre si — o famoso volume de "batata quente" mencionado no relatório. Cinco anos depois, um segundo nome foi associado ao evento: as autoridades dos EUA prenderam o trader londrino Navinder Singh Sarao em abril de 2015, por praticar spoofing no livro de ofertas do E-mini — inserindo ordens que ele nunca pretendia executar — no dia 6 de maio e em centenas de outras datas. Ele se declarou culpado em 2016 e foi sentenciado em janeiro de 2020. O impacto real de suas ordens naquela tarde ainda é debatido; a lição estrutural apresentada abaixo não depende disso.
Onde a pressão vendedora foi mais intensa
O SQL exato por trás de cada número
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 5O pior minuto isolado registrou uma queda de $5.72 do preço de abertura ao mínimo — às 14:49 ET, com 4.98 milhões de ações negociadas em sessenta segundos. O que o histórico mostra é simples e contundente: preços precisam de compradores ativos e, por alguns minutos, não houve nenhum. Este é o argumento mais forte já registrado para entender o que uma ordem a mercado faz — cada stop-loss acionado naquele intervalo tornou-se uma ordem a mercado buscando ofertas de compra que não existiam. O NBBO é o pulso de um mercado e, naquela tarde, ele parou.
Um centavo e US$ 100.000: as operações absurdas
Quando as ordens de compra reais desapareceram, as novas ordens foram executadas nos preços que restavam — incluindo as "stub quotes", cotações de reserva de market makers posicionadas longe de qualquer preço plausível. O histórico de negociações ainda registra esses valores:
O SQL exato por trás de cada número
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), uma consultoria que estava sendo negociada próxima a US$ 41.49 naquela tarde, registrou 43 operações a cinco centavos ou menos, atingindo o mínimo de US$ 0.01. No sentido oposto, a Apple registrou 2 negociações a US$ 100000 por ação, e a Sotheby's fez o mesmo 2 vezes.
As bolsas cancelaram posteriormente todas as operações executadas a mais de 60 por cento de distância do seu preço de referência pré-crash — e esse limite explica a assimetria nos registros. As operações de um centavo da ACN foram descartadas, portanto, sua mínima sobrevivente no gráfico de um minuto, US$ 17.74, está -57.2% abaixo da referência — logo dentro do limite de cancelamento. A Procter & Gamble nunca operou em uma stub quote: sua pior operação no período, US$ 39.37, ficou -36.7% abaixo de sua referência, de modo que todos os stop-loss vendidos naquele nível foram mantidos. As operações de um centavo da ACN ultrapassaram esse limite e foram apagadas; a pior execução da P&G permaneceu dentro dele e foi validada. Esse limite arbitrário ensinou mais aos traders sobre tipos de ordens do que qualquer manual já impresso.
How wide the damage spread
Same window, honored tape only — the minute aggregates, measured from each name's 2:30 pm price:
O SQL exato por trás de cada número
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 is the story. ACN's surviving low sat -57.2% under its reference and P&G's -36.7%, while the broad ETFs bottomed single-digit percentages down — DIA, the Dow-tracking ETF, -6.5% and IWM -5.2%. Those DIA minutes were reported around the world as the largest intraday point drop in the Dow's history to that date. The last column is the recovery receipt: each of the six closed within about three percent of its 2:30 pm level, as if the middle hour had been a rumor.
Como o dia 6 de maio se compara a outros dias de crash
Compare o flash crash com outros colapsos famosos de um único dia na era do gráfico de minutos (este registro de ações remonta a 2003; o Black Monday de 1987 é anterior a ele):
O SQL exato por trás de cada número
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_dateO dia 6 de maio de 2010 não é a maior queda da tabela: o 16 de março de 2020 operou -12.4% abaixo do fechamento anterior contra -10.1% no flash crash. Mas nenhum outro dia chega perto no que diz respeito à recuperação. O SPY fechou 7.5% acima da mínima de 6 de maio, contra 3.9% na segunda melhor recuperação do grupo (24 de agosto de 2015 — que foi um mini flash crash) e apenas 1.7% e 0.9% nos dias de crash da era Lehman e da COVID. Uma correção de preços permanece baixa até o fechamento; um buraco de liquidez retorna rapidamente na mesma tarde.
O V segurou?
Duas perguntas definem se uma queda foi um crash: quão rápido o preço antigo retornou e se a mínima do pânico foi negociada novamente. Ambas têm respostas definitivas:
O SQL exato por trás de cada número
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
)
)
)A recuperação foi rápida: o SPY fechou acima do seu fechamento de 5 de maio de $116.83 apenas 4 sessões depois, em 2010-05-12. O V segurou — por um tempo. Mas a mínima do flash-crash não foi apenas uma aberração: 37 sessões após o crash, em 2010-06-29, o SPY fechou a $104.22 — abaixo da mínima de pânico de $105 — durante a liquidação da dívida soberana europeia que dominou aquele verão. A diferença é o ponto central: o flash crash atingiu esse preço em minutos, sem notícias, e recuperou; o verão chegou lá ao longo de semanas e permaneceu. Preço é o que você consegue transacionar neste segundo; valor é o que sobrevive à tarde.
O que mudou depois
O flash crash deu origem ao regime moderno de circuit-breakers: bandas de Limit Up/Limit Down para ações individuais e revisões nas interrupções de todo o mercado, mecanismos visíveis em crises posteriores (as interrupções de março de 2020 são suas descendentes diretas). Stub quotes foram proibidos; regras para negociações claramente errôneas foram formalizadas; grandes ordens de futuros agora enfrentam escrutínio de execução sensível ao preço. A estrutura de mercado na qual você opera hoje foi substancialmente delineada após aqueles trinta e seis minutos.
FAQ sobre o flash crash
O que causou o flash crash de 2010?
O relatório oficial da SEC/CFTC descreveu um programa de venda automatizado de E-mini de aproximadamente $4,1 bilhões operando em baixa liquidez, com intermediários de alta frequência ampliando o volume e depois retirando-se. Relatos da imprensa identificaram a gestora de fundos mútuos Waddell & Reed como a vendedora; o trader Navinder Sarao foi processado posteriormente por praticar spoofing no mesmo mercado naquele dia. A versão do tape é: a liquidez evaporou e os preços caíram até o próximo bid disponível — às vezes, apenas um centavo.
A que horas o flash crash começou e terminou?
A linha do tempo dos reguladores vai de aproximadamente 14:32 ET, quando as vendas automatizadas começaram, até cerca de 15:08, quando os preços amplos haviam recuperado a maior parte da queda — 36 minutos. A mínima do SPY foi registrada em 14:45 ET, -10.1% abaixo do fechamento anterior, e o retorno aos níveis anteriores à queda levou cerca de 23 minutos a partir do fundo.
Quais ações foram afetadas no flash crash de 2010?
Quase tudo caiu, mas as perdas famosas foram de ativos cujos bids desapareceram completamente: a Accenture registrou mínima de $0.01, Apple e Sotheby's registraram $100000, e a Procter & Gamble foi negociada a $39.37 — -36.7% abaixo de seu nível da tarde. Negociações com mais de sessenta por cento de diferença em relação aos preços pré-crash foram canceladas; as execuções da P&G foram mantidas.
O trading foi interrompido durante o flash crash?
Nenhum circuit breaker de mercado foi acionado em 6 de maio de 2010 — as regras vigentes na época não previam interrupção para uma queda desse tamanho tão tarde na sessão. A única pausa do dia durou cinco segundos: o Stop Logic da CME interrompeu brevemente os futuros de E-mini às 14:45:28 ET, no mesmo minuto da mínima do índice. Circuit breakers de ações individuais e bandas de Limit Up/Limit Down foram criados posteriormente.
Um flash crash pode acontecer novamente?
Versões menores já ocorreram — símbolos individuais atingem interrupções de LULD rotineiramente, e mini eventos de flash recorrem. A versão de escala de 2010 para o mercado inteiro tem sido contida, até agora, pelos mecanismos de interrupção que ela inspirou. A resposta real é que o componente estrutural — liquidez que pode ser retirada em milissegundos — é permanente.
Notas de dados
Notas completas de dados
- O candle de 15:09 do painel minuto a minuto apresenta uma mínima errática de 108.37 minutos após a recuperação. Este mesmo candle aparece nas linhas da tabela de maior volatilidade por minuto — o que é consistente com prints reportados com atraso, que os agregados posicionam no minuto em que chegaram. O tape de 6 de maio apresenta muitos casos.
- Negociações canceladas e os agregados: O tape bruto da ACN mostra prints de $0.01 enquanto sua mínima no candle de minuto é $17.74 — os agregados por minuto refletem o registro pós-cancelamento, enquanto o tape de negociações bruto reflete os prints originais.
- A "referência de 2:30 pm" do painel de dispersão é o último fechamento em candle de minuto da sessão regular de cada ativo no ou antes das 2:30 pm ET; a janela de queda é das 2:31 às 3:15 pm.
- O QQQ está ausente dos painéis comparativos entre ativos: em 2010, ele era negociado sob o ticker QQQQ.
Cada painel acima é uma query versionada e armazenada sobre o tape histórico — expanda o SQL para ver cada medição. Quer operar este dia em vez de apenas lê-lo? É um dos cenários jogáveis no simulador de trading da Strasmore Labs.