Strasmore Research
เจาะลึกข้อมูล Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

วิเคราะห์ตลาดหุ้นวันที่ 24 มีนาคม 2020

เจาะลึกเหตุการณ์ตลาดหุ้นดิ่งลงและมาตรการจาก Fed ในวันที่ 24 มีนาคม 2020 ตั้งแต่ช่วงวิกฤต COVID ไปจนถึงจุดเริ่มต้นของตลาดกระทิงรอบใหม่ที่นักลงทุนต้องศึกษา

เมื่อวันที่ 23 มีนาคม 2020 Fed ได้ประกาศมาตรการซื้อสินทรัพย์แบบไม่จำกัดจำนวน หรือ QE ที่ไม่มีการกำหนดเพดานสูงสุด รวมถึงมาตรการที่ไม่เคยทำมาก่อน คือการจัดตั้งกลไกเพื่อซื้อหุ้นกู้ภาคเอกชน เมื่อวันที่ 24 มีนาคม 2020 ตลาดตอบรับด้วยการพุ่งขึ้นของราคาหุ้นจากมาตรการกระตุ้นเศรษฐกิจในช่วง COVID ซึ่งเป็นการเพิ่มขึ้นของหุ้นสหรัฐฯ รายวันครั้งใหญ่ที่สุดครั้งหนึ่งในประวัติศาสตร์ และหากมองย้อนกลับไปจะพบว่านั่นคือวันที่สองของการเริ่มต้นตลาดกระทิงรอบใหม่ โดยจุดต่ำสุดของตลาดได้ปิดตัวลงในช่วงบ่ายของวัน ก่อน ที่การประกาศดังกล่าวจะมีผลบังคับใช้

การดิ่งลงก่อนการกลับตัว

เหตุการณ์การดิ่งลง มีหน้าแยกต่างหาก ส่วนหน้านี้แสดงข้อมูลประกอบ ซึ่งประกอบด้วยข้อมูลรายวันตั้งแต่จุดสูงสุดตลอดกาลจนถึงจุดต่ำสุด พร้อมกับอัตราผลตอบแทนพันธบัตรสหภาพ 10 ปี ในหน่วย basis points:

คำสั่งดึงข้อมูลราคาปิดรายวันของ SPY, drawdown และอัตราผลตอบแทนพันธบัตร 10 ปี — 19 กุมภาพันธ์ ถึง 23 มีนาคม 2020
SQL เบื้องหลังตัวเลขแต่ละตัว
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

จากราคาปิดจุดสูงสุดตลอดกาลที่ $338.31 ใน 2020-02-19 ราคา SPY ลดลงเหลือ $222.51 ภายใน 2020-03-23 คิดเป็นการปรับตัวลดลง -34.2% โดยข้อมูลการลดลงในแต่ละวันแสดงอยู่ในแถว 24 ของตาราง

คอลัมน์อัตราผลตอบแทนคือตัวบ่งชี้สำคัญ ในช่วง 2020-03-09 อัตราผลตอบแทน 10 ปี ลดลงจาก 156 basis points ลงมาอยู่ที่ 54 ซึ่งเป็นระดับสูงสุดเป็นประวัติการณ์ในขณะนั้น สะท้อนถึงสภาวะ flight to safety หรือการย้ายเงินทุนจากหุ้นเข้าสู่พันธบัตร หลังจากนั้นรูปแบบดังกล่าวได้เปลี่ยนไป โดยภายใน 2020-03-18 อัตราผลตอบแทนเพิ่มขึ้นมากกว่าสองเท่าเป็น 118 basis points ในขณะที่การปรับตัวลดลงของ SPY ลึกขึ้นจาก -18.9% เป็น -28.8% การที่หุ้นและพันธบัตรสหภาพตกลงพร้อมกันเป็นสัญญาณของการถูกบังคับขาย (forced selling) ซึ่งเกิดจากการที่ผู้ถือครองต้องการเพิ่มสภาพคล่องโดยการขายสินทรัพย์ทุกอย่างที่มีแรงซื้อรองรับ จนกระทั่งช่วงกลางเดือนมีนาคม วิกฤตการณ์นี้ได้กลายเป็นปัญหาด้านระบบโครงสร้างพื้นฐานของสินเชื่อ มากกว่าจะเป็นเรื่องของราคาหุ้น

สิ่งที่ Fed ประกาศจริง — และสิ่งที่ไม่ได้ผล

การลดอัตราดอกเบี้ยเคยถูกนำมาใช้แล้ว ลำดับเหตุการณ์ตามช่วงเวลาซึ่งสามารถอ่านได้จากแผงข้อมูลด้านบน:

  • 2020-03-03 — การลดอัตราดอกเบี้ยฉุกเฉินจำนวนครึ่งจุดเปอร์เซ็นต์ ซึ่งเป็นการลดดอกเบี้ยระหว่างการประชุมครั้งแรกตั้งแต่ปี 2008 โดย SPY ปิดที่ $300.34 ต่ำกว่าจุดสูงสุด -11.2% และราคายังคงปรับตัวลดลงอย่างต่อเนื่อง
  • 15 มีนาคม วันอาทิตย์ — ลดอัตราดอกเบี้ยลงเหลือศูนย์ พร้อมกับโครงการซื้อสินทรัพย์มูลค่า 7 แสนล้านดอลลาร์ ในการซื้อขายรอบถัดไป 2020-03-16 ปิดตลาดต่ำกว่าจุดสูงสุดของเดือนกุมภาพันธ์ -29.2% ซึ่งถือเป็นหนึ่งในวันที่แย่ที่สุดในช่วงวิกฤตทั้งหมด
  • 23 มีนาคม เวลา 08:00 น. ตามเวลา ET — Fed ยกเลิกเพดานการจำกัดวงเงิน โดยจะดำเนินการซื้อพันธบัตรรัฐบาลและหลักทรัพย์ที่มีสินเชื่อที่อยู่อาศัยค้ำประกันต่อไป "ในจำนวนที่จำเป็น" โดยไม่มีกำหนดสิ้นสุด พร้อมกับการประกาศใช้ PMCCF และ SMCCF ซึ่งเป็นเครื่องมือซื้อพันธบัตรภาคเอกชนครั้งแรกของ Fed และการฟื้นฟู TALF เพื่อสนับสนุนสินเชื่อเพื่อการบริโภค อย่างไรก็ตาม SPY ยังคงปิดตลาดที่ระดับต่ำสุดของตลาดหมีในช่วงบ่ายวันนั้น
  • 24 มีนาคม — รายละเอียดการซื้อขายอยู่ด้านล่าง ในช่วงข้ามคืน สภาคองเกรสได้บรรลุข้อตกลงเกี่ยวกับ CARES Act มูลค่าประมาณ 2 ล้านล้านดอลลาร์ ซึ่งได้รับการลงนามเมื่อวันที่ 27 มีนาคม ตามรายละเอียดการรับเงินที่ระบุไว้ด้านล่าง

ความแตกต่างในการออกแบบสองประการที่ทำให้แพ็กเกจเมื่อวันที่ 23 มีนาคม ต่างจากความพยายามก่อนหน้านี้ คือ โครงการที่มีขนาดจำกัดจะมีวันสิ้นสุดที่ตลาดที่กำลังตึงเครียดสามารถคาดการณ์ได้ แต่คำว่า "ในจำนวนที่จำเป็น" นั้นไม่สามารถคาดการณ์ได้ และเครื่องมือสำหรับภาคเอกชนได้นำผู้ซื้อที่เป็นภาครัฐเข้าไปในตลาดสินเชื่อโดยตรงในจุดที่ระบบการชำระเงินหยุดชะงัก การพิจารณาว่าความแตกต่างเหล่านี้คือปัจจัยสำคัญหรือไม่นั้นขึ้นอยู่กับการตีความ แต่ข้อมูลในตลาดได้บันทึกลำดับเหตุการณ์ไว้แล้ว ได้แก่ การยกระดับมาตรการสองครั้ง ตามด้วยการลดลงอย่างต่อเนื่อง การออกแบบรูปแบบที่สาม และการกลับตัวของตลาด

สรุปภาพรวมรายวัน

คำสั่งดึงข้อมูลSPY ณ วันที่ 24 มีนาคม 2020 — จุดเปลี่ยนสำคัญ
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-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')

จากราคาปิดเมื่อวันที่ 23 มีนาคม ที่ $222.51 ซึ่งเป็นราคาปิดสุดท้ายของตลาดหมี SPY เปิดตลาดแบบ gap up อยู่ที่ +5.4% ไปที่ระดับ $234.42 โดยในช่วงนาทีแรกของการซื้อขาย (09:31 ET) ราคาลงไปแตะจุดต่ำสุดของวันที่ $233.8 แต่หลังจากนั้นราคาก็ไม่กลับลงไปอีกเลย โดยราคาปิดที่ $243.59 คิดเป็น +9.5% ของวัน การพุ่งขึ้นครั้งนี้มีลักษณะตรงกันข้ามกับเหตุการณ์ตลาดดิ่งลงอย่างรุนแรงที่ราคาปิดอยู่ที่จุดต่ำสุด อย่างไรก็ตาม ข้อมูลในแถวเดียวอาจทำให้ดูเหมือนว่าราคาเคลื่อนที่ไปในทิศทางเดียว แต่ข้อมูลการซื้อขายรายครึ่งชั่วโมงด้านล่างแสดงให้เห็นถึงแรงขายที่ตลาดต้องเผชิญในช่วงระหว่างวัน

รูปแบบของเซสชัน

คำสั่งดึงข้อมูลSPY รายครึ่งชั่วโมง — ช่วงเวลาทำการปกติ ณ วันที่ 24 มีนาคม 2020
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-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

ข้อมูลบ่งชี้อย่างชัดเจนว่าทิศทางราคาเกิดการเปลี่ยนแนวทาง จุดต่ำสุดที่ $233.8 เกิดขึ้นในช่วงนาทีแรกของการเปิดตลาดและไม่มีการกลับลงไปทดสอบอีก ซึ่งแสดงให้เห็นว่าทิศทางขาขึ้นในช่วงแรกนั้นเกิดขึ้นจริง อย่างไรก็ตาม หลังจากราคาขึ้นไปถึง $242.24 ในช่วงเวลาเที่ยง ราคาได้มีการย่อตัวลงเป็นเวลาสองชั่วโมง โดยช่วงเวลา 13:30 ปิดที่ $237.25 และช่วงเวลา 14:00 ทำจุดต่ำสุดของช่วงบ่ายที่ $235.05 ซึ่งเป็นช่วงที่ราคาอาจเกิดการดีดตัวที่ล้มเหลวอีกครั้ง แต่การย่อตัวดังกล่าวกลับทรงตัวอยู่เหนือจุดต่ำสุดช่วงเปิดตลาด และในช่วงครึ่งชั่วโมงสุดท้าย ราคาปิดที่ระดับสูงสุดของเซสชันที่ $243.59 ด้วยปริมาณการซื้อขาย 34.7 ล้านหุ้น ซึ่งเป็นปริมาณการซื้อขายที่มากที่สุดของวันที่มีปริมาณรวม 232.4 ล้านหุ้น และสูงกว่าปริมาณช่วงเปิดตลาดที่ 27.3 ล้านหุ้น สรุปคือมีการย่อตัวในช่วงกลางวันแล้วมีแรงซื้อกลับ จนสามารถปิดตลาดที่ระดับสูงสุดด้วยปริมาณการซื้อขายที่หนาแน่นที่สุด

ตลาดขาขึ้นในวงกว้าง หรือกระจุกตัว?

ดัชนีอาจถูกดึงให้สูงขึ้นได้ด้วยหุ้นขนาดใหญ่เพียงไม่กี่ตัว แต่สถานการณ์ครั้งนี้ไม่ใช่เช่นนั้น กองทุน 12 แห่ง ซึ่งประกอบด้วยกองทุนดัชนีหลัก 3 แห่ง และกองทุนกลุ่มอุตสาหกรรมของ S&P อีก 9 แห่ง ปิดตลาดในทิศทางเดียวกัน:

คำสั่งดึงข้อมูลภาพรวมดัชนีและ sector ETFs ณ วันที่ 24 มีนาคม 2020 — ทุกกลุ่มปรับตัวขึ้น โดยเริ่มจากกลุ่ม cyclicals
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 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

ทุกกองทุนใน 12 ปิดตลาดในแดนบวก กลุ่มพลังงาน (XLE) นำตลาดที่ +16.4% ตามมาด้วยกลุ่มอุตสาหกรรม (XLI, +12.8%) และกลุ่มการเงิน (XLF, +12.7%) ซึ่งเป็นกลุ่มที่มีความอ่อนไหวต่อสภาวะเศรษฐกิจมากที่สุด และเป็นกลุ่มแรกๆ ที่ได้รับผลกระทบหากเกิดการหยุดชะงักทางเศรษฐกิจ ดัชนี DIA ปรับตัวขึ้น 11.3% ซึ่งเป็นปัจจัยที่ทำให้เกิดพาดหัวข่าว "วันที่ดีที่สุดนับตั้งแต่ปี 1933" ในสัปดาห์นั้น โดยเป็นสถิติที่เกิดขึ้นกับประวัติศาสตร์ราคาที่ยาวนานของ Dow ส่วนกลุ่มหุ้นปลอดภัยแบบดั้งเดิมอย่างสินค้าอุปโภคบริโภค (XLP, +5.1%) และกลุ่มเฮลธ์แคร์ (XLV, +7.4%) มีการปรับตัวขึ้นน้อยที่สุด ขณะที่ QQQ ของ Nasdaq-100 (+7.7%) ปรับตัวขึ้นน้อยกว่า SPY ที่ +9.5% การที่ตลาดเป็นสีเขียวทั่วทั้งกระดานโดยมีกลุ่มหุ้นวัฏจักรเป็นผู้นำนั้น มีลักษณะตรงกันข้ามกับการพุ่งขึ้นของหุ้นขนาดใหญ่เพียงไม่กี่ตัว ซึ่งความกว้างของตลาด (breadth) คือลักษณะเด่นของวันนี้

เหตุการณ์นี้มีความสำคัญทางประวัติศาสตร์มากน้อยเพียงใด?

"วันที่ใหญ่ที่สุดนับตั้งแต่ปี 1933" คือสถิติของ Dow จากหนังสือพิมพ์ในสัปดาห์นั้น นี่คือสิ่งที่ข้อมูลของเราสามารถยืนยันได้ โดยจำกัดขอบเขตเฉพาะสิ่งที่ข้อมูลครอบคลุมจริง:

คำสั่งดึงข้อมูลการจัดอันดับ SPY ณ วันที่ 24 มีนาคม 2020 เทียบกับทุกช่วงเวลาในระดับนาทีตั้งแต่ปี 2003
SQL เบื้องหลังตัวเลขแต่ละตัว
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

ตั้งแต่ 2003-09-10 ซึ่งเป็นเซสชันแรกของข้อมูลรายนาทีของเรา SPY มีผลตอบแทนรายวันแบบ close-to-close อยู่ที่ 5613 โดยวันที่ 24 มีนาคม 2020 ที่มีค่า +9.5% นั้นอยู่ในอันดับ #3 กล่าวคือ มีเพียง 2 เซสชันเท่านั้นที่ทำผลตอบแทนได้ดีกว่า (2008-10-13, 2008-10-28) ซึ่งทั้งสองเหตุการณ์เกิดขึ้นในช่วงวิกฤตเดือนตุลาคม 2008 ลำดับเหตุการณ์ต่อเนื่องสามวันนั้นเกิดขึ้นได้ยากยิ่งกว่า โดยการพุ่งขึ้น +17.5% จากราคาปิดวันที่ 23 มีนาคม ถึงราคาปิดวันที่ 26 มีนาคม มีค่า 0 มากกว่าการเพิ่มขึ้นในรอบสามเซสชันใดๆ ในชุดข้อมูลทั้งหมด จากข้อมูลทั้งหมดที่ระบบสามารถตรวจสอบได้ ไม่มีเหตุการณ์ใดที่มีความรุนแรงเทียบเท่าเหตุการณ์นี้

ปริมาณการซื้อขายบอกเล่าเรื่องราวที่เงียบกว่า โดยมีปริมาณการซื้อขาย SPY อยู่ที่ 232 ล้านหุ้น ซึ่งคิดเป็น 2.86 เท่าของค่าเฉลี่ยย้อนหลังหนึ่งปี และเป็นเพียง 1.12 เท่าของค่าเฉลี่ยในช่วง 30 เซสชันก่อนหน้า เมื่อเทียบกับช่วงเวลาปกติในประวัติศาสตร์ กิจกรรมนี้ถือว่าไม่ธรรมดา แต่เมื่อเทียบกับสัปดาห์ที่เกิดการดิ่งลงของตลาดก่อนหน้านั้น มันเป็นเพียงอีกหนึ่งวันท่ามกลางพายุเท่านั้น เหตุการณ์สำคัญทางประวัติศาสตร์ไม่ได้ประกาศตัวผ่านปริมาณการซื้อขายที่สูงเป็นประวัติการณ์เสมอไป

การพุ่งขึ้นอย่างรุนแรงในระยะเวลาสามวัน

คำสั่งดึงข้อมูลราคาปิด SPY ช่วงวันที่ 23-26 มีนาคม 2020 — การพุ่งขึ้นอย่างรุนแรงใน 3 วัน
SQL เบื้องหลังตัวเลขแต่ละตัว
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

ทิศทางตลาดเปลี่ยนไปอย่างชัดเจนทันที โดยปรับตัวขึ้น +9.5% ในวันที่ 24, +1.3% ในวันที่ 25 และ +5.9% ในวันที่ 26 ซึ่งเป็นการปรับตัวขึ้นต่อเนื่องสามวันติดต่อกันที่ลบผลขาดทุนจากการดิ่งลงของตลาดในช่วงหลายสัปดาห์ก่อนหน้า และเป็นช่วงการปรับตัวขึ้นที่ใหญ่ที่สุดเมื่อเทียบกับข้อมูลตัวอย่างทั้งหมดข้างต้น รูปแบบที่เกิดขึ้นนี้มีความคล้ายคลึงกับ มีนาคม 2009 อย่างมีนัยสำคัญ โดยในทั้งสองกรณี การตอบสนองเชิงนโยบายที่สำคัญเกิดขึ้นในช่วงใกล้จุดต่ำสุด การฟื้นตัวในระยะแรกมีความรุนแรงมาก และในเช้าวันที่มีโอกาสทำกำไรสูงสุดนั้น ดูไม่ต่างจากการดีดตัวขึ้นชั่วคราวในตลาดหมีทั่วไป

การฟื้นตัวนี้ยังคงรักษาเสถียรภาพไว้ได้หรือไม่?

ในขณะนั้น มุมมองที่เป็นเอกฉันท์คือ "การดีดตัวในตลาดหมี" และกลุ่มผู้ที่สงสัยก็มีหลักฐานสนับสนุนเช่นกัน เนื่องจากเมื่อสิบเอ็ดวันก่อนหน้า ตลาดเคยเกิดการฟื้นตัวในระดับที่ใกล้เคียงกันนี้มาแล้ว คือจาก $248.1 เมื่อวันที่ 2020-03-12 ไปยัง $270.93 เมื่อวันที่ 2020-03-13 และหลังจากนั้นเพียงหนึ่งวัน ตลาดปิดที่ $239.41 ซึ่งเป็นวันที่แย่ที่สุดในช่วงที่ตลาดดิ่งลง การที่ตลาดปิดบวกเพียงวันเดียวไม่ได้เป็นเครื่องยืนยันสิ่งใด แต่สิ่งที่ทำให้วันที่ 24 มีนาคม แตกต่างออกไปคือสิ่งที่เกิดขึ้นตามมา:

คำสั่งดึงข้อมูลรักษาฐานได้หรือไม่? การทดสอบแนวรับที่ไม่ได้เกิดขึ้น และนาฬิกาการฟื้นตัวสองรูปแบบ
SQL เบื้องหลังตัวเลขแต่ละตัว
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

ไม่มีการทดสอบระดับราคาต่ำสุดอีกครั้ง หลังจากวันที่ 23 มีนาคม ระดับราคาปิดที่ต่ำที่สุดเท่าที่ SPY เคยทำได้คือ $243.59 เมื่อวันที่ 2020-03-24 ซึ่งเป็นวันที่ตลาดพุ่งขึ้นจากการอัดฉีดสภาพคล่อง ตลาดไม่เคยปิดในระดับที่ใกล้เคียงกับจุดต่ำสุดภายในระยะ 9.5% อีกเลย ระดับสูงสุดก่อนช่วง COVID ที่ $338.31 ถูกดึงกลับมาได้ในวันที่ 2020-08-18 หรือหลังจากจุดต่ำสุดเพียง 103 วันทำการ ซึ่งถือเป็นการเคลื่อนที่แบบ round trip จากจุดสูงสุดเดิมกลับสู่จุดสูงสุดเดิมภายในระยะเวลา 181 วัน เมื่อเปรียบเทียบกับปี 2008 ด้วยวิธีการคำนวณแบบเดียวกัน พบว่าจุดสูงสุดของ SPY ในช่วง 2007-10-09 ไม่มีการทำจุดปิดสูงสุดใหม่จนกระทั่งวันที่ 2013-03-14 หรือหลังจากนั้น 1983 วัน วิกฤตการณ์สองครั้ง สองความเร็ว ในตลาดเดียวที่มีการเปลี่ยนแปลงกลไกการทำงานในช่วงระหว่างนั้น

บทเรียนจากวันนี้

มีสามประเด็นสำคัญที่ควรทำความเข้าใจ ประการแรก คืออิทธิพลของช่องว่างราคา (gap) ที่ส่งผลอย่างมาก กำไรส่วนใหญ่ของวันนี้เกิดขึ้นตั้งแต่ก่อนตลาดเปิด ซึ่งผู้ที่รอเข้าซื้อในช่วงเวลาทำการปกติจะต้องซื้อในราคาที่สูงขึ้นตลอดทั้งวัน นี่คือกลไกของ overnight gap ที่ทำงานอย่างเต็มประสิทธิภาพ ประการที่สอง คือจุดต่ำสุดเกิดขึ้นก่อนการยืนยันแนวโน้ม ราคาปิดของวันที่ 23 มีนาคม คือจุดต่ำสุด ซึ่งจะเห็นได้ชัดเจนก็ต่อเมื่อตลาดไม่กลับลงไปทดสอบจุดนั้นอีกหลังจากผ่านเซสชันเช่นนี้ ประการที่สาม คือความเร็วที่ส่งผลทั้งสองด้าน โครงสร้างตลาดแบบเดียวกันที่ทำให้การปรับตัวลดลง -34.2% ถูกบีบอัดลงในแถว 24 ด้านบน ได้บีบอัดการฟื้นตัวในช่วงเริ่มต้นให้จบลงภายในสามเซสชัน ความเร็วเป็นคุณสมบัติของระบบโครงสร้างตลาดในยุคนี้ ไม่ได้ขึ้นอยู่กับข่าวดีหรือข่าวร้าย

กลุ่มผู้ที่สงสัยในสัปดาห์นั้นไม่ใช่คนเขลา ทั้งในด้านความกว้างของตลาด (breadth) แรงส่ง และการทดสอบแนวรับที่ไม่ได้เกิดขึ้นจริง ทุกปัจจัยที่แยกวันที่ 24 มีนาคม ออกจากการพุ่งขึ้นที่ล้มเหลวสามารถวัดผลได้ก็ต่อเมื่อมองย้อนกลับไปเท่านั้น ความแตกต่างระหว่างการดีดตัวในตลาดหมี (bear-market rally) กับตลาดกระทิงรอบใหม่ (new bull market) นั้นไม่สามารถมองเห็นได้ในวันแรก แต่จะเห็นได้อย่างชัดเจนภายในไม่กี่เดือน

คำถามที่พบบ่อยเกี่ยวกับการฟื้นตัวช่วง COVID

เกิดอะไรขึ้นเมื่อวันที่ 24 มีนาคม 2020?

เป็นตลาดเต็มวันแรกหลังจาก Fed ประกาศมาตรการ QE แบบไม่จำกัดวงเงิน: SPY เปิดกระโดดขึ้น +5.4% และปิดที่ +9.5% — ซึ่งเป็นการเพิ่มขึ้นภายในวันเดียวที่สูงที่สุดเป็นอันดับ #3 จากจำนวน 5613 วันที่ข้อมูลรายนาทีของเราครอบคลุม โดยเป็นรองเพียงสองวันที่เกิดขึ้นในเดือนตุลาคม 2008 เท่านั้น

Fed ประกาศอะไรเมื่อวันที่ 23 มีนาคม 2020?

การซื้อพันธบัตรรัฐบาลและหลักทรัพย์ที่มีสินเชื่อที่อยู่อาศัยค้ำประกันแบบไม่กำหนดกรอบวงเงิน — "ในจำนวนที่จำเป็น" — พร้อมด้วย PMCCF และ SMCCF ซึ่งเป็นเครื่องมือใหม่ที่ใช้ซื้อหุ้นกู้บริษัทเป็นครั้งแรก และการฟื้นฟู TALF เพื่อสนับสนุนสินเชื่อผู้บริโภค แถลงการณ์ถูกเผยแพร่ออกมาเมื่อเวลา 8:00 am ET ก่อนตลาดเปิด แต่ SPY ยังคงปิดตลาดวันนั้นที่ระดับต่ำสุดของตลาดหมี

วันที่ 23 มีนาคม 2020 คือจุดต่ำสุดของวิกฤต COVID หรือไม่?

ใช่ หากพิจารณาจากราคาปิด: SPY ปิดที่ระดับต่ำสุดที่ $222.51 เมื่อวันที่ 23 มีนาคม เพียงไม่กี่ชั่วโมงหลังจากการประกาศของ Fed และระดับนี้ไม่เคยถูกทดสอบอีกเลย โดยจุดต่ำสุดถัดมาที่เกิดขึ้นคือวันที่ 2020-03-24 ซึ่งสูงกว่าจุดต่ำสุดอยู่ 9.5%

ตลาดหุ้นฟื้นตัวกลับไปสู่ระดับสูงสุดก่อนช่วง COVID เมื่อใด?

SPY ปิดเหนือระดับสูงสุดตลอดกาลเมื่อวันที่ 19 กุมภาพันธ์ 2020 เป็นครั้งแรกในวันที่ 2020-08-18 หรือหลังจากจุดต่ำสุด 103 วันทำการ — คิดเป็นการเดินทางแบบ round trip เป็นเวลา 181 วัน เมื่อเทียบกับระยะเวลา 1983 วันของการเดินทางในลักษณะเดียวกันในช่วงวิกฤตปี 2008

หากซื้อหุ้นหลังจากทราบข่าวแล้ว ผลตอบแทนจะยังดีอยู่หรือไม่?

ราคาเปิดกระโดดขึ้น +5.4% ก่อนการซื้อขายปกติจะเริ่มขึ้น และราคายังคงปรับตัวสูงขึ้นต่อเนื่อง — การเข้าซื้อทุกครั้งหลังจากนั้นจะมีต้นทุนสูงกว่าราคาปิดก่อนหน้า แต่ก็ยังถือว่าต่ำกว่าระดับที่ตลาดเคลื่อนที่ไปถึงในช่วงการฟื้นตัวในเดือนสิงหาคม 2020

หมายเหตุข้อมูล
  • ราคาปิดคือราคาจากการพิมพ์ครั้งสุดท้ายของช่วงการซื้อขายปกติ (9:30 am-4:00 pm ET) จากข้อมูลรายนาที ซึ่งอาจแตกต่างจากราคาปิดอย่างเป็นทางการจากการประมูลอยู่ไม่กี่เซนต์
  • วันที่ฟื้นตัวพิจารณาจากราคาเท่านั้น หากใช้การวัดผลตอบแทนรวม (รวมการนำเงินปันผลไปลงทุนต่อ) จะพบว่าการฟื้นตัวเกิดขึ้นเร็วกว่าโดยธรรมชาติ
  • อัตราผลตอบแทนพันธบัตรอายุ 10 ปี จะรวมอยู่ในชุดข้อมูลรายวันของ Treasury ในวันที่มีการซื้อขาย โดย basis points คือหนึ่งในร้อยของหนึ่งเปอร์เซ็นต์
  • ตัวอย่างข้อมูลในแผงจัดอันดับเริ่มต้นที่ 2003-09-10 — คำว่า "ตั้งแต่ปี 2003" ในหน้านี้หมายถึงช่วงเวลาดังกล่าว ไม่ใช่ประวัติศาสตร์ตลาดทั้งหมดที่เคยบันทึกไว้

ทุกแผงข้อมูลด้านบนคือผลลัพธ์จากการดึงข้อมูล (query) ที่มีการจัดเก็บและระบุเวอร์ชันจากข้อมูลย้อนหลัง — สามารถขยายคำสั่ง SQL เพื่อดูรายละเอียดการวัดผลแต่ละรายการ หากต้องการทดลองเทรดในสถานการณ์นี้แทนการอ่านข้อมูล สามารถทำได้ใน โปรแกรมจำลองการเทรดของ Strasmore Labs

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