Strasmore Research
徹底分析 Matt Connor著者: Matt Connor ・更新: 2026-07-24

2020年コロナショックの記録

2020年の暴落を検証します。4回のサーキットブレーカー発動とSPYのピークから安値までの推移をまとめました。

2020年のCOVIDショックにより、S&P 500は2月19日の史上最高値から-34.2%のピーク・トゥ・トラフ(高値から安値)の損失を記録しました。この過程で23取引日間にわたり、1997年以来初となる4回の市場全体へのサーキットブレーカー発動がありました。本ページでは、暴落の全容を記録に基づき再現します。暴落の推移、3月9日の取引停止が発生したセッションの分単位の記録(データ欠損時間を含む。これらは本ページで最も正確な証拠となります)、下落率の大きかった銘柄、およびその際の米国債とオプション市場の動きを掲載しています。すべての数値は保存されたクエリに基づいています。各パネルを展開するとSQLを確認できます。

暴落の全容を一行に

歴史的な単一日の前に、その推移をまとめました。SPYの通常取引終了価格に関する一つのクエリにより、ピーク、底、下落速度、および回復が特定されます。比較対象として、2008年の弱気相場についても同様の測定を行っています。

クエリCOVID暴落:ピークから底、そして回復へ — SPY日足終値(1行)
各数値の背後にある正確なSQL
WITH dailies AS (
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2020-02-01 00:00:00') AND window_start < toDateTime('2020-09-01 00:00:00')
    GROUP BY d
),
peak AS (SELECT argMax(d, (c, -toInt32(d))) AS pd, max(c) AS pc FROM dailies WHERE d < toDate('2020-03-01')),
trough AS (SELECT argMin(d, (c, toInt32(d))) AS td, min(c) AS tc FROM dailies WHERE d < toDate('2020-04-01')),
gfc AS (
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2007-06-01 00:00:00') AND window_start < toDateTime('2009-01-01 00:00:00')
    GROUP BY d
),
gpeak AS (SELECT argMax(d, (c, -toInt32(d))) AS pd, max(c) AS pc FROM gfc WHERE d < toDate('2008-01-01'))
SELECT
    toString((SELECT pd FROM peak)) AS peak_date,
    round((SELECT pc FROM peak), 2) AS peak_close,
    toString((SELECT td FROM trough)) AS trough_date,
    round((SELECT tc FROM trough), 2) AS trough_close,
    round(((SELECT tc FROM trough) / (SELECT pc FROM peak) - 1) * 100, 1) AS decline_pct,
    countIf(d > (SELECT pd FROM peak) AND d <= (SELECT td FROM trough)) AS sessions_peak_to_trough,
    dateDiff('day', (SELECT pd FROM peak), (SELECT td FROM trough)) AS calendar_days,
    countIf(d > (SELECT pd FROM peak) AND d <= (SELECT min(d) FROM dailies WHERE c <= 0.7 * (SELECT pc FROM peak))) AS sessions_to_minus_30,
    (SELECT countIf(d > (SELECT pd FROM gpeak) AND d <= (SELECT min(d) FROM gfc WHERE c <= 0.7 * (SELECT pc FROM gpeak))) FROM gfc) AS gfc_2008_sessions_to_minus_30,
    toString((SELECT min(d) FROM dailies WHERE d > (SELECT td FROM trough) AND c >= (SELECT pc FROM peak))) AS recovery_date,
    countIf(d > (SELECT td FROM trough) AND d <= (SELECT min(d) FROM dailies WHERE d > (SELECT td FROM trough) AND c >= (SELECT pc FROM peak))) AS sessions_trough_to_recovery
FROM dailies

SPYのピーク時の終値は2020-02-19$338.31でした。底の終値は2020-03-23$222.51で、ピークから-34.2%下落しています。これは23取引日、すなわち33暦日間に凝縮された弱気相場でした。「史上最速の30%下落」というよく引用される主張も、同じ行に裏付けられています。SPYの終値がピークから30%下落したのは、わずか22取引後のことです。2007年10月のピーク終値から同様に測定した2008年の弱気相場では、同じ30%の下落に250取引日を要しました。2008年には約1年を要した動きが、2020年には約1ヶ月で発生しました。

本ページのパネルから取得した数値に基づく、暴落の時系列データは以下の通りです。

  • 2020年2月19日 — SPYの最高値終値、$338.31
  • 3月9日 — 1997年以来初となる市場全体へのサーキットブレーカーの発動。SPYは-7.7%下落して終了。詳細は以下の分単位の記録を参照。
  • 3月12日、16日、18日 — さらに3回のLevel-1停止。3月16日は-11.6%の下落となり、暴落期で最悪の単日となりました。
  • 3月23日 — 最安値終値:$222.51、ピークから-34.2%の下落。
  • 3月24日 — 反転。3月24日の刺激策によるラリーがその動きを牽引しました。
  • 2020-08-18 — SPYは安値から103取引後に、再び2月のピークを上回って終了。

2020年3月9日:サーキットブレーカーが発動したセッション

市場全体のサーキットブレーカーはS&P 500を基準としています。そのため、このパネルでは他の指標ではなく、S&P 500 ETFであるSPYを通じて取引停止を読み取ります。直前の週末、パンデミックによる価格再編が原油供給ショック(詳細は後述)と重なり、市場は秩序ある状態で取引を開始できませんでした。

クエリ2020年3月9日 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('2020-03-06 00:00:00') AND window_start < toDateTime('2020-03-09 04:00:00')
    ) AS prior_rth_close,
    (
        SELECT (formatDateTime(toTimeZone(addMinutes(prev_bar, 1), 'America/New_York'), '%H:%i'), gap_minutes - 1)
        FROM (
            SELECT
                lagInFrame(window_start) OVER (ORDER BY window_start ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_bar,
                dateDiff('minute', prev_bar, window_start) AS gap_minutes
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'SPY'
              AND window_start >= toDateTime('2020-03-09 04:00:00') AND window_start < toDateTime('2020-03-09 23:59:00')
              AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
        )
        WHERE prev_bar > toDateTime('2020-03-09 00:00:00')
        ORDER BY gap_minutes DESC
        LIMIT 1
    ) AS halt_gap
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,
    halt_gap.1 AS halt_first_missing_et,
    halt_gap.2 AS halt_missing_minutes,
    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(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('2020-03-09 04:00:00') AND window_start < toDateTime('2020-03-09 23:59:00')

まず、2つの数字を挙げます。1つ目はギャップです。SPYは$275.3で寄り付き、金曜終値の$297.42から-7.4%下落しました。そして開始数分以内に、S&P 500の下落率はレベル1の閾値である7%に達しました。2つ目は、より重要な点です。通常の390本ではなく、376本の通常セッションの分足が表示されています。午前9時34分に取引が停止しました。東部標準時09:35から、14分間連続してバーが全く表示されません。どこでも取引が行われませんでした。このデータの空白こそが、サーキットブレーカーそのものです。セッションは$274.4で終了し、-7.7%の下落、出来高は304.6百万株となりました。

取引停止セッションの推移

クエリSPY 30分足 — 2020年3月9日 通常取引時間
各数値の背後にある正確なSQL
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(toFloat64(argMax(close, window_start)), 2) AS bucket_close,
    round(min(toFloat64(low)), 2) AS bucket_low,
    round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
  AND window_start >= toDateTime('2020-03-09 04:00:00') AND window_start < toDateTime('2020-03-09 23:59:00')
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY et_time
ORDER BY et_time

最初の時間枠には、急落、取引停止、および再開がすべて含まれています。安値の$273.5は、一日の安値である$273.45とほぼ同水準です。14:44 ETの午後の価格は、単に朝の価格を再テストしたに過ぎません。再開後の値動きはほとんどありませんでした。30分ごとの終値はすべて、再開価格から数ドルの範囲内に収まっており、一日の下落は開始直後の数分間で発生しました。出来高もこれとは逆の動きを示しています。最後の30分間の出来高は46.7 million sharesに達し、引けにかけてのフローにより、一日で最も大きな取引量となりました。サーキットブレーカーは、まさにこのような推移を生むように設計されています。つまり、価格の急落を阻止し、再開オークションを強制し、適正価格で連続取引を再開させる仕組みです。市場の時計には、現在この仕組みが恒久的に組み込まれています。

8セッションで4回の取引停止

3月9日は、その最初の事例に過ぎませんでした。

クエリ2020年3月のサーキットブレーカー発生4日間 — SPY終値、騰落率、出来高
各数値の背後にある正確なSQL
SELECT
    toString(et_date) AS session,
    close_usd,
    change_pct,
    shares_m
FROM (
    SELECT et_date, close_usd, shares_m,
           round((close_usd / lagInFrame(close_usd) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1) * 100, 1) AS change_pct
    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,
            round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY'
          AND window_start >= toDateTime('2020-03-06 00:00:00') AND window_start < toDateTime('2020-03-19 00:00:00')
        GROUP BY et_date
    )
)
WHERE toString(et_date) IN ('2020-03-09', '2020-03-12', '2020-03-16', '2020-03-18')
ORDER BY et_date

Level-1ブレーカーは、3月12日(-9.6%で終了)、3月16日(-11.6%を$239.41で記録。S&Pにとって1987年以来最大の1日騰落率)および3月18日(日中停止、-5.2%で終了)にも作動しました。23年間にわたり停止がなかった後、8取引日で4回の市場全体に及ぶ停止が発生しました。特筆すべき点は、すべての停止が7%の階層であるLevel 1であったことです。13%および20%の階層には一度も到達しませんでした。3月16日においても、停止後に下落が収まり、セッションはLevel-2のライン内で終了しました。

Who fell hardest

An index number hides the dispersion underneath it. The same daily-close arithmetic, run across a handful of representative large-caps, shows where the crash actually landed — both on March 9 itself and across the full February 19 to March 23 slide.

クエリ3月9日および暴落時の動き — 巡航、航空、エネルギー、銀行、ハイテク、生活必需品 vs SPY
各数値の背後にある正確なSQL
WITH dailies AS (
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('UAL', 'CCL', 'XOM', 'JPM', 'AAPL', 'WMT', 'SPY')
      AND window_start >= toDateTime('2020-02-18 00:00:00') AND window_start < toDateTime('2020-03-25 00:00:00')
    GROUP BY ticker, d
)
SELECT
    ticker,
    round((anyIf(c, d = toDate('2020-03-09')) / anyIf(c, d = toDate('2020-03-06')) - 1) * 100, 1) AS mar9_pct,
    round((anyIf(c, d = toDate('2020-03-23')) / anyIf(c, d = toDate('2020-02-19')) - 1) * 100, 1) AS crash_pct
FROM dailies
GROUP BY ticker
ORDER BY crash_pct ASC

The hardest-hit name in the panel, CCL (Carnival, the cruise operator), lost -19.9% on March 9 alone and -72.3% peak to trough. United Airlines gave up -66.9% over the crash; ExxonMobil -47.9%; JPMorgan -42.6%. Against them, SPY's -34.2% looks almost gentle, Apple fell roughly with the market at -31%, and Walmart — groceries, essentials, open through lockdowns — finished the same window at just -2.9%. Travel and energy repriced for a stopped world; staples barely moved.

原油価格戦争の概要

エネルギーを巡る対立について、簡潔に説明します。「原油価格戦争」という言葉は、3月9日の記事の後半部分に関連しています。サウジアラビアとロシアによるOPEC+の減産協議は、2020年3月6日(金)に合意に至らず終了しました。週末にかけて、サウジアラビアは公式販売価格を引き下げ、さらに増産計画を発表しました。当時、旅行需要はすでに急減しており、供給ショックが需要ショックに重なる形となりました。月曜日の株式市場の取引開始時には、これら両方の要因が同時に影響しました。その結果は上記のパネルの通りです。ExxonMobilは、同月曜日にSPYの-7.7%に対し、-12.2%下落しました。

安全資産への逃避 — その崩壊の週

株式市場だけでは状況を説明できません。もう一つの側面は米国債市場です。そこでは典型的な安全資産への逃避が記録的な水準に達しましたが、ある驚くべき週には、その動きが逆転しました。

クエリ暴落時における10年債および3ヶ月債利回り(日次終値)
各数値の背後にある正確なSQL
SELECT
    toString(date) AS date,
    round(yield_10_year, 2) AS ten_year_pct,
    round(yield_3_month, 2) AS three_month_pct
FROM global_markets.treasury_yields
WHERE date >= '2020-02-18' AND date <= '2020-03-31'
  AND isNotNull(yield_10_year)
ORDER BY date

2月19日の株式市場のピーク時、10年債利回りは1.56%でした。取引停止となった3月9日には、安全性を求めて買い手が10年間で年0.5%の利回りを許容した結果、史上最低の0.54%で取引を終えました。その後、パターンが逆転しました。3月18日にかけて、株式が下落し続ける中で10年債利回りは1.18%まで上昇しました。これは「ダッシュ・フォー・キャッシュ」と呼ばれる現象です。ファンド、企業、海外保有者が、ドルを調達するために米国債を含む流動性のある資産をすべて売却した週でした。一方、同日の3ヶ月物利回りは0.02%で取引を終え、現金同等物はゼロ付近に固定されました。最も安全な資産と最もリスクの高い資産が同時に下落する場合、買い戻されているのは流動性そのものです。イールドカーブの歴史には、この出来事が恒久的に刻まれています。

オプション取引の動向

市場のヘッジ手段であるSPYのオプション取引には、パニックの発生が記録されています。注目すべきはそのタイミングです。

クエリSPYオプション:プット vs コール取引量、2020年3月2日–13日(百万枚単位)
各数値の背後にある正確なSQL
SELECT
    toString(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) AS session,
    round(sumIf(toFloat64(size), substring(ticker, 12, 1) = 'P') / 1e6, 2) AS put_contracts_m,
    round(sumIf(toFloat64(size), substring(ticker, 12, 1) = 'C') / 1e6, 2) AS call_contracts_m,
    round(sumIf(toFloat64(size), substring(ticker, 12, 1) = 'P') / sumIf(toFloat64(size), substring(ticker, 12, 1) = 'C'), 2) AS put_call_ratio
FROM global_markets.options_trades
WHERE ticker >= 'O:SPY2' AND ticker < 'O:SPY3'
  AND sip_timestamp >= toDateTime('2020-03-02 00:00:00') AND sip_timestamp < toDateTime('2020-03-14 00:00:00')
GROUP BY session
ORDER BY session

金曜日の3月6日、取引停止セッションのに、プット/コール・ボリューム比率が1.95(コール1に対してプットがほぼ2)というピークに達しました。3月9日には、プットが4.35百万、コールが2.38百万取引され、比率は1.83となりました。3月12日の-9.6%セッションでは、プットの増加に伴いコールも取引が増えたため、比率は1.32まで低下しました。プットの偏りが最も大きかったのは、下落の底ではなく、下落の初期段階でした。つまり、ヘッジの買いは早期に行われ、その後の大幅な下落局面では、オプション取引はより両建てに近い状態でした。

市場全体の一時停止(サーキットブレーカー)の仕組み

市場全体の一時停止は、発生頻度が低いため仕組みが忘れられがちです。サーキットブレーカーはS&P 500の前日終値からの下落率に基づきます。米東部時間午後3時25分より前に、7%(レベル1)または13%(レベル2)に達した場合、それぞれ15分間の取引停止が発動します。20%(レベル3)に達した場合は、その日の取引が終了します。停止中はどの取引所でも取引が行われません。注文は再開オークションに向けて蓄積されます。これは毎朝の オープニングオークション と同様に、蓄積された注文を一つの価格に集約します。この仕組みは 2010年のフラッシュクラッシュ の後に導入されました。それ以前の基準では、急激な価格下落が起きても発動するには緩すぎることが判明したためです。

2020年3月は、この仕組みが初めて、かつ現時点で唯一実際に運用されたケースです。結果は上記のパネルの通りです。レベル1の停止が4回発生しましたが、その都度秩序立てて取引が再開されました。レベル2およびレベル3には一度も達しませんでした。指数史上最速の大幅下落となった 23 セッションすべてにおいて、市場は正常に機能しました。その後もルールは維持されています。S&P 500を基準とする7/13/20の閾値は、現在も適用されています。システムは負荷を受けましたが、仕組みは機能しました。

COVID暴落に関するFAQ

2020年3月9日にサーキットブレーカーが発動した原因は何ですか?

S&P 500が取引開始数分以内に、前日終値からLevel-1の市場全体の発動基準である7%下落したためです。市場全体で15分間の取引停止が行われ、その後オークション形式で取引が再開されました。この停止は、東部標準時09:35から14本連続してバーが欠落していることから、本ページの分足テープで確認できます。

COVID暴落で株式市場はどの程度下落しましたか?

SPYの終値に基づくと、23取引セッションにわたり、2020年2月19日の$338.31から2020年3月23日の$222.51まで、-34.2%下落しました。

2020年3月にサーキットブレーカーは何回発動しましたか?

市場全体を対象としたLevel-1の発動が4回ありました。日付は3月9日、12日、16日、18日です。これらは1997年10月以来、初めての事例となりました。

2020年にLevel 2またはLevel 3のサーキットブレーカーは発動しましたか?

いいえ。2020年の4回の発動はすべてLevel 1(7%)でした。現在の設計において、Level 2(13%)またはLevel 3(20%)の市場全体の発動は一度も発生していません。暴落で最も深刻なセッションであった-11.6%の3月16日においても発動しませんでした。

市場はCOVID暴落から完全に回復しましたか?

はい。SPYは、3月23日の安値から103取引セッション後の2020-08-18に、2020年2月19日のピークを上回って取引を終えました。これは、これほどの深さの弱気相場からの回復としては、最も速いものの一つです。


上記のパネルはすべて、ヒストリカルテープに対する保存・バージョン管理されたクエリです。SQLを展開すると各測定値を確認できます。読み物としてではなく、当時の状況を体験したいですか? Strasmore Labs トレーディングシミュレーターでプレイ可能なシナリオの一つとして用意されています。

#market history#covid crash#circuit breakers#spy