Strasmore Research
深度研究 Matt Connor作者: Matt Connor · 更新于 2026-07-23

2010年5月6日美股闪电崩盘:逐分钟复盘

2010年5月6日,约一万亿美元市值在36分钟内蒸发,随后又基本收复。本文用真实的分钟成交数据逐分钟还原这场闪电崩盘,每一个数字都附带可展开的查询凭证。

2010年5月6日,美国股市在半个多小时里先崩塌、再自愈——这就是闪电崩盘(flash crash),至今仍是现代市场史上最离奇的一段交易。接近一万亿美元的市值凭空消失,而后大部分又回来了;过程中,家喻户晓的公司曾以每股$0.01和每股$100000成交。下文是分钟级成交记录、精确到分的时钟、被点名的个股——每一个数字背后都有一条已存储的查询。展开任意面板即可查看SQL。

当天,浓缩成一行

查询2010年5月6日的SPY——闪电崩盘当天,附凭证
每个数字背后的完整 SQL
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')

那一天本就人心不稳——整个上午都是希腊债务的头条——SPY从$116.26的开盘价一路下滑。随后地板消失了:当天最低价$105打印于美东时间14:45(北京时间次日凌晨,美东夏令时与北京时间相差12小时),相对$116.83的前收盘价为-10.1%。到收盘钟声时,SPY已经爬回$112.88——全天涨跌幅-3.4%,却远高于那个真空区的底部。成交量:639.9百万股,是SPY在那个年代最重的交易日之一。

崩盘全程,逐分钟

半小时K线会把这个事件藏起来;放到一分钟分辨率上,它无可辩驳。以下是SPY在美东时间下午2:00至3:30(北京时间次日02:00至03:30)的走势:

查询SPY一分钟K线,2010年5月6日美东时间下午2:00–3:30(北京时间次日02:00–03:30)
每个数字背后的完整 SQL
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_start

SEC(美国证监会)与CFTC(商品期货交易委员会)的联合事后报告把这一事件的时钟定在大约美东时间下午2:32(北京时间次日02:32)——一个大型自动化卖出程序开始执行一笔约75,000张E-mini标普500期货合约(约41亿美元)的订单——直到大约下午3:08(北京时间次日03:08),大盘价格已回补了绝大部分跌幅——首尾三十六分钟。上面的成交记录与这段弧线吻合。SPY在14:32那一分钟收在$113.15。十二分钟后,14:44那一分钟成交了9.21百万股——而像14:05这样的平静分钟只有1.44百万股——14:45那一分钟打印出当天最低价$105。到15:08那一分钟收盘时,SPY已站上$113.63——高于下滑开始的位置。整个往返大约半小时。

全天只触发过一次暂停,而且只持续了五秒。美东时间下午2:45:28(北京时间次日02:45:28)——与上面那个最低价同处一分钟之内——按官方报告,芝加哥商品交易所(CME)的Stop Logic功能暂停了E-mini期货交易,暂停解除时买盘回来了。2010年的全市场熔断以道琼斯指数10%、20%、30%三档阈值为准,而当时生效的规则对交易时段这么晚出现的10%跌幅根本没有规定任何暂停;一档都没触发。个股熔断当时还不存在——它正是这一天催生出来的产物之一。

是什么引发了这轮抛售

监管机构从来不觉得卖方是个谜。SEC与CFTC的报告描述了一家共同基金公司——媒体报道指认为Waddell & Reed——使用一套自动化算法卖出E-mini合约,卖出速率只盯住成交量,不看价格也不看时间。随着成交量爆发,算法卖得更快,而此时市场里的高频中介已经停止吸收库存,开始把它来回抛给彼此——这就是报告里著名的“烫手山芋”式成交量。五年后,又有一个名字与这一天绑在了一起:2015年4月,美国当局逮捕了伦敦交易员Navinder Singh Sarao,指控他在5月6日以及其他数百个交易日对E-mini订单簿实施幌骗(spoofing)——分层挂出他从未打算成交的订单。他于2016年认罪,2020年1月被判刑。他的订单在那个下午究竟起了多大作用至今仍有争议;下文的结构性教训并不依赖于此。

抛压最猛烈的地方

查询最陡的单个分钟——开盘到最低跌幅最大的分钟,美东时间下午2:00–3:30
每个数字背后的完整 SQL
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 5

最惨的单独一分钟,从开盘价到最低价跌了$5.72——发生在美东时间14:49,六十秒内成交4.98百万股。成交记录展示的道理简单而持久:价格需要有人挂着买单,而有那么几分钟,一张都没有。这是有记录以来最有力的一堂课,说明市价单到底会做什么——在那个窗口里被触发的每一笔止损单,都变成了一张追着并不存在的买价跑的市价单。NBBO(全国最优买卖报价)是市场的心跳,而那个下午它拉成了直线。

一美分与10万美元:荒诞的成交打印

当真实的买单消失后,涌进来的订单一路走到还剩下的任何报价上——包括做市商停在任何合理价格之外的占位报价(stub quotes)。原始逐笔成交记录至今还留着这些打印:

查询原始逐笔成交记录上的著名受害者,美东时间下午2:30–3:30
每个数字背后的完整 SQL
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 ASC

埃森哲(ACN)是一家咨询公司,那天下午本来在$41.49附近成交,却录得43笔五美分及以下的成交,最低到$0.01。反方向上,苹果(AAPL)打印了2笔每股$100000的成交,苏富比(BID)同样打印了2笔。

交易所事后取消了所有成交价偏离其崩盘前参考价60%以上的交易——而这条线正好解释了记录中的不对称。ACN那些一美分的打印被作废了,于是它幸存的最低分钟K线低点$17.74,相对参考价为-57.2%——刚好落在取消边界之内。宝洁(PG)从未在占位报价上成交:它在这个窗口里最差的一笔成交$39.37,相对其参考价为-36.7%,于是在那里卖出的每一笔止损单都保住了成交。ACN的一美分打印越过了那条线,被抹去;宝洁最差的成交留在线内,算数。这条武断的边界教给交易者的订单类型知识,比任何一本小册子都多。

损失蔓延得有多广

同一个窗口,只看被认可的成交记录——分钟聚合数据,以每只标的美东时间下午2:30(北京时间次日02:30)的价格为基准测量:

查询崩盘窗口各标的的受损程度——最低价相对美东时间下午2:30参考价
每个数字背后的完整 SQL
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 ASC

分化本身就是故事。ACN幸存的最低价相对其参考价为-57.2%,宝洁为-36.7%,而宽基ETF的低点只跌了个位数百分比——跟踪道琼斯指数的DIA为-6.5%,IWM为-5.2%。DIA的这几分钟,当时被全球报道为道琼斯指数史上截至那时最大的盘中点数跌幅。最后一列是复原的凭证:这六只标的每一只的收盘价,都落在其下午2:30水平约3%以内,仿佛中间那一小时只是一场传言。

5月6日与其他崩盘日的对比

把闪电崩盘放到分钟K线时代其他几个著名的单日惨案旁边(这份股票成交数据回溯到2003年;1987年的黑色星期一在此之前):

查询五个著名的崩盘交易日——低点的深度与自低点的反弹(SPY)
每个数字背后的完整 SQL
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_date

2010年5月6日并不是表里最深的坑:2020年3月16日的最低价相对前收盘价为-12.4%,闪电崩盘则为-10.1%。但在反弹这一项上,没有哪一天接近它。SPY收盘价比5月6日的最低价高出7.5%,而这组样本里第二好的复原(2015年8月24日——它本身也是一次小型闪崩)只有3.9%,雷曼时期和新冠崩盘日则分别只有1.7%和0.9%。重新定价会一路低到收盘;流动性空洞则在同一个下午弹回来。

V形反转守住了吗?

两个问题决定一次崩盘究竟是什么:旧价格多快回来,以及那个恐慌低点后来有没有再被交易到。两个问题都有带凭证的答案:

查询余波——5月5日收盘价何时被收复,恐慌低点何时被真正跌破
每个数字背后的完整 SQL
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
        )
    )
)

收复来得很快:仅仅4个交易日之后,也就是2010-05-12,SPY就重新收在了5月5日收盘价$116.83之上。V形守住了——守了一阵子。但闪崩低点并没有一直是个异常值:崩盘后第37个交易日,也就是2010-06-29,SPY收盘于$104.22——低于$105这个恐慌低点——当时正值主导那个夏天的欧洲主权债务抛售。区别正是全部要点所在:闪电崩盘是在几分钟内、在没有任何消息的情况下到达那个价格,然后弹回去;那个夏天则是花了几周走到那里,并且留在了那里。价格是你此刻能成交的水平;价值是能熬过整个下午的东西。

此后有什么改变

闪电崩盘催生了现代熔断制度:个股的涨跌停限价带(Limit Up/Limit Down,LULD)以及修订后的全市场熔断,这套机制在后来的危机中清晰可见(2020年3月的那几次熔断就是它的直系后代)。占位报价被禁止;明显错误交易(clearly erroneous)的处理规则被正式化;大额期货订单如今在执行时要接受价格层面的审视。你今天所交易的这套市场结构,很大程度上是在那三十六分钟之后起草出来的。

闪电崩盘常见问题

2010年美股闪崩到底是怎么回事?

SEC与CFTC的官方报告描述了一笔约41亿美元的自动化E-mini卖出程序,在流动性稀薄的市场中执行,高频中介先是放大了成交量,随后撤出。媒体报道指认卖方为共同基金公司Waddell & Reed;交易员Navinder Sarao后来因当天在同一市场上幌骗而被起诉。成交记录给出的版本是:流动性蒸发了,价格跌到下一张挂着的买单碰巧所在的位置——有时候就是一美分。

2010年闪电崩盘是几点开始、几点结束的?

监管机构的时间线从大约美东时间下午2:32(北京时间次日02:32)自动化卖出启动开始,到大约下午3:08(北京时间次日03:08)大盘价格已回补绝大部分跌幅为止——36分钟。SPY的最低价打印于美东时间14:45,相对前收盘价为-10.1%,从底部回到下滑前水平大约又用了23分钟。

2010年闪崩中哪些股票受影响最大?

几乎所有股票都在跌,但著名的受害者是那些买盘彻底消失的名字:埃森哲最低打印到$0.01,苹果和苏富比打印在$100000,宝洁一路成交到$39.37——相对其当天下午的水平为-36.7%。偏离崩盘前价格60%以上的交易被取消;宝洁的成交则算数。

闪电崩盘时美股有没有停止交易?

2010年5月6日没有触发任何全市场熔断——当时生效的规则对交易时段这么晚出现的这种幅度的下跌没有规定暂停。当天唯一一次暂停持续了五秒:CME的Stop Logic在美东时间下午2:45:28(北京时间次日02:45:28)短暂暂停了E-mini期货交易,与指数最低点同处一分钟。个股熔断和涨跌停限价带(LULD)都是此后才建立的。

美股还会再发生闪崩吗?

小规模的已经发生过——个股常规性地触发LULD暂停,小型闪崩事件反复出现。2010年那种全市场规模的版本,迄今被它自己催生的暂停机制挡住了。诚实的答案是:那个结构性成分——可以在毫秒之内撤走的流动性——是永久性的。

数据说明

完整数据说明
  • 逐分钟面板中15:09那根K线带着一个游离的108.37最低价,出现在复原之后几分钟,同一根K线也出现在最陡分钟表格的行里——这与迟报成交的表现一致,聚合数据把它们放在其到达的那一分钟里。5月6日的成交记录上有很多这类情况。
  • 被取消的交易与聚合数据:ACN的原始成交记录上有$0.01的打印,而它的分钟K线低点是$17.74——分钟聚合反映的是取消之后的记录,原始逐笔成交记录保留的是最初的打印。
  • 分化面板中的“下午2:30参考价”,是每只标的在美东时间下午2:30当时或之前最后一根常规交易时段分钟K线的收盘价;崩盘窗口为下午2:31至3:15。
  • 跨标的面板中没有QQQ:2010年它以代码QQQQ交易。

上面每一个面板都是对历史成交数据的一条已存储、带版本的查询——展开SQL即可查看每一项测量。想亲身体验这一天,而不只是读它?它是Strasmore Labs交易模拟器里可玩的场景之一。

#market history#flash crash#market structure#spy