เหตุการณ์ Flash Crash ปี 2010 รายนาที
เจาะลึกเหตุการณ์ Flash Crash เมื่อวันที่ 6 พฤษภาคม 2010 เมื่อมูลค่าตลาดเกือบหนึ่งล้านล้านดอลลาร์หายไปและฟื้นตัวในเวลาเพียง 36 นาที พร้อมบันทึกการซื้อขายรายนาที
เมื่อวันที่ 6 พฤษภาคม 2010 ตลาดหุ้นสหรัฐฯ เกิดการดิ่งลงอย่างรุนแรงและฟื้นตัวกลับมาภายในเวลาไม่ถึงครึ่งชั่วโมง หรือที่เรียกว่า flash crash ซึ่งถือเป็นช่วงเวลาการซื้อขายที่แปลกประหลาดที่สุดในประวัติศาสตร์ตลาดสมัยใหม่ มูลค่าตลาดเกือบหนึ่งล้านล้านดอลลาร์หายไปและส่วนใหญ่กลับคืนมาในเวลาอันสั้น โดยมีหุ้นชื่อดังหลายตัวมีราคาลดลงไปอยู่ที่ $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 ET ซึ่งลดลง -10.1% เมื่อเทียบกับราคาปิดก่อนหน้าที่ $116.83 อย่างไรก็ตาม เมื่อถึงเวลาปิดตลาด SPY สามารถฟื้นตัวกลับมาอยู่ที่ $112.88 หรือลดลง -3.4% สำหรับการซื้อขายในวันนี้ แต่ยังคงอยู่ในระดับที่สูงกว่าจุดต่ำสุดของช่วงที่ราคาดิ่งลงอย่างมาก ปริมาณการซื้อขายอยู่ที่ 639.9 ล้านหุ้น ซึ่งถือเป็นหนึ่งในวันที่มีปริมาณการซื้อขายสูงสุดของ SPY ในยุคนี้
รายละเอียดเหตุการณ์วิกฤตแบบนาทีต่อนาที
กราฟรายครึ่งชั่วโมงอาจไม่แสดงให้เห็นเหตุการณ์นี้ แต่หากดูด้วยความละเอียดรายนาทีจะเห็นได้อย่างชัดเจน ต่อไปนี้คือข้อมูลของ SPY ตั้งแต่เวลา 14:00 ถึง 15:30 น. ตามเวลา ET:
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 ระบุว่าเหตุการณ์เริ่มขึ้นเมื่อเวลาประมาณ 14:32 น. ET เมื่อโปรแกรมขายอัตโนมัติขนาดใหญ่เริ่มดำเนินการคำสั่งขาย E-mini S&P 500 futures จำนวนประมาณ 75,000 สัญญา (ประมาณ 4.1 พันล้านดอลลาร์) จนถึงเวลาประมาณ 15:08 น. ซึ่งเป็นช่วงที่ราคาโดยรวมฟื้นตัวกลับมาได้เกือบทั้งหมด — รวมระยะเวลาทั้งสิ้นสามสิบหกนาที ข้อมูลราคาข้างต้นสอดคล้องกับช่วงเวลาดังกล่าว โดย SPY ปิดที่ราคา $113.15 ในนาทีที่ 14:32 อีกสิบสองนาทีต่อมา ในนาทีที่ 14:44 มีปริมาณการซื้อขายอยู่ที่ 9.21 ล้านหุ้น เมื่อเทียบกับ 1.44 ล้านหุ้นในช่วงเวลาปกติอย่างนาทีที่ 14:05 และในนาทีที่ 14:45 ราคาลงไปแตะระดับต่ำสุดของวันที่ $105 เมื่อสิ้นสุดนาทีที่ 15:08 ราคา SPY อยู่ที่ $113.63 ซึ่งสูงกว่าจุดที่เริ่มดิ่งลง ถือเป็นการเคลื่อนไหวแบบครบวงจรภายในเวลาประมาณครึ่งชั่วโมง
มีการระงับการซื้อขาย (halt) เพียงหนึ่งครั้งตลอดทั้งวัน โดยใช้เวลาเพียงห้าวินาที ตามรายงานอย่างเป็นทางการ ระบุว่าเมื่อเวลา 14:45:28 น. ET — ซึ่งอยู่ในนาทีเดียวกับจุดต่ำสุดข้างต้น — ระบบ Stop Logic ของ CME ได้สั่งหยุดการซื้อขาย E-mini futures ชั่วคราว และราคาเสนอซื้อ (bids) กลับมาอีกครั้งเมื่อระบบยกเลิกการระงับ ระบบ Circuit Breaker ของตลาดโดยรวมในปี 2010 นั้นอ้างอิงจาก Dow ที่ระดับ 10, 20 และ 30 เปอร์เซ็นต์ และกฎเกณฑ์ที่ใช้ในขณะนั้นระบุว่า จะไม่มีการระงับการซื้อขายหากราคาลดลงเพียงสิบเปอร์เซ็นต์ในช่วงท้ายของการซื้อขาย ดังนั้นจึงไม่มีการทำงานของระบบดังกล่าว ส่วนระบบ Circuit Breaker สำหรับหุ้นรายตัวนั้นยังไม่มีในขณะนั้น ซึ่งถือเป็นหนึ่งในสิ่งที่เพิ่งถูกสร้างขึ้นใหม่ในวันดังกล่าว
สาเหตุที่ทำให้เกิดการเทขาย
หน่วยงานกำกับดูแลทราบถึงสาเหตุของการเทขายมาโดยตลอด รายงานจาก SEC–CFTC ระบุถึงกลุ่มกองทุนรวมแห่งหนึ่ง ซึ่งสื่อรายงานว่าเป็น Waddell & Reed โดยมีการใช้อัลกอริทึมแบบอัตโนมัติในการขายสัญญา E-mini ตามปริมาณการซื้อขาย โดยไม่คำนึงถึงระดับราคาหรือเวลา เมื่อปริมาณการซื้อขายเพิ่มขึ้นอย่างรวดเร็ว อัลกอริทึมจึงเร่งขายเร็วขึ้น ในสภาวะตลาดที่ตัวกลางกลุ่ม high-frequency เลิกรับภาระการถือครองสินค้าคงคลัง และเริ่มส่งต่อสินค้าไปมา ซึ่งเป็นลักษณะปริมาณการซื้อขายแบบ "hot potato" ตามที่รายงานระบุไว้ ห้าปีต่อมา มีชื่อที่สองถูกเชื่อมโยงกับเหตุการณ์นี้ โดยทางการสหรัฐฯ ได้จับกุม Navinder Singh Sarao เทรดเดอร์ชาวลอนดอน เมื่อเดือนเมษายน 2015 ในข้อหา spoofing ในสมุดคำสั่งซื้อขาย E-mini ด้วยการวางคำสั่งซื้อขายจำนวนมากโดยไม่มีเจตนาที่จะดำเนินการจริง เมื่อวันที่ 6 พฤษภาคม และวันอื่นๆ อีกหลายร้อยวัน เขาให้การรับสารภาพในปี 2016 และถูกตัดสินโทษในเดือนมกราคม 2020 แม้จะยังมีการถกเถียงกันว่าคำสั่งซื้อขายของเขามีผลกระทบมากน้อยเพียงใดในช่วงบ่ายวันนั้น แต่บทเรียนเชิงโครงสร้างด้านล่างนี้ไม่ได้ขึ้นอยู่กับประเด็นดังกล่าว
จุดที่มีแรงขายรุนแรงที่สุด
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 ET ในช่วงเวลาหกสิบวินาที โดยมีปริมาณการซื้อขาย 4.98 million shares ข้อมูลจาก tape แสดงให้เห็นถึงความจริงที่ชัดเจนว่า: ราคาต้องการแรงซื้อที่สม่ำเสมอ แต่ในช่วงไม่กี่นาทีนั้นไม่มีแรงซื้อเลย นี่คือข้อพิสูจน์ที่ชัดเจนที่สุดในการทำความเข้าใจ กลไกของ market order — คำสั่ง stop-loss ทุกคำสั่งที่ถูกเปิดใช้งานในช่วงเวลานั้น กลายเป็น market order ที่พยายามหาแรงซื้อ (bids) ที่ไม่มีอยู่จริง NBBO เปรียบเสมือนจังหวะการเต้นของหัวใจของตลาด และในช่วงบ่ายวันนั้นจังหวะดังกล่าวได้หยุดลง
หนึ่งเซนต์กับ 100,000 ดอลลาร์: ราคาที่ผิดเพี้ยนอย่างไม่สมเหตุสมผล
เมื่อแรงซื้อจริงหายไป คำสั่งซื้อที่เข้ามาจึงไหลลงไปสู่ราคาเสนอขายที่เหลืออยู่ ซึ่งรวมถึง "stub quotes" ที่ผู้ดูแลสภาพคล่องวางไว้ ซึ่งเป็นราคาที่ห่างไกลจากราคาที่เป็นไปได้ ข้อมูลการซื้อขายดิบยังคงแสดงราคาเหล่านั้นไว้:
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 ASCAccenture (ACN) บริษัทที่ปรึกษาซึ่งซื้อขายอยู่ที่ระดับใกล้ $41.49 ในช่วงบ่ายวันนั้น มีรายการซื้อขาย 43 ที่ราคาห้าเซนต์หรือน้อยกว่า โดยมีราคาต่ำสุดที่ $0.01 ในทางตรงกันข้าม Apple มีรายการซื้อขาย 2 ที่ราคา $100000 ต่อหุ้น และ Sotheby's มีรายการในลักษณะเดียวกันจำนวน 2 ครั้ง
ในภายหลัง ตลาดหลักทรัพย์ได้ยกเลิกทุกรายการซื้อขายที่มีราคาต่างจากราคาอ้างอิงก่อนเกิดเหตุการณ์วิกฤตมากกว่า 60 เปอร์เซ็นต์ ซึ่งเกณฑ์นี้เป็นตัวอธิบายความไม่สมมาตรของข้อมูลที่บันทึกไว้ รายการราคาหนึ่งเซนต์ของ ACN ถูกยกเลิกไป ดังนั้นราคาต่ำสุดของแท่งกราฟรายนาทีที่ ยังคงอยู่ คือ $17.74 จึงมีค่าต่ำกว่าราคาอ้างอิงอยู่ -57.2% ซึ่งอยู่ในขอบเขตที่ถูกยกเลิกพอดี ส่วน Procter & Gamble ไม่เคยมีการซื้อขายที่ราคา stub โดยรายการที่แย่ที่สุดในช่วงเวลาดังกล่าวคือ $39.37 ซึ่งต่ำกว่าราคาอ้างอิงอยู่ -36.7% ดังนั้นคำสั่ง stop-loss ทุกรายการที่ขาย ณ ราคานั้นจึงยังคงได้รับการจับคู่สำเร็จ รายการราคาหนึ่งเซนต์ของ ACN มีราคาหลุดจากเกณฑ์ดังกล่าวจึงถูกลบออกไป ในขณะที่รายการที่แย่ที่สุดของ P&G ยังคงอยู่ในเกณฑ์และได้รับการยืนยัน ขอบเขตที่กำหนดขึ้นอย่างไม่เป็นระบบนี้ได้ให้บทเรียนแก่เทรดเดอร์เกี่ยวกับประเภทของคำสั่งซื้อขายได้มากกว่าคู่มือเล่มใดที่เคยพิมพ์มา
ขอบเขตความเสียหายที่เกิดขึ้น
ข้อมูลเฉพาะช่วงเวลาเดียวกัน โดยวัดจากราคา ณ เวลา 14: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 โดยรวมมีราคาลดลงในระดับหลักเดียว โดย DIA ซึ่งเป็น ETF ที่อ้างอิงดัชนี Dow อยู่ที่ -6.5% และ IWM อยู่ที่ -5.2% ข้อมูลรายนาทีของ DIA ในช่วงเวลาดังกล่าวถูกรายงานไปทั่วโลกว่าเป็นเหตุการณ์ที่ดัชนี Dow มีจุดลดลงระหว่างวันมากที่สุดในประวัติศาสตร์นับจนถึงวันนั้น คอลัมน์สุดท้ายคือผลการฟื้นตัว โดยทั้งหกหลักทรัพย์ปิดตลาดในระดับที่ห่างจากราคา ณ เวลา 14:30 น. เพียงประมาณสามเปอร์เซ็นต์ ราวกับว่าเหตุการณ์ในช่วงชั่วโมงกลางนั้นเป็นเพียงข่าวลือ
การเปรียบเทียบเหตุการณ์วันที่ 6 พฤษภาคม กับวันเกิดเหตุตลาดร่วงรุนแรงอื่นๆ
เปรียบเทียบเหตุการณ์ flash crash กับเหตุการณ์ตลาดร่วงรุนแรงภายในวันเดียวที่สำคัญอื่นๆ ในยุคที่มีการบันทึกข้อมูลแบบรายนาที (ข้อมูลหุ้นชุดนี้เริ่มบันทึกตั้งแต่ปี 2003 ส่วนเหตุการณ์ Black Monday ปี 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_dateวันที่ 6 พฤษภาคม 2010 ไม่ใช่เหตุการณ์ที่ดัชนีตกลงลึกที่สุดในตาราง: 16 มีนาคม 2020 มีการซื้อขายต่ำกว่าราคาปิดก่อนหน้าถึง -12.4% เมื่อเทียบกับ -10.1% ของเหตุการณ์ flash crash แต่ไม่มีวันใดที่มีการฟื้นตัวได้ใกล้เคียงกัน SPY ปิดตลาดสูงกว่าจุดต่ำสุดของวันที่ 6 พฤษภาคม อยู่ที่ 7.5% เทียบกับ 3.9% ซึ่งเป็นการฟื้นตัวที่ดีที่สุดลำดับถัดไปในชุดข้อมูลนี้ (24 สิงหาคม 2015 ซึ่งเป็นเหตุการณ์ mini flash crash) และอยู่ที่เพียง 1.7% และ 0.9% ในช่วงวันเกิดเหตุวิกฤต ยุค Lehman และช่วงวิกฤต COVID การปรับราคาใหม่ (repricing) จะยังคงอยู่ในระดับต่ำจนถึงช่วงปิดตลาด แต่การขาดสภาพคล่อง (liquidity hole) จะทำให้ราคาดีดกลับอย่างรวดเร็วในบ่ายวันเดียวกัน
รูปแบบ V-shape ยังคงอยู่หรือไม่?
คำถามสองข้อเป็นตัวตัดสินว่าเหตุการณ์นั้นคือการดิ่งลงอย่างรุนแรง (crash) หรือไม่: ราคาเดิมกลับมาเร็วแค่ไหน และราคาต่ำสุดในช่วงตื่นตระหนกมีการซื้อขายที่ระดับนั้นอีกหรือไม่ ซึ่งทั้งสองคำถามมีคำตอบที่ชัดเจนแล้ว:
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 ปิดตลาดเหนือระดับราคาปิดเมื่อวันที่ 5 พฤษภาคม ที่ $116.83 เพียง 4 เซสชันต่อมา เมื่อวันที่ 2010-05-12 รูปแบบ V-shape ยังคงอยู่ในช่วงเวลาหนึ่ง แต่จุดต่ำสุดจากการดิ่งลงอย่างรวดเร็ว (flash-crash) ไม่ได้เป็นเพียงความผิดปกติชั่วคราว: เมื่อผ่านไป 37 เซสชันหลังการดิ่งลง ในวันที่ 2010-06-29 SPY ปิดตลาด ที่ $104.22 ซึ่งต่ำกว่าระดับต่ำสุดในช่วงตื่นตระหนกที่ $105 ในช่วงที่มีการเทขายพันธบัตรรัฐบาลยุโรปซึ่งเป็นเหตุการณ์หลักในฤดูร้อนนั้น ประเด็นสำคัญคือความแตกต่างระหว่างสองเหตุการณ์นี้: การดิ่งลงอย่างรวดเร็วทำให้ราคาลงไปถึงระดับนั้นภายในไม่กี่นาทีโดยไม่มีข่าวสารและมีการดีดตัวกลับ แต่เหตุการณ์ในฤดูร้อนใช้เวลาหลายสัปดาห์ในการลงไปถึงระดับนั้นและราคายังคงค้างอยู่ที่ระดับต่ำ ราคาคือสิ่งที่คุณสามารถทำธุรกรรมได้ในวินาทีนี้ ส่วนมูลค่าคือสิ่งที่ยังคงอยู่รอดเมื่อสิ้นสุดช่วงบ่าย
การเปลี่ยนแปลงที่เกิดขึ้นหลังจากนั้น
เหตุการณ์ flash crash นำไปสู่การกำหนดระบอบ circuit-breaker ในปัจจุบัน ซึ่งประกอบด้วยกรอบราคา Limit Up/Limit Down สำหรับหุ้นรายตัว และการปรับปรุงเกณฑ์การระงับการซื้อขายทั่วทั้งตลาด ซึ่งกลไกเหล่านี้ปรากฏให้เห็นในวิกฤตการณ์ต่อมา (การระงับการซื้อขายในเดือนมีนาคม 2020 คือผลลัพธ์โดยตรงจากเหตุการณ์ดังกล่าว) มีการสั่งห้ามใช้ stub quotes และมีการกำหนดกฎเกณฑ์สำหรับธุรกรรมที่ผิดพลาดอย่างชัดเจน (clearly-erroneous-trade) นอกจากนี้ คำสั่งซื้อขาย futures ขนาดใหญ่ยังต้องผ่านการตรวจสอบการดำเนินการที่คำนึงถึงระดับราคา โครงสร้างตลาดที่คุณซื้อขายอยู่ในปัจจุบันส่วนใหญ่ถูกร่างขึ้นในช่วงเวลาสามสิบหกนาทีหลังจากเหตุการณ์นั้น
คำถามที่พบบ่อยเกี่ยวกับ Flash crash
อะไรคือสาเหตุของ flash crash ในปี 2010?
รายงานอย่างเป็นทางการจาก SEC/CFTC ระบุว่าเกิดจากโปรแกรมขาย E-mini แบบอัตโนมัติมูลค่าประมาณ 4.1 พันล้านดอลลาร์ ซึ่งดำเนินการในช่วงที่มีสภาพคล่องต่ำ โดยมีตัวกลางที่ใช้การซื้อขายความถี่สูง (high-frequency intermediaries) เป็นตัวขยายปริมาณการซื้อขายก่อนจะถอนตัวออกไป ข่าวระบุว่าผู้ขายคือบริษัทกองทุนรวม Waddell & Reed ส่วน Navinder Sarao นักเทรดรายหนึ่งถูกดำเนินคดีในภายหลังข้อหาทำ spoofing ในตลาดเดียวกันในวันนั้น สำหรับมุมมองจากข้อมูลการซื้อขายระบุว่า สภาพคล่องหายไปอย่างรวดเร็ว และราคาดิ่งลงไปหาจุดที่มีแรงซื้อ (bid) ถัดไป ซึ่งบางครั้งเหลือเพียงแค่หนึ่งเซนต์
Flash crash เริ่มต้นและสิ้นสุดเมื่อใด?
ลำดับเวลาจากหน่วยงานกำกับดูแลเริ่มตั้งแต่เวลาประมาณ 14:32 น. ตามเวลา ET เมื่อการขายแบบอัตโนมัติเริ่มต้นขึ้น จนถึงเวลาประมาณ 15:08 น. เมื่อราคาทั่วตลาดฟื้นตัวกลับมาได้เกือบเท่าระดับก่อนการดิ่งลง ซึ่งใช้เวลาทั้งหมด 36 นาที โดยจุดต่ำสุดของ SPY อยู่ที่ 14:45 ET หรือต่ำกว่าราคาปิดก่อนหน้า -10.1% และใช้เวลาประมาณ 23 นาทีจากจุดต่ำสุดเพื่อกลับเข้าสู่ระดับก่อนเกิดเหตุการณ์
หุ้นตัวใดบ้างที่ได้รับผลกระทบใน flash crash ปี 2010?
ราคาหุ้นเกือบทุกตัวลดลง แต่หุ้นที่ได้รับความเสียหายอย่างรุนแรงคือหุ้นที่แรงซื้อหายไปโดยสิ้นเชิง โดย Accenture มีราคาต่ำสุดที่ $0.01, Apple และ Sotheby's มีราคาที่ $100000 และ Procter & Gamble มีการซื้อขายลดลงไปที่ $39.37 หรือต่ำกว่าระดับในช่วงบ่ายอยู่ -36.7% ทั้งนี้ รายการซื้อขายที่มีส่วนต่างมากกว่า 60 เปอร์เซ็นต์จากราคาก่อนเกิด flash crash ถูกยกเลิกไป แต่รายการซื้อขายของ P&G ยังคงมีผลอยู่
การซื้อขายหยุดชะงักระหว่างเกิด flash crash หรือไม่?
ไม่มีการใช้กลไกหยุดการซื้อขายทั้งตลาด (market-wide circuit breaker) เมื่อวันที่ 6 พฤษภาคม 2010 เนื่องจากกฎเกณฑ์ที่มีผลบังคับใช้ในขณะนั้นระบุว่า จะไม่มีการหยุดการซื้อขายหากราคาลดลงในระดับดังกล่าวในช่วงท้ายของเซสชัน การหยุดชะงักเพียงอย่างเดียวในวันนั้นใช้เวลาเพียงห้าวินาที โดยระบบ Stop Logic ของ CME ได้หยุดการซื้อขาย E-mini futures ชั่วคราวที่เวลา 14:45:28 น. ตามเวลา ET ซึ่งเป็นนาทีเดียวกับที่ดัชนีทำจุดต่ำสุด หลังจากเหตุการณ์นี้จึงมีการสร้างกลไก circuit breakers สำหรับหุ้นรายตัว และกรอบราคา Limit Up/Limit Down ขึ้นมา
Flash crash สามารถเกิดขึ้นอีกได้หรือไม่?
เหตุการณ์ขนาดเล็กเคยเกิดขึ้นมาแล้ว โดยหุ้นรายตัวมักจะถูกหยุดการซื้อขายด้วยกลไก LULD เป็นประจำ และเหตุการณ์ flash crash ขนาดเล็กก็เกิดขึ้นซ้ำๆ ส่วนเหตุการณ์ขนาดใหญ่ระดับตลาดทั้งระบบแบบปี 2010 นั้น จนถึงปัจจุบันถูกควบคุมไว้ได้ด้วยกลไกการหยุดการซื้อขายที่ถูกสร้างขึ้นจากเหตุการณ์ดังกล่าว คำตอบที่แท้จริงคือ ปัจจัยเชิงโครงสร้างอย่างสภาพคล่องที่สามารถหายไปได้ภายในเสี้ยววินาทีนั้นเป็นสิ่งที่เกิดขึ้นอย่างถาวร
หมายเหตุข้อมูล
หมายเหตุข้อมูลฉบับเต็ม
- ข้อมูลรายนาทีในแท่งเวลา 15:09 มีค่าต่ำสุดที่ผิดปกติคือ 108.37 หลังจากเกิดการฟื้นตัว และแท่งเวลาเดียวกันนี้ปรากฏอยู่ในตารางที่มีการเปลี่ยนแปลงรายนาทีรุนแรงที่สุด ซึ่งสอดคล้องกับการรายงานราคาล่าช้า โดยข้อมูลสรุปจะบันทึกราคาในนาทีที่ข้อมูลมาถึง ในวันที่ 6 พฤษภาคม มีกรณีเช่นนี้เกิดขึ้นจำนวนมาก
- การยกเลิกรายการซื้อขายและข้อมูลสรุป: ข้อมูลดิบของ ACN แสดงราคาที่ $0.01 ในขณะที่ราคาต่ำสุดในแท่งนาทีคือ $17.74 โดยข้อมูลสรุปรายนาทีจะสะท้อนบันทึกหลังการยกเลิกรายการ ส่วนข้อมูลดิบจะแสดงราคาที่บันทึกไว้ตอนแรก
- "จุดอ้างอิงเวลา 14:30 น." ในแผงแสดงค่าความเบี่ยงเบน (dispersion panel) คือราคาปิดรายนาทีสุดท้ายในช่วงเวลาทำการปกติของแต่ละหลักทรัพย์ ณ เวลาหรือก่อนเวลา 14:30 น. ตามเวลา ET โดยช่วงเวลาที่เกิดการดิ่งลงของราคาคือ 14:31–15:15 น.
- ไม่พบ QQQ ในแผงแสดงข้อมูลเปรียบเทียบระหว่างหลักทรัพย์ เนื่องจากในปี 2010 มีการซื้อขายภายใต้ชื่อย่อ QQQQ
แผงข้อมูลทั้งหมดข้างต้นมาจากการดึงข้อมูลผ่าน SQL query ที่มีการบันทึกเวอร์ชันไว้จากข้อมูลการซื้อขายย้อนหลัง — คุณสามารถขยายคำสั่ง SQL เพื่อดูรายละเอียดการวัดผลแต่ละรายการ หากต้องการทดลองเทรดในสถานการณ์ของวันนี้แทนการอ่านข้อมูล สามารถลองเล่นได้ใน โปรแกรมจำลองการเทรดของ Strasmore Labs