El flash crash de 2010 minuto a minuto
El 6 de mayo de 2010 un billón de dólares en valor de mercado desapareció y regresó en 36 minutos. Analizamos la cinta de transacciones del flash crash.
El 6 de mayo de 2010, el mercado de acciones de EE. UU. colapsó y se recuperó en poco más de media hora: el flash crash, el periodo de negociación más extraño en la historia moderna de los mercados. Cerca de un billón de dólares en valor de mercado desaparecieron y la mayoría regresó; en el proceso, empresas reconocidas cotizaron a $0.01 y a $100000 por acción. A continuación: la cinta de transacciones por minuto, las horas exactas, las acciones mencionadas — y una consulta almacenada detrás de cada número. Expanda cualquier panel para ver el SQL.
La jornada, en una sola línea
El SQL exacto detrás de cada cifra
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')El mercado ya mostraba nerviosismo —con titulares sobre la deuda griega durante toda la mañana— y el SPY cayó desde su apertura de $116.26. Luego, el soporte desapareció: el mínimo del día de $105 se registró a las 14:45 ET, -10.1% por debajo del cierre anterior de $116.83. Al cierre, el SPY se había recuperado hasta los $112.88 —una caída de -3.4% en el día—, aunque todavía lejos del punto más bajo de la caída. Volumen: 639.9 millones de acciones, una de las sesiones con mayor volumen para el SPY en su historia.
El desplome, minuto a minuto
Los gráficos de media hora ocultan este evento; con una resolución de un minuto, es inconfundible. Aquí se muestra el SPY de las 2:00 a las 3:30 pm ET:
El SQL exacto detrás de cada cifra
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_startEl análisis conjunto de la SEC y la CFTC sitúa el evento desde aproximadamente las 2:32 pm ET, cuando un programa de venta automatizado de gran escala comenzó a ejecutar una orden de cerca de 75,000 contratos E-mini S&P 500 futures (unos $4.1 mil millones), hasta aproximadamente las 3:08 pm, cuando los precios generales habían recuperado la mayor parte de la caída —treinta y seis minutos de principio a fin. La cinta anterior coincide con ese arco. El SPY cerró el minuto 14:32 a $113.15. Doce minutos después, el minuto 14:44 negoció 9.21 millones de acciones —frente a los 1.44 millones de un minuto tranquilo como el 14:05— y el minuto 14:45 registró el mínimo del día de $105. Al cierre del minuto 15:08, el SPY se situaba en $113.63 —por encima de donde comenzó el descenso. Un ciclo completo en aproximadamente media hora.
Hubo un solo halt durante todo el día y duró cinco segundos. A las 2:45:28 pm ET —dentro del mismo minuto que el mínimo anterior— la funcionalidad Stop Logic de la CME pausó la negociación de los E-mini futures, según el informe oficial, y las ofertas regresaron cuando se levantó la pausa. Los circuit breakers de mercado de 2010 estaban vinculados al Dow con umbrales del 10, 20 y 30 por ciento, y las reglas vigentes en ese momento no especificaban ningún halt para una caída del diez por ciento tan tarde en la sesión; ninguno se activó. Los circuit breakers para acciones individuales aún no existían; son uno de los inventos de este día.
Qué causó la venta masiva
El origen de las ventas nunca fue un misterio para los reguladores. El informe de la SEC–CFTC describió a un complejo de fondos mutuos —identificado en la prensa como Waddell & Reed— que utilizaba un algoritmo automatizado para vender contratos E-mini. La velocidad de venta dependía del volumen, sin considerar el precio o el tiempo. A medida que el volumen aumentaba, el algoritmo vendía con mayor rapidez en un mercado donde los intermediarios de alta frecuencia habían dejado de absorber inventario para empezar a transferirlo entre ellos, lo que el informe denominó el famoso volumen de "papa caliente". Cinco años después, un segundo nombre se vinculó a la jornada: las autoridades de EE. UU. arrestaron al trader londinense Navinder Singh Sarao en abril de 2015, por realizar spoofing en el order book de los E-mini —colocando órdenes que nunca pretendía ejecutar— el 6 de mayo y en cientos de otros días. Se declaró culpable en 2016 y fue sentenciado en enero de 2020. El impacto real de sus órdenes esa tarde sigue siendo objeto de debate; la lección estructural que se presenta a continuación no depende de ello.
Donde las ventas fueron más intensas
El SQL exacto detrás de cada cifra
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 5El peor minuto registrado cayó $5.72 desde su apertura hasta su mínimo — a las 14:49 ET, con 4.98 millones de acciones en sesenta segundos. Lo que muestra la cinta es simple y contundente: los precios requieren compradores constantes, y durante unos minutos no hubo ninguno. Este es el argumento más sólido registrado para entender qué hace una orden de mercado — cada stop-loss que se ejecutó en ese intervalo se convirtió en una orden de mercado buscando ofertas que no existían. El NBBO es el pulso de un mercado, y esa tarde se detuvo.
Un centavo y $100,000: las operaciones absurdas
Cuando las órdenes de compra reales desaparecieron, las órdenes entrantes se ejecutaron a cualquier cotización restante, incluyendo las "stub quotes" de los market-makers, que se encuentran lejos de cualquier precio plausible. El registro de operaciones aún muestra esos precios:
El SQL exacto detrás de cada cifra
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), una consultora que cotizaba cerca de $41.49 esa tarde, registró 43 operaciones a cinco centavos o menos, alcanzando un mínimo de $0.01. En la dirección opuesta, Apple registró 2 operaciones a $100000 por acción, y Sotheby's realizó lo mismo 2 veces.
Las bolsas cancelaron posteriormente cada operación ejecutada a más del 60 por ciento de distancia de su precio de referencia previo al desplome; esa línea explica la asimetría en el registro. Las operaciones de un centavo de ACN desaparecieron, por lo que su mínimo más bajo en el gráfico de un minuto que sobrevivió, $17.74, se sitúa un -57.2% por debajo de la referencia, justo dentro del límite de cancelación. Procter & Gamble nunca operó a un precio de stub: su peor operación en ese periodo, $39.37, estuvo un -36.7% por debajo de su referencia, por lo que cada stop-loss que vendió allí mantuvo su ejecución. Las operaciones de un centavo de ACN superaron ese límite y fueron borradas; la peor ejecución de P&G se mantuvo dentro de él y permaneció vigente. Ese límite arbitrario enseñó a los traders más sobre tipos de órdenes que cualquier manual impreso.
Qué tan amplia fue la caída
En el mismo periodo, considerando solo la cinta oficial — los agregados por minuto, medidos desde el precio de las 2:30 pm de cada acción:
El SQL exacto detrás de cada cifra
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 ASCLa dispersión es el dato clave. El mínimo de ACN se situó un -57.2% por debajo de su referencia y el de P&G un -36.7%, mientras que los ETFs generales cayeron en porcentajes de un solo dígito — DIA, el ETF que sigue al Dow, un -6.5% e IWM un -5.2%. Esos minutos de DIA se reportaron en todo el mundo como la mayor caída intradía en puntos en la historia del Dow hasta esa fecha. La última columna muestra la recuperación: cada uno de los seis cerró dentro de aproximadamente un tres por ciento de su nivel de las 2:30 pm, como si la hora central hubiera sido solo un rumor.
Comparativa del 6 de mayo con otros días de desplome
Compare el flash crash con otros colapsos famosos de un solo día en la era de las barras de un minuto (este registro de acciones se remonta a 2003; el Lunes Negro de 1987 es anterior):
El SQL exacto detrás de cada cifra
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_dateEl 6 de mayo de 2010 no es la caída más profunda de la tabla: 16 de marzo de 2020 operó -12.4% por debajo de su cierre anterior frente al -10.1% del flash crash. Sin embargo, ningún otro día se acerca en cuanto a la recuperación. El SPY cerró 7.5% por encima de su mínimo del 6 de mayo, frente al 3.9% de la siguiente mejor recuperación del conjunto (24 de agosto de 2015 — un mini flash crash en sí mismo) y solo 1.7% y 0.9% en los días de colapso de la era Lehman y del COVID. Una corrección de precios permanece baja hasta el cierre; un vacío de liquidez rebota la misma tarde.
¿Se mantuvo la recuperación en V?
Dos preguntas definen si un desplome fue tal cual: qué tan rápido regresó el precio anterior y si el mínimo de pánico volvió a negociarse. Ambas tienen respuestas claras:
El SQL exacto detrás de cada cifra
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
)
)
)La recuperación fue rápida: el SPY cerró por encima de su cierre del 5 de mayo de $116.83 solo 4 sesiones después, el 2010-05-12. La V se mantuvo —por un tiempo. Pero el mínimo del flash-crash no fue una aberración pasajera: 37 sesiones después del desplome, el 2010-06-29, el SPY cerró a $104.22 —por debajo del mínimo de pánico de $105— durante la venta masiva de deuda soberana europea que dominó ese verano. La diferencia es el punto clave: el flash crash alcanzó ese precio en minutos, sin noticias, y rebotó; el verano llegó a ese nivel durante semanas y se mantuvo ahí. El precio es lo que puedes transaccionar en este segundo; el valor es lo que sobrevive a la tarde.
Qué cambió después
El flash crash dio origen al régimen moderno de interruptores de circuito: bandas de Limit Up/Limit Down para acciones individuales y suspensiones revisadas para todo el mercado, mecanismos que se hicieron visibles en crisis posteriores (las suspensiones de marzo de 2020 son sus descendientes directos). Se prohibieron los stub quotes; se formalizaron las reglas para transacciones claramente erróneas; y las órdenes grandes de futuros ahora enfrentan un escrutinio de ejecución basado en el precio. La estructura de mercado en la que opera hoy se diseñó sustancialmente tras la consecuencia de esos treinta y seis minutos.
Preguntas frecuentes sobre el flash crash
¿Qué causó el flash crash de 2010?
El informe oficial de la SEC/CFTC describió un programa de ventas automatizado de E-mini de aproximadamente $4.1 mil millones que se ejecutó con poca liquidez, donde los intermediarios de alta frecuencia primero amplificaron el volumen y luego se retiraron. Los informes de prensa identificaron a la firma de fondos mutuos Waddell & Reed como el vendedor; el trader Navinder Sarao fue procesado posteriormente por realizar spoofing en ese mismo mercado ese día. La versión de la cinta de operaciones: la liquidez se evaporó y los precios cayeron hasta donde se encontrara la siguiente oferta disponible, que a veces era de un centavo.
¿A qué hora comenzó y terminó el flash crash?
El cronograma de los reguladores va desde aproximadamente las 2:32 pm ET, cuando comenzó la venta automatizada, hasta cerca de las 3:08 pm, cuando los precios generales habían recuperado la mayor parte de la caída — 36 minutos. El mínimo de SPY se registró a las 14:45 ET, -10.1% por debajo del cierre anterior, y el regreso a los niveles previos a la caída tomó unos 23 minutos desde el punto más bajo.
¿Qué acciones se vieron afectadas en el flash crash de 2010?
Casi todo cayó, pero las víctimas más conocidas fueron aquellas cuyos bids desaparecieron por completo: Accenture registró un mínimo de $0.01, Apple y Sotheby's se cotizaron a $100000, y Procter & Gamble bajó hasta los $39.37 — -36.7% por debajo de su nivel de la tarde. Se cancelaron operaciones que superaban el 60 por ciento de los precios previos al crash; las ejecuciones de P&G se mantuvieron.
¿Se detuvo la negociación durante el flash crash?
No se activó ningún circuit breaker a nivel de mercado el 6 de mayo de 2010; las reglas vigentes en ese momento no especificaban una pausa por una caída de esa magnitud tan tarde en la sesión. La única pausa del día duró cinco segundos: el Stop Logic de la CME detuvo brevemente los futuros E-mini a las 2:45:28 pm ET, en el mismo minuto que el mínimo del índice. Los circuit breakers para acciones individuales y las bandas Limit Up/Limit Down se crearon posteriormente.
¿Podría ocurrir otro flash crash?
Han ocurrido versiones más pequeñas — símbolos individuales alcanzan pausas por LULD de forma rutinaria, y ocurren mini eventos de flash recurrentes. La versión a escala de mercado de 2010 ha sido contenida hasta ahora por la maquinaria de interrupción que ella misma inspiró. La respuesta honesta es que el componente estructural — la liquidez que puede retirarse en milisegundos — es permanente.
Notas de los datos
Notas completas de los datos
- La barra de las 15:09 del panel minuto a minuto presenta un mínimo erróneo de 108.37 minutos después de la recuperación; esta misma barra aparece en las filas de la tabla de variaciones más pronunciadas por minuto, lo cual es consistente con las transacciones reportadas con retraso, las cuales los agregados ubican en el minuto en que llegaron. El tape del 6 de mayo contiene muchas de estas.
- Operaciones canceladas y agregados: El tape bruto de ACN muestra impresiones de $0.01 mientras que su mínimo en la barra de un minuto es de $17.74; los agregados por minuto reflejan el registro posterior a la cancelación, mientras que el tape de transacciones bruto muestra las impresiones originales.
- La referencia de las "2:30 pm" en el panel de dispersión es el último cierre de barra de un minuto en sesión regular de cada valor a las 2:30 pm ET o antes; el intervalo de la caída es de 2:31 a 3:15 pm.
- QQQ está ausente de los paneles comparativos de valores: en 2010 operaba bajo el ticker QQQQ.
Cada panel anterior es una consulta almacenada y con versiones sobre el tape histórico; expanda el SQL para ver cada medición. ¿Desea experimentar este día en lugar de leerlo? Es uno de los escenarios jugables en el simulador de trading de Strasmore Labs.