2010閃電崩盤逐分鐘回顧
2010年5月6日,近一兆美元市值在36分鐘內蒸發又復原。逐分鐘成交紀錄與具名股票,還原當日詭異走勢。
2010年5月6日,美國股市在略多於半小時內崩跌後又復原——這場閃電崩盤,至今仍是現代市場史上最詭異的一段交易。近一兆美元的市值蒸發後又大致回復;過程中,一些家喻戶曉的股票曾分別印出每股$0.01與$100000的價格。以下內容包含:逐分鐘的成交紀錄、時鐘時間、具名股票——以及每個數字背後所對應的預存查詢。展開任一區塊即可查看SQL。
當日摘要
每個數據背後的精確 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,較前日收盤價 $116.83 下跌 -10.1%。收盤前 SPY 回升至 $112.88——當日跌幅 -3.4%,但仍遠高於盤中急跌的最低點。成交量:639.9 百萬股,是當時 SPY 成交量最高的交易日之一。
逐分鐘回顧崩盤
半小時圖表隱藏了這個事件;在一分鐘解析度下,它無可誤認。以下是 SPY 在美東時間下午 2:00 至 3: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美國證管會與商品期貨交易委員會的聯合事後報告,將事件時間點定於美東時間約 下午 2:32,當時一個大型自動賣出程式開始處理一筆約 75,000 口 E-mini 標普 500 指數期貨合約(約 41 億美元)的訂單,直到約 下午 3: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——與上述低點同一分鐘內——芝加哥商業交易所的停止邏輯功能暫停了 E-mini 期貨交易,恢復時買盤隨之回歸。2010 年的全市場熔斷機制以道瓊指數的 10%、20% 和 30% 門檻為基準,而當時有效的規則規定,在交易時段如此晚期,即使跌幅達 10% 也完全不暫停;因此並未觸發。個股熔斷機制當時尚不存在——它們是這一天催生的發明之一。
是什麼觸發了拋售
賣方對監管機構而言從來不是謎團。美國證管會與商品期貨交易委員會的聯合報告描述了一間共同基金公司——媒體報導指認為Waddell & Reed——使用自動化演算法,以與成交量掛鉤的速率賣出E-mini合約,完全不考慮價格或時間。隨著成交量暴增,該演算法賣得更快,而此時高頻中介機構已停止吸收庫存,轉而相互傳遞——這就是報告中著名的「燙手山芋」成交量。五年後,另一個名字與這一天連結在一起:美國當局於2015年4月逮捕了倫敦交易員Navinder Singh Sarao,罪名是在5月6日及其他數百個交易日中,對E-mini委託簿進行虛假下單——分層掛出他無意執行的訂單。他於2016年認罪,並於2020年1月被判刑。他的訂單在那個下午究竟有多大影響仍存在爭議;下文所述的結構性教訓並不取決於此。
賣壓最集中的地方
每個數據背後的精確 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 萬股。報價紀錄所顯示的事實簡單且持久:價格需要持續存在的買盤,而有幾分鐘的時間,買盤完全消失了。這是有史以來最強而有力的論據,說明了為什麼需要理解市價單究竟做了什麼 —— 在那段時間內觸發的每一個停損單,都變成了在搜尋根本不存在的買盤的市價單。全國最佳買賣價是市場的心跳,而那天下午,它一度停止跳動。
一分錢與十萬美元:荒謬的成交紀錄
當真正的買單消失後,湧入的委託單一路向下,追著市場上僅存的報價成交——包括造市商設在遠離任何合理價格的「存根報價」。原始交易紀錄帶上仍留著這些成交:
每個數據背後的精確 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埃森哲(Accenture,ACN),一家當天下午股價還在 $41.49 附近的顧問公司,留下了 43 筆成交價在五分錢或更低的紀錄,最低來到 $0.01。在另一個方向,蘋果(Apple)出現了 2 筆成交價為每股 $100000 的交易,蘇富比(Sotheby's)也同樣出現了 2 次。
交易所後來取消了所有成交價偏離崩盤前參考價超過 60% 的交易——這條界線解釋了紀錄中的不對稱。埃森哲的一分錢成交紀錄被抹去,因此它留存的最低一分鐘 K 線低點 $17.74,僅比參考價低 -57.2%——剛好落在取消界線之內。寶僑(Procter & Gamble)從未在存根報價成交:它在這段期間最差的成交價 $39.37,比參考價低 -36.7%,因此所有在那個價位執行的停損單都保留了部位。埃森哲的一分錢成交因越線而被抹除;寶僑最差的成交價則因未越線而成立。這條武斷的界線,比任何一本交易手冊都教會了更多交易員關於委託單類型的知識。
損害蔓延的範圍
相同時間窗口,僅計入正式交易紀錄——以每檔標的下午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%,P&G則低了-36.7%,而廣泛型ETF的底部跌幅僅為個位數百分比——追蹤道瓊指數的ETF DIA下跌-6.5%,IWM下跌-5.2%。DIA那幾分鐘的數據被全球媒體報導為截至當時道瓊指數史上最大單日點數跌幅。最後一欄是回升幅度:六檔標的收盤價全數落在下午2:30水準的約三個百分點之內,彷彿中間那一個小時從未發生過。
5月6日與其他崩盤日的比較
將這次閃崩與分鐘K線時代其他著名的單日暴跌進行對比(這份股票數據最早可追溯至2003年;1987年的黑色星期一則在此之前):
每個數據背後的精確 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_date2010年5月6日並非表格中跌幅最深的一天:2020年3月16日盤中交易價格較前一日收盤價下跌 -12.4%,而閃崩當日為 -10.1%。但在反彈幅度上,沒有任何一天能與之相比。SPY 收盤價較5月6日盤中低點高出 7.5%,而此數據集中次佳復甦紀錄(2015年8月24日——本身也是一次迷你閃崩)僅為 3.9%,雷曼時期和新冠疫情崩盤日的反彈幅度更只有 1.7% 和 0.9%。重新定價的走勢會持續下跌至收盤;流動性空洞則在同一個下午就迅速回補。
V 型反彈真的守住了嗎?
判斷一場崩跌「本質為何」取決於兩個問題:舊價格多快收復,以及恐慌低點是否再次觸及。兩者都有明確的答案:
每個數據背後的精確 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
)
)
)收復速度很快:SPY 僅在 4 個交易日後,於 2010-05-12 收盤重回 116.83 美元之上,即 5 月 5 日的收盤價。V 型反彈一度成立。但閃崩低點並未就此成為異常值:崩跌後 37 個交易日,於 2010-06-29,SPY 收在 104.22 美元——低於 105 美元的恐慌低點——當時正值那年夏天主導市場的歐洲主權債務拋售潮。差異正是關鍵所在:閃崩在幾分鐘內、毫無消息面觸發下觸及該價位後反彈;而夏季跌勢則花了數週才走到那裡,並且停留。價格是你此刻能成交的數字;價值是能撐過整個下午的東西。
事後改變了什麼
閃電崩盤催生了現代的熔斷機制:個股漲跌停限制區間,以及修訂後的全市場暫停交易規則,這些機制在後續危機中都可見到(2020年3月的暫停交易正是其直接產物)。殘餘報價遭到禁止;明顯錯誤交易規則正式確立;大型期貨委託單如今須接受價格感知的執行審查。你今天所交易的市场結構,很大程度上就是在這三十六分鐘的餘波中草擬而成的。
閃崩常見問答
2010年閃崩的成因為何?
美國證管會與商品期貨交易委員會的官方報告指出,一筆約41億美元的自動化E-mini賣出程式在流動性稀薄的情況下執行,高頻中介商先是放大了交易量,隨後又抽單。媒體報導指認賣方為共同基金公司Waddell & Reed;交易員Navinder Sarao後來因當天在同一市場進行幌騙交易而被起訴。報價系統呈現的版本是:流動性蒸發,價格跌到任何一個剛好存在的被動買單價位——有時只剩一美分。
閃崩開始與結束的時間為何?
監管機關的時間軸從美東時間下午約2點32分自動賣單開始執行起算,到大盤價格大致收復大部分跌幅的約3點08分為止,共計36分鐘。SPY的低點出現在美東時間14:45,較前一日收盤價下跌-10.1%,從底部回到崩跌前水準大約花了23分鐘。
2010年閃崩中哪些股票受到影響?
幾乎所有股票都下跌,但最著名的案例是那些買單完全消失的個股:埃森哲的成交價一度低至$0.01,蘋果與蘇富比的成交價低至$100000,寶僑則一度跌至$39.37——較其當日下午的價位低了-36.7%。成交價偏離崩跌前價格超過60%的交易被取消;寶僑的成交單則維持有效。
閃崩期間交易是否暫停?
2010年5月6日當天,全市場的熔斷機制並未觸發——當時施行的規則並未針對在交易時段後段發生如此規模的跌幅設定暫停機制。當天唯一的暫停僅持續了五秒:芝加哥商業交易所的停止邏輯機制在美東時間下午2點45分28秒短暫暫停了E-mini期貨交易,與指數低點發生的時間為同一分鐘。個股熔斷機制與漲跌停價格區間機制是在事後才建立的。
閃崩可能再次發生嗎?
規模較小的版本已經發生過——個股觸發漲跌停暫停機制已是常態,小型的瞬間崩跌事件也反覆出現。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 年時,該 ETF 的交易代碼為 QQQQ。
上述每個面板都是針對歷史逐筆成交明細所儲存、帶有版本控制的查詢——展開 SQL 即可查看各項衡量指標的計算方式。想親身體驗這一天,而不只是閱讀數據嗎?這是 Strasmore Labs 交易模擬器 中可供實際操作的情境之一。