флеш-крэш 2010 хвилина за хвилиною
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 за східним часом, що на -10.1% нижче за попереднє закриття $116.83. До дзвінка SPY відіграв до $112.88, що становить -3.4% за день, але все ще значно вище дна повітряної ями. Обсяг: 639.9 мільйонів акцій — одна з найважчих сесій SPY за всю його історію.
Крах, хвилина за хвилиною
Годинні графіки приховують цю подію; на хвилинному таймфреймі вона незаперечна. Ось SPY з 14:00 до 15: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 датує подію приблизно з 14:32 за східним часом, коли велика автоматизована програма продажу почала виконувати замовлення приблизно на 75 000 ф'ючерсних контрактів на E-mini S&P 500 (близько $4,1 млрд), до приблизно 15:08, коли широкі ціни відіграли більшу частину падіння, — загалом тридцять шість хвилин. Стрічка вище відповідає цій дузі. SPY завершив 14:32 хвилину на рівні $113.15. Через дванадцять хвилин, на 14:44 хвилині, було проторговано 9.21 мільйонів акцій, порівняно з 1.44 мільйонами у спокійну хвилину, як-от 14:05, а на 14:45 хвилині було зафіксовано денний мінімум у $105. До закриття 15:08 хвилини SPY становив $113.63, що вище за рівень, з якого почалося падіння. Повний цикл приблизно за пів години.
За весь день спрацювала лише одна зупинка, і вона тривала п'ять секунд. О 14:45:28 за східним часом, у ту саму хвилину, що й мінімум вище, механізм Stop Logic CME призупинив торгівлю ф'ючерсами на E-mini, згідно з офіційним звітом, і після його зняття повернулися заявки на купівлю. Загальноринкові запобіжники 2010 року були прив'язані до індексу Dow на рівнях 10, 20 та 30 відсотків, і чинні тоді правила не передбачали жодної зупинки для падіння на десять відсотків так пізно під час сесії; жодна не спрацювала. Запобіжники для окремих акцій тоді ще не існували, вони є одними з винаходів цього дня.
Що спричинило розпродаж
Продавець ніколи не був таємницею для регуляторів. У звіті SEC–CFTC описано один комплекс взаємних фондів, ідентифікований у пресі як Waddell & Reed, який використовував автоматизований алгоритм для продажу E-mini контрактів зі швидкістю, прив'язаною до обсягу, без урахування ціни чи часу. Коли обсяг вибухнув, алгоритм прискорив продажі на ринку, де високочастотні посередники перестали поглинати запаси й почали перекидати їх один одному — це відомий обсяг «гарячої картоплі» зі звіту. Через п'ять років до цього дня прив'язалося друге ім'я: у квітні 2015 року влада США заарештувала лондонського трейдера Навіндера Сінгха Сарао за спуфінг книги заявок 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 за східним часом, на 4.98 мільйонах акцій за шістдесят секунд. Стрічка показує просте й незмінне: цінам потрібні покупці, які готові купувати, а кілька хвилин їх не було. Це найсильніший аргумент, коли-небудь зафіксований, для розуміння що робить ринковий ордер: кожен стоп-лос, що спрацював у цьому вікні, перетворився на ринковий ордер, який шукав заявки на купівлю, яких не існувало. NBBO — це серцебиття ринку, і того дня воно зупинилося.
Копійка та $100 000: абсурдні угоди
Коли реальні заявки зникли, вхідні ордери спускалися до тих котирувань, що залишилися, включно з "заглушками" маркет-мейкерів, виставленими далеко від будь-якої реалістичної ціни. Сирий стрічка угод досі зберігає ці записи:
Точний 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 ніколи не торгувалася за "заглушкою": її найгірша угода того періоду, $39.37, була на -36.7% нижче референтної ціни, тому кожен стоп-лосс, який продав там, зберіг виконання. Копійчані угоди 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 травня виглядає на тлі інших краш-днів
Порівняймо флеш-крих з іншими відомими одноденними обвалами в епоху хвилинних даних (цей стрічка акцій сягає 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_date6 травня 2010 року — не найглибша яма в таблиці: 16 березня 2020 року торгувався на -12.4% нижче за попереднє закриття проти -10.1% для флеш-криху. Але жоден інший день не наближається до нього за відскоком. SPY закрився на 7.5% вище за свій мінімум 6 травня, проти 3.9% для наступного найкращого відновлення в наборі (24 серпня 2015 року, сам по собі міні-флеш-крих) і лише 1.7% та 0.9% у дні обвалів ери Леман та COVID. Переоцінка залишається на низькому рівні до закриття; ліквідна яма відскакує того ж дня.
Чи встояла 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 закрився вище за рівень закриття 5 травня на рівні $116.83 вже через 4 торгових сесій, 2010-05-12. V-подібна форма встояла, принаймні на деякий час. Але мінімум флеш-краху не залишився аномалією: через 37 сесій після краху, 2010-06-29, SPY закрився на рівні $104.22, нижче за панічний мінімум $105, під час розпродажу європейських суверенних боргів, який домінував того літа. Різниця і є ключовим моментом: флеш-крах досяг цієї ціни за лічені хвилини, без жодних новин, і відскочив; літо ж досягло її за тижні й залишилося там. Ціна — це те, за чим ви можете укласти угоду цієї секунди; вартість — це те, що переживає післяобідній час.
Що змінилося після того
Раптовий обвал породив сучасний режим запобіжників: смуги обмеження зростання/падіння (Limit Up/Limit Down) для окремих акцій та переглянуті загальноринкові зупинки торгів — механізми, які проявилися в пізніших кризах (зупинки березня 2020 року — їхні прямі нащадки). Стьоб-котирування (stub quotes) були заборонені; формалізовано правила щодо явно помилкових угод; великі ф'ючерсні ордери тепер проходять перевірку виконання з урахуванням ціни. Ринкова структура, в якій ви торгуєте сьогодні, значною мірою була сформована внаслідок тих тридцяти шести хвилин.
Поширені запитання про флеш-кризу
Що спричинило флеш-кризу 2010 року?
Офіційний звіт SEC/CFTC описав автоматизовану програму продажу E-mini приблизно на 4,1 млрд доларів, яка виконувалася в умовах низької ліквідності. Високочастотні посередники спочатку нарощували обсяги, а потім вийшли з ринку. Преса ідентифікувала продавця як компанію Waddell & Reed, що керує взаємними фондами. Трейдера Навіндера Сарао пізніше притягнули до відповідальності за спуфінг на тому ж ринку того дня. Суть події: ліквідність зникла, і ціни впали до рівня наступної заявки на купівлю, іноді до копійки.
Коли почалася і закінчилася флеш-криза?
За хронологією регуляторів, подія тривала приблизно з 14:32 за східним часом, коли почався автоматизований продаж, до приблизно 15:08, коли більшість цін відновилися після падіння, тобто 36 хвилин. Мінімум SPY був зафіксований о 14:45 за східним часом, що на -10.1% нижче за попереднє закриття. Повернення до рівнів до падіння зайняло близько 23 хвилин від дна.
Які акції постраждали під час флеш-кризи 2010 року?
Впало майже все, але найвідомішими жертвами стали папери, чиї заявки на купівлю повністю зникли: Accenture торгувався за ціною аж $0.01, Apple та Sotheby's — за $100000, а Procter & Gamble впав до $39.37, що на -36.7% нижче за його післяобідній рівень. Угоди, укладені за ціною більш ніж на 60% нижчою за докризову, були скасовані; угоди з P&G залишили в силі.
Чи зупинялися торги під час флеш-кризи?
6 травня 2010 року загальноринковий запобіжник не спрацював. Чинні тоді правила не передбачали зупинки торгів при падінні такого масштабу в такій пізній фазі сесії. Єдина пауза того дня тривала п'ять секунд: о 14:45:28 за східним часом механізм Stop Logic CME ненадовго зупинив торгівлю ф'ючерсами E-mini — у ту ж хвилину, коли індекс досяг дна. Пізніше були створені запобіжники для окремих акцій та ліміти зростання/падіння (Limit Up/Limit Down).
Чи може флеш-криза повторитися?
Менші версії траплялися: окремі символи регулярно досягають лімітів LULD, а міні-флеш-події повторюються. Повномасштабна ринкова версія рівня 2010 року поки що стримується механізмами зупинки, які вона ж і породила. Чесно кажучи, структурний інгредієент — ліквідність, яка може зникнути за мілісекунди, — є постійним.
Примітки до даних
Повні примітки до даних
- Панель із хвилинними даними: бар о 15:09 містить випадковий мінімум 108.37, зафіксований через кілька хвилин після відновлення, і цей самий бар з'являється серед рядків таблиці найрізкіших хвилинних рухів, що узгоджується з угодами, звітованими із запізненням, які агрегати відносять до хвилини їхнього надходження. Стрічка угод за 6 травня містить багато таких.
- Скасовані угоди та агрегати: сира стрічка ACN показує ціни $0.01, тоді як хвилинний мінімум становить $17.74. Хвилинні агрегати відображають запис після скасування, а сира стрічка угод — початкові ціни.
- «Орієнтир 14:30» на панелі дисперсії — це ціна закриття останнього хвилинного бару регулярної сесії кожного інструмента станом на 14:30 за східним часом або раніше; вікно краху — з 14:31 до 15:15.
- QQQ відсутній у панелях із кількома інструментами: у 2010 році він торгувався під тікером QQQQ.
Кожна панель вище — це збережений версіонований запит до історичної стрічки угод. Розгорніть SQL, щоб побачити кожен вимір. Хочете відчути цей день, а не просто прочитати про нього? Він є одним із відтворюваних сценаріїв у торговельному симуляторі Strasmore Labs.