Strasmore Research
Phân tích chuyên sâu Matt ConnorBởi Matt Connor · Cập nhật 2026-07-23

Thị trường chứng khoán ngày 24 tháng 3 năm 2020

Xem lại diễn biến thị trường ngày 24 tháng 3 năm 2020: từ cú sụt giảm mạnh đến làn sóng tháo chạy tìm tiền mặt và phản ứng từ các gói kích thích của Fed.

Vào ngày 23 tháng 3 năm 2020, Cục Dự trữ Liên bang (Fed) đã công bố chương mua tài sản không giới hạn — một hình thức QE không đặt ra hạn mức cụ thể — cùng với một động thái chưa từng có tiền lệ: các cơ chế để mua trái phiếu doanh nghiệp. Ngày 24 tháng 3 năm 2020 là phản ứng của thị trường: đợt tăng trưởng nhờ các gói kích thích COVID, một trong những mức tăng trưởng cổ phiếu Mỹ lớn nhất trong một ngày được ghi nhận, và — khi nhìn lại mới thấy rõ — là ngày thứ hai của một thị trường bò tót mới. Điểm đáy thực tế đã được xác lập vào buổi chiều trước khi thông báo được đưa ra.

Cú sụt giảm trước bước ngoặt

Bản thân cú sụt giảm có một trang riêng; còn đây là dữ liệu cơ sở cho nội dung này — mọi phiên giao dịch từ mức đỉnh lịch sử đến đáy, cùng với lợi suất trái phiếu Kho bạc 10 năm tính theo điểm cơ bản:

Truy vấnGiá đóng cửa SPY hàng ngày, drawdown và lợi suất 10 năm — 19/02 đến 23/03/2020
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Từ mức đóng cửa đỉnh lịch sử là $338.31 vào ngày 2020-02-19, SPY đã giảm xuống $222.51 vào ngày 2020-03-23 — mức sụt giảm -34.2%, với mọi phiên trong đợt giảm điểm đều nằm trong các hàng 24 của bảng.

Cột lợi suất là dấu hiệu nhận biết. Trong suốt 2020-03-09, lợi suất 10 năm đã giảm mạnh từ 156 điểm cơ bản xuống mức kỷ lục tại thời điểm đó là 54 — hiện tượng "trú ẩn an toàn" điển hình, khi dòng tiền rời khỏi cổ phiếu để chuyển sang trái phiếu. Sau đó, mô hình này đã bị phá vỡ: đến 2020-03-18, lợi suất đã tăng hơn gấp đôi lên mức 118 điểm cơ bản trong khi mức sụt giảm của SPY sâu thêm từ -18.9% xuống -28.8%. Việc cổ phiếu và trái phiếu Kho bạc cùng giảm là dấu hiệu của việc bán tháo cưỡng bức — những người nắm giữ đang huy động tiền mặt bằng cách bán bất cứ thứ gì còn có người mua. Đến giữa tháng Ba, cuộc khủng hoảng đã nằm ở hệ thống vận hành của tín dụng, chứ không còn là về giá cổ phiếu.

Những gì Fed thực sự đã công bố — và những gì đã không hiệu quả

Các đợt cắt giảm lãi suất đã được thực hiện trước đó. Trình tự thời gian được liệt kê trong bảng trên:

  • 2020-03-03 — một đợt cắt giảm lãi suất khẩn cấp nửa điểm phần trăm, đợt cắt giảm giữa các kỳ họp đầu tiên kể từ năm 2008. SPY đóng cửa ở mức $300.34, thấp hơn -11.2% so với mức cao nhất, và đà giảm vẫn tiếp tục.
  • Ngày 15 tháng 3, Chủ Nhật — lãi suất giảm về mức 0 cùng với chương trình mua tài sản trị giá 700 tỷ USD. Phiên tiếp theo, 2020-03-16, đóng cửa thấp hơn -29.2% so với mức cao nhất của tháng Hai — một trong những phiên tồi tệ nhất trong toàn bộ cuộc khủng hoảng.
  • Ngày 23 tháng 3, 8:00 sáng ET — Fed đã gỡ bỏ mức trần: việc mua trái phiếu Kho bạc và chứng khoán thế chấp sẽ tiếp tục "với số lượng cần thiết", không giới hạn. Đi kèm là PMCCF và SMCCF — các cơ chế mua trái phiếu doanh nghiệp đầu tiên của Fed — và một chương trình TALF được tái khởi động để hỗ trợ tín dụng tiêu dùng. SPY vẫn đóng cửa ở mức thấp nhất của thị trường gấu vào chiều hôm đó.
  • Ngày 24 tháng 3 — phiên giao dịch dưới đây. Qua đêm, Quốc hội đã thống nhất về Đạo luật CARES trị giá khoảng 2 nghìn tỷ USD; đạo luật này được ký vào ngày 27 tháng 3, trong đợt bùng nổ ba ngày được ghi nhận chi tiết hơn ở phần dưới.

Có hai điểm khác biệt về thiết kế giữa gói cứu trợ ngày 23 tháng 3 so với các nỗ lực trước đó. Một chương trình có quy mô cố định sẽ có ngày kết thúc mà thị trường đang căng thẳng có thể dự đoán được; còn cụm từ "với số lượng cần thiết" thì không. Và các cơ chế dành cho doanh nghiệp đã đặt một bên mua công khai trực tiếp vào các thị trường tín dụng nơi hệ thống vận hành đang bị tắc nghẽn. Việc những khác biệt đó có quan trọng hay không là một nhận định chủ quan; dữ liệu ghi lại trình tự này — hai đợt leo thang, sự sụt giảm kéo dài, một thiết kế thứ ba, và sau đó là sự xoay chuyển.

Diễn biến trong ngày

Truy vấnSPY ngày 24/03/2020 — bước ngoặt, đã ghi nhận
Câu lệnh SQL chính xác đằng sau mỗi con số
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')

Từ mức đóng cửa ngày 23 tháng 3 là $222.51 — mức đóng cửa cuối cùng của thị trường gấu — SPY đã nhảy gap +5.4% để mở cửa tại $234.42, chạm mức thấp nhất phiên là $233.8 trong những phút đầu mở cửa (09:31 ET), và không quay lại mức đó nữa: mức đóng cửa tại $243.59 tăng +9.5% trong ngày. Một đợt tăng giá mà mức thấp nhất xuất hiện ngay trong phút đầu tiên, trái ngược hoàn toàn với một đợt sụt giảm kết thúc ở mức thấp nhất. Tuy nhiên, biểu đồ một hàng cho thấy xu hướng đi ngang — dữ liệu nửa giờ dưới đây cho thấy đà giảm mà phiên giao dịch đã phải hấp thụ.

Diễn biến phiên giao dịch

Truy vấnSPY theo nửa giờ — phiên giao dịch bình thường ngày 24/03/2020
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Dữ liệu cho thấy xu hướng biến động không đi theo một đường thẳng. Mức thấp nhất $233.8 xuất hiện ngay trong phút mở cửa và không bao giờ bị phá vỡ — điều này cho thấy xu hướng một chiều là có thật. Tuy nhiên, sau khi đạt mức $242.24 vào khung giờ giữa trưa, đà tăng đã chững lại trong hai giờ tiếp theo. Khung giờ 13:30 đóng cửa tại $237.25, và khung giờ 14:00 ghi nhận mức thấp nhất trong phiên là $235.05 — giai đoạn mà thị trường có thể đã trở thành một đợt hồi phục thất bại khác. Thay vào đó, đà giảm đã dừng lại ở mức cao hơn nhiều so với mức thấp mở cửa. Trong nửa giờ cuối cùng, giá đóng cửa đạt mức cao nhất phiên là $243.59 với khối lượng 34.7 triệu cổ phiếu — đây là khối lượng giao dịch lớn nhất trong tổng số 232.4 triệu cổ phiếu của cả ngày, cao hơn cả mức 27.3 triệu cổ phiếu lúc mở cửa. Thị trường đã giảm nhẹ vào giữa ngày, tìm thấy lực mua, sau đó đóng cửa ở mức cao nhất với khối lượng giao dịch đạt đỉnh.

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:

Truy vấnNgày 24/03/2020 trên các index và sector ETF — mọi thứ đều tăng, nhóm cyclicals dẫn đầu
Câu lệnh SQL chính xác đằng sau mỗi con số
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.

Sự kiện này thực sự mang tính lịch sử đến mức nào?

"Ngày biến động lớn nhất kể từ năm 1933" là một thống kê của Dow từ các tờ báo trong tuần đó. Dưới đây là những gì dữ liệu của chúng tôi có thể xác nhận, dựa trên phạm vi dữ liệu thực tế:

Truy vấnNgày 24/03/2020 so với mọi phiên SPY trên minute tape
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Kể từ 2003-09-10 — phiên giao dịch đầu tiên trong dữ liệu phút của chúng tôi — SPY đã ghi nhận 5613 mức lợi nhuận hàng ngày tính theo giá đóng cửa. Ngày 24 tháng 3 năm 2020 với mức +9.5% xếp hạng thứ #3: chính xác là có 2 phiên vượt qua mức này (2008-10-13, 2008-10-28), cả hai đều nằm trong giai đoạn hoảng loạn tháng 10 năm 2008. Chuỗi biến động ba ngày còn hiếm gặp hơn: đà tăng +17.5% từ mức đóng cửa ngày 23 tháng 3 đến mức đóng cửa ngày 26 tháng 3 có 0 mức tăng ba phiên lớn hơn bất kỳ đâu trong mẫu dữ liệu. Trong tất cả những gì kho dữ liệu này có thể kiểm tra, không có gì tương đương với sự bùng nổ đó.

Khối lượng giao dịch kể một câu chuyện lặng lẽ hơn: 232 triệu cổ phiếu SPY gấp 2.86 lần mức trung bình của một năm trước đó — và chỉ gấp 1.12 lần mức trung bình của 30 phiên trước đó. So với bất kỳ giai đoạn lịch sử bình thường nào, hoạt động này là phi thường; nhưng so với những tuần sụp đổ ngay trước đó, đây chỉ là một ngày bình thường khác trong cơn bão. Những sự kiện mang tính lịch sử không luôn đi kèm với khối lượng giao dịch lịch sử.

Đợt tăng trưởng mạnh trong ba ngày

Truy vấnGiá đóng cửa SPY, 23-26/03/2020 — đợt bùng nổ ba ngày
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Đà tăng diễn ra liên tục: +9.5% vào ngày 24, +1.3% vào ngày 25, +5.9% vào ngày 26 — chuỗi ba phiên này đã xóa bỏ mọi đà sụt giảm của nhiều tuần trước đó, và không có chuỗi tăng nào lớn hơn trong mẫu dữ liệu trên. Mô hình này tương đồng một cách rõ rệt với tháng 3 năm 2009: trong cả hai trường hợp, các phản ứng chính sách quyết liệt đều đến gần mức đáy, nhịp hồi phục đầu tiên diễn ra rất mạnh mẽ, và ngày có cơ hội lớn nhất — vào sáng hôm đó — trông không khác gì một đợt hồi phục thông thường của thị trường gấu.

Đợt tăng giá có duy trì được không?

Trong thời gian thực, quan điểm chung là "sự hồi phục trong thị trường gấu", và những người hoài nghi cũng có lý lẽ riêng: mười một ngày trước đó, thị trường đã có một đợt tăng gần tương đương — từ $248.1 vào ngày 2020-03-12 lên $270.93 vào ngày 2020-03-13 — và phiên ngay sau đó đã đóng cửa ở mức $239.41, ngày tồi tệ nhất của toàn bộ đợt sụt giảm. Một ngày tăng điểm không chứng minh được điều gì. Điểm khác biệt của ngày 24 tháng 3 là những gì xảy ra sau đó:

Truy vấnLiệu có giữ vững? Lần retest không xảy ra, và hai đồng hồ hồi phục
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Thị trường không hề kiểm tra lại (retest) mức đáy. Sau ngày 23 tháng 3, mức đóng cửa thấp nhất mà SPY từng ghi nhận là $243.59 — vào ngày 2020-03-24, chính là ngày diễn ra đợt tăng nhờ gói kích thích. Thị trường không bao giờ đóng cửa trong phạm vi 9.5% so với mức đáy một lần nữa. Mức cao trước COVID là $338.31 đã được khôi phục vào ngày 2020-08-18103 phiên giao dịch sau mức đáy, một chu kỳ tăng giảm (round trip) kéo dài 181 ngày từ mức cao nhất mọi thời đại trở lại mức cao nhất mọi thời đại. So sánh với năm 2008, tính toán theo cùng một cách: đỉnh 2007-10-09 của SPY đã không đạt mức đóng cửa cao mới cho đến ngày 2013-03-14, tức là 1983 ngày sau đó. Hai cuộc khủng hoảng, hai tốc độ, một thị trường đã thay đổi tốc độ chuyển hóa ở giữa hai giai đoạn đó.

Bài học từ ngày hôm nay

Có ba bài học cần ghi nhớ. Thứ nhất, khoảng trống giá (gap) đóng vai trò then chốt: phần lớn mức tăng trong ngày đã hình thành trước giờ mở cửa — bất kỳ ai chờ đợi điểm vào lệnh trong phiên giao dịch bình thường đều phải trả giá cao suốt cả ngày — các cơ chế của overnight gap đã hoạt động ở biên độ tối đa. Thứ hai, đáy giá xuất hiện trước khi có sự xác nhận: mức đóng cửa ngày 23 tháng 3 là mức thấp nhất, điều này chỉ được nhận ra sau khi các phiên giao dịch như thế này không quay lại mức đó nữa. Thứ ba, tốc độ biến động tác động theo cả hai hướng: chính cấu trúc thị trường đã nén mức giảm -34.2% thành các hàng 24 ở trên cũng đã nén đà hồi phục ban đầu chỉ trong ba phiên. Tốc độ là đặc tính của cấu trúc vận hành thị trường thời kỳ này, không phụ thuộc vào tin tốt hay tin xấu.

Những người hoài nghi trong tuần đó không hề sai: độ rộng thị trường, sự bùng nổ, và đợt kiểm tra lại (retest) không bao giờ xảy ra — mọi dấu hiệu phân biệt ngày 24 tháng 3 với các đợt hồi phục thất bại trước đó chỉ có thể được đo lường khi nhìn lại quá khứ. Sự khác biệt giữa một đợt hồi phục trong thị trường gấu (bear-market rally) và một thị trường bò (bull market) mới là không thể thấy được trong ngày đầu tiên, nhưng sẽ trở nên rõ rệt trong vòng vài tháng.

Câu hỏi thường gặp về đợt hồi phục COVID

Chuyện gì đã xảy ra vào ngày 24 tháng 3 năm 2020?

Phiên giao dịch đầy đủ đầu tiên sau thông báo về QE không giới hạn của Fed: SPY đã gap up +5.4% khi mở cửa và đóng cửa ở mức +9.5% — đây là mức tăng trong một ngày lớn thứ #3 trong số 5613 phiên giao dịch mà dữ liệu minute tape của chúng tôi ghi nhận, chỉ đứng sau hai ngày vào tháng 10 năm 2008.

Fed đã thông báo gì vào ngày 23 tháng 3 năm 2020?

Mua không giới hạn các trái phiếu Treasury và chứng khoán thế chấp — "với số lượng cần thiết" — cùng với PMCCF và SMCCF, các cơ chế đầu tiên của Fed để mua trái phiếu doanh nghiệp, và việc tái khởi động TALF cho tín dụng tiêu dùng. Thông báo được đưa ra lúc 8:00 sáng ET, trước giờ mở cửa; SPY vẫn đóng cửa ngày hôm đó ở mức thấp nhất của thị trường gấu.

Ngày 23 tháng 3 năm 2020 có phải là đáy của đợt sụt giảm COVID không?

Có, xét theo giá đóng cửa: mức đóng cửa thấp nhất của SPY là $222.51 được ghi nhận vào ngày 23 tháng 3, vài giờ sau thông báo của Fed. Mức này chưa bao giờ bị phá vỡ — mức đóng cửa thấp nhất sau đó là vào ngày 2020-03-24, cao hơn 9.5% so với đáy.

Khi nào thị trường chứng khoán hồi phục về mức đỉnh trước COVID?

SPY lần đầu tiên đóng cửa trên mức đỉnh lịch sử ngày 19 tháng 2 năm 2020 vào ngày 2020-08-18, sau 103 phiên giao dịch kể từ khi chạm đáy — một chu kỳ hồi phục kéo dài 181 ngày, so với 1983 ngày của hành trình tương đương trong cuộc khủng hoảng năm 2008.

Bạn có thể mua sau tin tức đó mà vẫn có lợi nhuận tốt không?

Giá mở cửa đã gap up +5.4% trước khi phiên giao dịch chính thức bắt đầu, và giá tiếp tục tăng trong ngày — mọi điểm vào lệnh sau đó đều có chi phí cao hơn mức đóng cửa trước đó, và vẫn thấp hơn nhiều so với mức thị trường vào đợt hồi phục tháng 8 năm 2020.

Ghi chú dữ liệu
  • Giá đóng cửa là giá in cuối cùng của phiên giao dịch chính thức (9:30 am-4:00 pm ET) từ dữ liệu minute tape; chúng có thể chênh lệch vài cent so với giá đóng cửa đấu giá chính thức.
  • Ngày hồi phục chỉ dựa trên giá; thước đo tổng lợi nhuận (bao gồm tái đầu tư cổ tức) theo cấu trúc sẽ hồi phục sớm hơn.
  • Lợi suất 10 năm được tính cùng với chuỗi dữ liệu hàng ngày của Treasury vào các ngày giao dịch; basis points là một phần trăm chia cho một trăm.
  • Mẫu dữ liệu của bảng xếp hạng bắt đầu từ 2003-09-10 — "kể từ năm 2003" trên trang này có nghĩa là khoảng thời gian đó, không phải toàn bộ lịch sử thị trường được ghi lại.

Mọi bảng trên đều là các truy vấn đã được lưu trữ và phân phiên từ dữ liệu lịch sử — hãy mở rộng SQL để xem từng phép đo. Bạn muốn trải nghiệm ngày này thay vì chỉ đọc? Đây là một trong các kịch bản có thể chơi trong trình mô phỏng giao dịch Strasmore Labs.

#market history#covid rally#bull markets#federal reserve#spy