Strasmore Research
Análises detalhadas Matt ConnorPor Matt Connor · Atualizado 2026-07-23

crash do covid 2020 e circuit breakers

Analise a queda do SPY em 2020 com detalhes sobre os quatro circuit breakers e os minutos ausentes no tape de 9 de março para entender a volatilidade extrema.

A queda do COVID em 2020 levou o S&P 500 de um fechamento recorde em 19 de fevereiro a uma perda de -34.2% do pico ao fundo em 23 dias de negociação — com quatro interrupções de circuit-breaker em todo o mercado, a primeira desde 1997. Esta página reproduz todo o ciclo a partir dos dados: o mapa da queda, a sessão de interrupção de 9 de março minuto a minuto (incluindo os minutos ausentes nos dados, que são o melhor comprovante na página), os ativos que sofreram as maiores quedas, e o que os Treasuries e o mercado de opções fizeram simultaneamente. Cada número é uma consulta armazenada; expanda qualquer painel para ver o SQL.

O crash completo, em uma única linha

Antes do famoso dia isolado, o panorama. Uma consulta sobre os fechamentos do SPY na sessão regular diária identifica o pico, o fundo, a velocidade e a recuperação — além da mesma métrica aplicada ao bear market de 2008 para fins de comparação.

QueryO crash da COVID: do pico ao fundo e recuperação — fechamentos diários do SPY, uma linha
O SQL exato por trás de cada número
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

O fechamento de pico do SPY foi de $338.31 em 2020-02-19. O fechamento de fundo, $222.51 em 2020-03-23, está -34.2% abaixo do pico — um bear market comprimido em 23 sessões de negociação, 33 dias corridos. A afirmação de que foi o "drawdown de trinta por cento mais rápido da história" é confirmada na mesma linha: o fechamento do SPY rompeu 30% abaixo do pico em apenas 22 sessões. O bear market de 2008, medido da mesma forma a partir do seu pico de fechamento em outubro de 2007, precisou de 250 sessões para perder os mesmos 30%. O que levou aproximadamente um ano em 2008 levou cerca de um mês em 2020.

O cronograma do crash, com todos os números extraídos dos painéis desta página:

  • 19 de fevereiro de 2020 — fechamento recorde do SPY, $338.31.
  • 9 de março — o primeiro circuit breaker em todo o mercado desde 1997; SPY fecha -7.7% em queda. Detalhado minuto a minuto abaixo.
  • 12, 16 e 18 de março — mais três interrupções de Level-1. O dia 16 fecha -11.6%, a pior sessão única do crash.
  • 23 de março — a mínima de fechamento: $222.51, -34.2% em relação ao pico.
  • 24 de março — a reversão. O rali de estímulo de 24 de março registra esse movimento.
  • 2020-08-18 — SPY fecha acima do pico de fevereiro novamente, 103 sessões após a mínima.

9 de março de 2020: a sessão que acionou o interruptor

Os circuit breakers do mercado são baseados no S&P 500, portanto, este painel analisa a interrupção através do SPY — o ETF do S&P 500 — em vez de qualquer outro proxy. No fim de semana anterior, o repricing da pandemia colidiu com um choque de oferta de petróleo (mais detalhes abaixo), e o mercado nunca abriu de forma ordenada.

QuerySPY em 9 de março de 2020 — a sessão do circuit-breaker, detalhada
O SQL exato por trás de cada número
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')

Dois números iniciais. Primeiro, o gap: o SPY abriu a $275.3, -7.4% abaixo do fechamento de sexta-feira de $297.42 — e, nos primeiros minutos, a queda do S&P 500 atingiu o limite de 7% do Level-1. Segundo, e melhor: 376 barras de minutos de sessão regular em vez das 390 habituais. O tape para após as 9:34 am: a partir de 09:35 ET, 14 minutos consecutivos não registram barras. Nada foi negociado em lugar nenhum. O gap nos dados é o circuit breaker. A sessão fechou a $274.4, uma queda de -7.7%, com 304.6 milhões de ações.

O formato de uma sessão interrompida

QuerySPY a cada meia hora — sessão regular de 9 de março de 2020
O SQL exato por trás de cada número
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

O primeiro intervalo de preços contém a queda, a interrupção e a retomada simultaneamente: sua mínima de $273.5 está a poucos centavos da mínima do dia de $273.45 — a cotação da tarde às 14:44 ET apenas testou o nível da manhã. Após a reabertura, o volume de negociação quase não se moveu: cada fechamento de meia hora ficou a poucos dólares do preço de reabertura, e o prejuízo do dia ocorreu nos primeiros minutos. O volume confirmou esse cenário de forma inversa — a última meia hora, com 46.7 milhões de ações, foi o maior volume do dia devido ao fluxo de fechamento. Os circuit breakers são projetados para produzir exatamente este formato: interromper a queda livre, forçar um leilão de reabertura e permitir que o trading contínuo retome no nível de preço ajustado. O relógio do mercado agora possui esse mecanismo permanentemente integrado.

Quatro interrupções em oito sessões

O dia 9 de março foi apenas a primeira.

QueryAs quatro sessões de circuit-breaker de março de 2020 — fechamento, variação e volume do SPY
O SQL exato por trás de cada número
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

Os breakers de Level-1 também foram acionados em 12 de março (fechamento em -9.6%), 16 de março (fechamento em -11.6% a $239.41 — a maior queda percentual diária do S&P desde 1987) e 18 de março (interrupção intraday, fechamento em -5.2%). Foram quatro interrupções em todo o mercado em oito dias de negociação, após vinte e três anos sem nenhuma. Observe o que não ocorreu: todas as interrupções foram de Level 1, o patamar de 7%. Os patamares de 13% e 20% nunca foram atingidos — mesmo em 16 de março, a cascata desacelerou após a interrupção e a sessão terminou dentro da linha de 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.

QueryMovimentos de 9 de março e do crash completo — cruise, airline, energy, bank, tech, staples vs SPY
O SQL exato por trás de cada número
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.

A guerra de preços do petróleo, em resumo

O conflito no setor de energia merece uma explicação breve, já que o termo "guerra de preços do petróleo" explica a outra metade da notícia de 9 de março. As negociações de produção da OPEC+ entre Arábia Saudita e Rússia terminaram sem acordo na sexta-feira, 6 de março de 2020. Durante o fim de semana, a Arábia Saudita reduziu seus preços oficiais de venda e anunciou planos para aumentar a produção em um cenário onde a demanda por viagens já estava em colapso — um choque de oferta somado a um choque de demanda. A abertura do mercado de ações na segunda-feira refletiu ambos os fatores, conforme os dados acima: a ExxonMobil caiu -12.2% naquela segunda-feira, contra a queda de -7.7% do SPY.

A busca por segurança — e a semana em que o padrão se inverteu

As ações representaram apenas metade da história. A outra metade foi o mercado de Treasuries, onde a clássica busca por segurança atingiu um recorde — e então, por uma semana extraordinária, seguiu o caminho inverso.

QueryYields de 10 anos e 3 meses do Treasury durante o crash, fechamentos diários
O SQL exato por trás de cada número
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

O rendimento de 10 anos estava em 1.56% no pico das ações de 19 de fevereiro. Em 9 de março — a sessão de interrupção — fechou em 0.54%, uma mínima histórica, com compradores aceitando meio por cento ao ano por uma década em troca de segurança. Então o padrão se inverteu: até 18 de março, o rendimento de 10 anos subiu para 1.18% enquanto as ações continuavam caindo — a "corrida pelo caixa", uma semana em que fundos, empresas e detentores estrangeiros venderam qualquer ativo líquido, incluindo Treasuries, para levantar dólares. Enquanto isso, o título de 3 meses fechou o dia em 0.02% — equivalentes de caixa travados no zero. Quando o ativo mais seguro e o mais arriscado caem juntos, o que está sendo comprado é a própria liquidez. A curva de juros registra este episódio permanentemente em sua história.

O que o fluxo de opções mostra

As opções listadas do SPY — o principal mecanismo de hedge do mercado — registraram o pânico, e o momento desse movimento é o ponto relevante.

QueryOpções de SPY: volume de puts vs calls, 2–13 de março de 2020 (milhões de contratos)
O SQL exato por trás de cada número
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

A proporção entre volume de puts e calls atingiu o pico de 1.95 — quase duas puts para cada call — na sexta-feira, 6 de março, antes da sessão de interrupção. No próprio dia 9 de março, foram negociadas 4.35 milhões de puts contra 2.38 milhões de calls, uma proporção de 1.83. Em 12 de março — uma sessão de -9.6% — a proporção caiu para 1.32, conforme o volume de calls aumentou junto com o de puts. O maior desvio de puts ocorreu no início da queda, não no fundo: a proteção foi comprada cedo, e os dias de queda subsequentes e mais intensos apresentaram um fluxo de opções mais equilibrado.

Como funciona um halt de mercado generalizado

A mecânica, já que ocorre raramente o suficiente para ser esquecida entre os usos: os breakers de mercado são acionados pela queda do S&P 500 em relação ao fechamento anterior — 7% (Nível 1) e 13% (Nível 2) disparam um halt de 15 minutos se atingidos antes das 15:25 ET; 20% (Nível 3) encerra a sessão definitivamente. Durante o halt, nada é negociado em nenhuma exchange; as ordens ficam em fila para um leilão de reabertura, que concentra o interesse acumulado em um único preço, da mesma forma que o leilão de abertura faz todas as manhãs. Esse design surgiu após o flash crash de 2010, que mostrou que os limites antigos eram muito altos para serem acionados mesmo em uma cascata real.

Março de 2020 foi o primeiro — e até agora o único — teste real desse design, e o veredito está nos painéis acima: quatro halts de Nível 1, cada um seguido por uma reabertura ordenada, sem que o Nível 2 ou o Nível 3 fossem atingidos, e um mercado funcionando em cada uma das 23 sessões do drawdown mais rápido da história do índice. As regras foram mantidas depois disso: os mesmos limites de 7/13/20, referenciados ao S&P 500, continuam em vigor hoje. O sistema flexionou; a infraestrutura resistiu.

FAQ sobre o crash da COVID

O que acionou o circuit breaker em 9 de março de 2020?

A queda de 7% do S&P 500 em relação ao fechamento anterior — o limite de Nível 1 para todo o mercado — nos primeiros minutos de negociação. As negociações foram interrompidas por 15 minutos em todo o mercado e depois reabertas via leilão. A interrupção é visível no tape de minutos desta página como 14 barras consecutivas ausentes a partir de 09:35 ET.

Quanto o mercado de ações caiu no crash da COVID?

Medido pelos fechamentos diários do SPY, -34.2% — de $338.31 em 19 de fevereiro de 2020 para $222.51 em 23 de março de 2020, ao longo de 23 sessões de negociação.

Quantos circuit breakers foram acionados em março de 2020?

Quatro interrupções de Nível 1 em todo o mercado: 9, 12, 16 e 18 de março. Foram as primeiras desde outubro de 1997.

Os circuit breakers de Nível 2 ou Nível 3 foram acionados em 2020?

Não. Todas as quatro interrupções de 2020 foram de Nível 1 (7%). Nenhum halt de Nível 2 (13%) ou Nível 3 (20%) em todo o mercado foi acionado sob o design atual — nem mesmo em 16 de março, a pior sessão do crash com -11.6%.

O mercado se recuperou totalmente do crash da COVID?

Sim. O SPY fechou acima de seu pico de 19 de fevereiro de 2020 em 2020-08-18103 sessões de negociação após a mínima de 23 de março, uma das recuperações totais mais rápidas de um bear market com esta profundidade.


Cada painel acima é uma query versionada e armazenada sobre o tape histórico — expanda o SQL para ver cada medição. Quer vivenciar este dia em vez de apenas ler? É um dos cenários jogáveis no simulador de trading da Strasmore Labs.

#market history#covid crash#circuit breakers#spy