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

O que aconteceu no crash de 24 de março de 2020

Análise detalhada do movimento de busca por caixa, o impacto do pacote do Fed e a amplitude setorial durante a reversão do mercado de ações.

Em 23 de março de 2020, o Federal Reserve anunciou compras de ativos de prazo aberto — QE sem um limite estabelecido — além de uma medida inédita: facilidades para a compra de títulos corporativos. O dia 24 de março de 2020 foi a resposta do mercado: o rali de estímulo ao COVID, um dos maiores ganhos diários de ações nos EUA da história e — visível apenas em retrospecto — o segundo dia de um novo bull market. O fundo do mercado havia se consolidado na tarde antes do anúncio.

A queda antes da reversão

A queda em si possui uma página própria; aqui está o registro que a sustenta — cada sessão desde a máxima histórica até o fundo, com o rendimento do Treasury de 10 anos em pontos de base:

QueryFechamento diário do SPY, drawdown e o yield de 10 anos — 19 de fev a 23 de mar de 2020
O SQL exato por trás de cada número
WITH daily AS (
    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
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2020-02-19 00:00:00') AND window_start < toDateTime('2020-03-24 04:00:00')
    GROUP BY et_date
    HAVING et_date >= toDate('2020-02-19') AND et_date <= toDate('2020-03-23') AND close_usd > 0
)
SELECT
    toString(d.et_date) AS session,
    d.close_usd,
    round((d.close_usd / (SELECT max(close_usd) FROM daily) - 1) * 100, 1) AS drawdown_pct,
    round(t.yield_10_year * 100) AS y10_bps
FROM daily AS d
LEFT JOIN global_markets.treasury_yields AS t ON t.date = d.et_date
ORDER BY d.et_date

Do fechamento na máxima histórica de $338.31 em 2020-02-19, o SPY caiu para $222.51 até 2020-03-23 — um drawdown de -34.2%, com cada sessão do declínio detalhada nas linhas 24 do painel.

A coluna de rendimento é o indicador principal. Durante 2020-03-09, o rendimento de 10 anos desabou de 156 pontos de base para o então recorde de 54 — a clássica fuga para a segurança, com o dinheiro saindo de ações para títulos. Depois, o padrão se quebrou: até 2020-03-18, o rendimento havia mais que dobrado para 118 pontos de base, enquanto o drawdown do SPY se aprofundou de -18.9% para -28.8%. A queda simultânea de ações e Treasuries é a marca de vendas forçadas — investidores buscando caixa ao vender qualquer ativo que ainda tenha demanda. Em meados de março, a crise era sobre a estrutura do crédito, não sobre o preço das ações.

O que o Fed realmente anunciou — e o que não funcionou

Os cortes de juros já haviam sido tentados. A sequência cronológica, conforme visível no painel acima:

  • 2020-03-03 — um corte de emergência de meio ponto, o primeiro corte entre reuniões desde 2008. O SPY fechou a $300.34, -11.2% abaixo da máxima, e a queda continuou.
  • 15 de março, um domingo — juros reduzidos a zero somados a um programa de compra de ativos de $700 bilhões. Na sessão seguinte, 2020-03-16 fechou -29.2% abaixo da máxima de fevereiro — uma das piores sessões individuais de todo o crash.
  • 23 de março, 8:00 am ET — o Fed removeu o teto: as compras de Treasuries e de títulos lastreados em hipotecas continuariam "nas quantidades necessárias", sem prazo definido. Foram incluídos o PMCCF e o SMCCF — as primeiras facilidades de compra de títulos corporativos do Fed — e um TALF reativado para dar suporte ao crédito ao consumidor. O SPY ainda fechou na mínima do mercado de baixa naquela tarde.
  • 24 de março — a sessão abaixo. Durante a noite, o Congresso se uniu em torno do CARES Act de aproximadamente $2 trilhões; o projeto foi assinado em 27 de março, dentro do surto de três dias registrado adiante.

Duas diferenças de design separaram o pacote de 23 de março das tentativas anteriores. Um programa de tamanho fixo tem uma data de término que um mercado estressado consegue prever; "nas quantidades necessárias" não tem. Além disso, as facilidades corporativas colocaram um comprador público diretamente dentro dos mercados de crédito onde o fluxo de liquidez havia travado. Se essas diferenças foram o que importou é uma questão de interpretação; o histórico registra a sequência — duas escaladas, queda contínua, um terceiro design e, então, a reversão.

O dia, em uma linha

QuerySPY em 24 de março de 2020 — a virada, registrada
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-23 00:00:00') AND window_start < toDateTime('2020-03-24 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(maxIf(toFloat64(high), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS rth_high,
    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('2020-03-24 04:00:00') AND window_start < toDateTime('2020-03-24 23:59:00')

A partir do fechamento de 23 de março de $222.51 — o último fechamento do bear market — o SPY abriu com um gap de +5.4% a $234.42, atingiu sua mínima da sessão de $233.8 nos minutos iniciais (09:31 ET) e nunca mais retornou a esse nível: o fechamento em $243.59 representou uma alta de +9.5% no dia. Um rali cujo ponto baixo no primeiro minuto é o espelho de um crash que fecha em sua mínima. Uma única linha, contudo, suaviza o percurso — o histórico de meia hora abaixo mostra a desvalorização que a sessão precisou absorver.

O formato da sessão

QuerySPY por meia hora — sessão regular de 24 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-24 04:00:00') AND window_start < toDateTime('2020-03-24 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 painel é claro: a trajetória mudou de direção. A mínima de $233.8 ocorreu no primeiro minuto e nunca foi testada novamente — a tendência unidirecional foi real. Porém, após atingir $242.24 no lote do meio-dia, o preço recuou por duas horas — o lote das 13:30 fechou a $237.25, e o lote das 14:00 registrou a mínima da tarde, $235.05 — o período em que o dia poderia ter sido apenas mais uma tentativa de repique sem sucesso. Em vez disso, a correção manteve-se bem acima da mínima da abertura, e a última meia hora entregou o fechamento mais alto da sessão, $243.59, com 34.7 milhões de ações — o maior volume do dia de 232.4 milhões, superando até mesmo os 27.3 milhões da abertura. Uma queda no meio do dia que encontrou compradores, seguida por um fechamento nas máximas com volume de pico.

Broad rally, or narrow?

An index can be dragged higher by a handful of mega-caps. That is not what this was. Twelve funds — the three major index trackers plus nine S&P sector funds — on the same two closes:

Query24 de março de 2020 entre o índice e ETFs de setores — tudo em alta, cíclicos primeiro
O SQL exato por trás de cada número
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 959 AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2020-03-23')), 2) AS mar23_close,
    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 AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2020-03-24')), 2) AS mar24_close,
    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 AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2020-03-24')) / argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959 AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2020-03-23')) - 1) * 100, 1) AS change_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'DIA', 'QQQ', 'IWM', 'XLE', 'XLI', 'XLF', 'XLK', 'XLY', 'XLV', 'XLU', 'XLP')
  AND window_start >= toDateTime('2020-03-23 00:00:00') AND window_start < toDateTime('2020-03-25 00:00:00')
GROUP BY ticker
ORDER BY change_pct DESC

All 12 closed higher. Energy (XLE) led at +16.4%, with industrials (XLI, +12.8%) and financials (XLF, +12.7%) right behind — the most economically-sensitive corners of the market, the ones a shutdown threatens first. The Dow tracker DIA gained 11.3% — the move behind that week's "best day since 1933" headlines, a superlative that belongs to the Dow's longer price history. The smallest gains sat in the classic defensives, consumer staples (XLP, +5.1%) and healthcare (XLV, +7.4%), and the Nasdaq-100's QQQ (+7.7%) trailed SPY's +9.5%. A cyclicals-led, everything-green tape is the opposite shape of a narrow mega-cap squeeze — breadth was the day's signature.

O quão histórico foi, de fato?

"O maior dia desde 1933" é uma estatística do Dow extraída dos jornais daquela semana. Aqui está o que nossa própria série de dados pode verificar, limitada ao que ela realmente cobre:

Query24 de março de 2020 comparado a todas as sessões do SPY no tape de minuto
O SQL exato por trás de cada número
SELECT
    countIf(isFinite(day_pct)) AS sessions_measured,
    toString(min(et_date)) AS first_session,
    round(mar24_d, 1) AS mar24_gain_pct,
    countIf(isFinite(day_pct) AND day_pct > mar24_d) AS bigger_days,
    countIf(isFinite(day_pct) AND day_pct > mar24_d) + 1 AS mar24_rank,
    arrayStringConcat(arraySort(groupArrayIf(toString(et_date), isFinite(day_pct) AND day_pct > mar24_d)), ', ') AS bigger_day_dates,
    round(mar26_b, 1) AS burst3_gain_pct,
    countIf(isFinite(burst3_pct) AND burst3_pct > mar26_b) AS bigger_bursts,
    round(mar24_r30, 2) AS vol_vs_30d,
    round(mar24_r250, 2) AS vol_vs_250d,
    round(mar24_shares / 1e6, 0) AS mar24_shares_m
FROM (
    SELECT
        et_date, day_pct, burst3_pct,
        max(if(et_date = toDate('2020-03-24'), day_pct, -999)) OVER () AS mar24_d,
        max(if(et_date = toDate('2020-03-26'), burst3_pct, -999)) OVER () AS mar26_b,
        max(if(et_date = toDate('2020-03-24'), shares / vol_avg_30, -999)) OVER () AS mar24_r30,
        max(if(et_date = toDate('2020-03-24'), shares / vol_avg_250, -999)) OVER () AS mar24_r250,
        max(if(et_date = toDate('2020-03-24'), shares, -999)) OVER () AS mar24_shares
    FROM (
        SELECT
            et_date,
            (close_usd / lagInFrame(close_usd, 1) OVER (ORDER BY et_date ASC ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) - 1) * 100 AS day_pct,
            (close_usd / lagInFrame(close_usd, 3) OVER (ORDER BY et_date ASC ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) - 1) * 100 AS burst3_pct,
            shares,
            avg(shares) OVER (ORDER BY et_date ASC ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING) AS vol_avg_30,
            avg(shares) OVER (ORDER BY et_date ASC ROWS BETWEEN 250 PRECEDING AND 1 PRECEDING) AS vol_avg_250
        FROM (
            SELECT
                toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
                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 close_usd,
                toFloat64(sum(volume)) AS shares
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'SPY' AND window_start < toDateTime('2026-01-01 00:00:00')
            GROUP BY et_date
            HAVING close_usd > 0
        )
    )
)
GROUP BY mar24_d, mar26_b, mar24_r30, mar24_r250, mar24_shares

Desde 2003-09-10 — a primeira sessão de nossos dados de minuto — o SPY registrou 5613 retornos diários de fechamento a fechamento. O dia 24 de março de 2020, com +9.5%, ocupa a posição #3: exatamente 2 sessões o superaram (2008-10-13, 2008-10-28), ambas dentro do pânico de outubro de 2008. A sequência de três dias é ainda mais rara: a alta de +17.5% do fechamento de 23 de março ao fechamento de 26 de março possui 0 ganhos de três sessões maiores em toda a amostra. Dentro de tudo o que este banco de dados pode verificar, nada se compara a esse salto.

O volume conta uma história mais discreta: 232 milhões de ações do SPY representaram 2.86× a média do último ano — e apenas 1.12× a média das 30 sessões anteriores. Comparado a qualquer período normal da história, a atividade foi extraordinária; comparada às semanas de crash que a antecederam, foi apenas mais um dia dentro da tempestade. Eventos históricos não se anunciam com volumes históricos.

O rali de três dias

QueryFechamento do SPY, 23-26 de março de 2020 — o rali de três dias
O SQL exato por trás de cada número
SELECT
    toString(et_date) AS session,
    close_usd,
    round(if(prev_close = 0, NULL, (close_usd / prev_close - 1) * 100), 1) AS change_pct,
    shares_m
FROM (
    SELECT et_date, close_usd, shares_m,
           lagInFrame(close_usd) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_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,
            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-20 00:00:00') AND window_start < toDateTime('2020-03-26 23:59:00')
        GROUP BY et_date
    )
)
WHERE et_date >= toDate('2020-03-23') AND et_date <= toDate('2020-03-26')
ORDER BY et_date

A reversão foi imediata: +9.5% no dia 24, +1.3% no dia 25, +5.9% no dia 26 — uma sequência de três sessões que anulou semanas de queda, sem nenhum movimento maior em toda a amostra acima. O padrão de março de 2020 é semelhante ao de março de 2009: em ambos, a resposta decisiva da política monetária ocorreu próximo ao fundo, a primeira perna de alta foi violenta, e o dia de oportunidade máxima parecia — naquela manhã — um repique comum de bear market.

O rali se sustentou?

Em tempo real, o consenso era de um "repique de bear-market", e os céticos tinham seus próprios argumentos: onze dias antes, o mercado já havia registrado um rali de tamanho quase similar — de $248.1 em 2020-03-12 para $270.93 em 2020-03-13 — e a sessão seguinte fechou em $239.41, o pior dia de todo o crash. Um único dia de alta não provou nada. O que diferencia o dia 24 de março é o que veio depois:

QuerySegurou? O reteste que não veio e dois relógios de recuperação
O SQL exato por trás de cada número
SELECT
    round(ath_close, 2) AS feb19_ath_close,
    round(bottom_close, 2) AS mar23_bottom_close,
    toString(rec_date) AS recovery_date,
    countIf(et_date > toDate('2020-03-23') AND et_date <= rec_date) AS sessions_to_new_high,
    dateDiff('day', toDate('2020-03-23'), rec_date) AS days_low_to_new_high,
    dateDiff('day', toDate('2020-02-19'), rec_date) AS round_trip_days,
    round(minIf(close_usd, et_date > toDate('2020-03-23') AND et_date <= rec_date), 2) AS lowest_close_after,
    toString(argMinIf(et_date, (close_usd, et_date), et_date > toDate('2020-03-23') AND et_date <= rec_date)) AS lowest_close_date,
    round((minIf(close_usd, et_date > toDate('2020-03-23') AND et_date <= rec_date) / bottom_close - 1) * 100, 1) AS closest_retest_pct,
    toString(peak07_date) AS peak_2007_date,
    toString(rec07_date) AS recovery_2013_date,
    dateDiff('day', peak07_date, rec07_date) AS round_trip_2008_days
FROM (
    SELECT
        et_date, close_usd, ath_close, bottom_close, peak07_date,
        min(if(et_date > toDate('2020-03-23') AND close_usd >= ath_close, et_date, toDate('2099-01-01'))) OVER () AS rec_date,
        min(if(et_date >= toDate('2008-01-01') AND close_usd >= peak07_close, et_date, toDate('2099-01-01'))) OVER () AS rec07_date
    FROM (
        SELECT
            et_date, close_usd,
            max(if(et_date = toDate('2020-02-19'), close_usd, -999)) OVER () AS ath_close,
            max(if(et_date = toDate('2020-03-23'), close_usd, -999)) OVER () AS bottom_close,
            max(if(et_date >= toDate('2007-01-01') AND et_date < toDate('2008-01-01'), (close_usd, et_date), (-999., toDate('1970-01-01')))) OVER () .1 AS peak07_close,
            max(if(et_date >= toDate('2007-01-01') AND et_date < toDate('2008-01-01'), (close_usd, et_date), (-999., toDate('1970-01-01')))) OVER () .2 AS peak07_date
        FROM (
            SELECT
                toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
                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 close_usd
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'SPY' AND window_start < toDateTime('2021-01-01 00:00:00')
            GROUP BY et_date
            HAVING close_usd > 0
        )
    )
)
GROUP BY ath_close, bottom_close, rec_date, peak07_date, rec07_date

O reteste nunca aconteceu. Após 23 de março, o fechamento mais baixo já registrado pelo SPY foi de $243.59 — em 2020-03-24, o próprio dia do rali de estímulo. O mercado nunca mais fechou dentro de 9.5% do fundo. A máxima pré-COVID de $338.31 foi recuperada em 2020-08-18103 sessões de negociação após a mínima, um ciclo de ida e volta de 181 dias do topo histórico de volta ao topo histórico. A comparação com 2008, calculada da mesma forma: o pico de 2007-10-09 do SPY não viu uma nova máxima de fechamento até 2013-03-14, 1983 dias depois. Duas crises, duas velocidades, um mercado que mudou seu metabolismo entre elas.

O que este dia ensina

Três lições para internalizar. Primeiro, o gap foi o fator determinante: grande parte do ganho do dia ocorreu antes da abertura — quem esperou para entrar no horário regular pagou caro o dia todo — a mecânica do overnight gap em amplitude máxima. Segundo, o fundo veio antes da confirmação: o fechamento de 23 de março foi a mínima, visível apenas após sessões como esta não retornarem a esse nível. Terceiro, a velocidade atua nos dois sentidos: a mesma estrutura de mercado que comprimiu um drawdown de -34.2% nas linhas 24 acima comprimiu a recuperação inicial em três sessões. A velocidade é uma característica da estrutura do mercado atual, não de notícias boas ou ruins.

Os céticos daquela semana não eram tolos: a amplitude, o estouro, o reteste que nunca ocorreu — cada evidência que separa o dia 24 de março dos ralis fracassados só é mensurável em retrospecto. A diferença entre um rali de bear-market e um novo bull market é invisível no primeiro dia e inequívoca em poucos meses.

FAQ sobre o rali do COVID

O que aconteceu em 24 de março de 2020?

A primeira sessão completa após o anúncio de QE ilimitado do Fed: o SPY abriu com gap de +5.4% e fechou +9.5% — o #3 maior ganho em um único dia nas 5613 sessões cobertas pelo nosso tape de minutos, perdendo apenas para dois dias em outubro de 2008.

O que o Fed anunciou em 23 de março de 2020?

Compras ilimitadas de títulos do Tesouro e de títulos lastreados em hipotecas — "nas quantidades necessárias" — além do PMCCF e SMCCF, suas primeiras facilidades para compra de bonds corporativos, e a reativação do TALF para crédito ao consumidor. O comunicado foi divulgado às 8:00 am ET, antes da abertura; o SPY ainda fechou aquele dia em seu fundo de bear-market.

O dia 23 de março de 2020 foi o fundo do crash do COVID?

Sim, pelo preço de fechamento: o fechamento mínimo do SPY de $222.51 registrado em 23 de março, horas após o anúncio do Fed. Esse nível nunca foi testado novamente — o fechamento mais baixo após essa data ocorreu em 2020-03-24, 9.5% acima do fundo.

Quando o mercado de ações recuperou sua máxima pré-COVID?

O SPY fechou acima de sua máxima histórica de 19 de fevereiro de 2020 pela primeira vez em 2020-08-18, 103 sessões de negociação após o fundo — um round trip de 181 dias, contra 1983 dias para o movimento equivalente do crash de 2008.

Seria possível ter comprado após a notícia e ainda ter tido bons resultados?

A abertura teve um gap de +5.4% antes do início do pregão regular, e o dia continuou subindo — cada entrada posterior custou mais do que o fechamento anterior, e ainda assim ficou muito abaixo do patamar do mercado na recuperação de agosto de 2020.

Notas de dados
  • Os fechamentos são os últimos registros da sessão regular (9:30 am-4:00 pm ET) do tape de minutos; podem diferir dos fechamentos oficiais de leilão por alguns centavos.
  • As datas de recuperação referem-se apenas ao preço; uma medida de retorno total (dividendos reinvestidos) recupera-se mais cedo por definição.
  • O yield de 10 anos segue a série diária do Tesouro nas datas de negociação; basis points são centésimos de um ponto percentual.
  • A amostra do painel de ranking começa em 2003-09-10 — "desde 2003" nesta página refere-se a esse período, não a todo o histórico de mercado registrado.

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 rally#bull markets#federal reserve#spy