2020年3月24日:市场转折之日
重看2020年3月24日的分钟级行情:股灾、现金争夺、美联储特别方案与板块广度,解析市场为何转向,以及迟迟未现的回踩。
2020年3月23日,美联储宣布开展无上限资产购买,即没有预设规模上限的量化宽松(QE),并推出一项前所未有的措施:设立购买公司债券的工具。
2020年3月24日,市场给出了回应:新冠疫情刺激政策推动的反弹创下美国股市单日最大涨幅之一;只有回头看才会发现,这也是新一轮牛市的第二天。市场底部本身在该公告发布前一个交易日下午收盘时已经形成。
转折前的崩盘
崩盘本身另有专页;以下是本页所依据的记录,涵盖从历史高点到市场底部的每个交易日,并列出同期10年期美国国债收益率(单位为基点):
| 交易时段 | 收盘价(美元) | 回撤(%) | 10年期收益率(基点) |
|---|---|---|---|
| 2020-02-19 | 338.31 | 0 | 156 |
| 2020-02-20 | 336.98 | -0.4 | 152 |
| 2020-02-21 | 333.49 | -1.4 | 146 |
| 2020-02-24 | 322.41 | -4.7 | 138 |
| 2020-02-25 | 312.7 | -7.6 | 133 |
| 2020-02-26 | 311.55 | -7.9 | 133 |
| 2020-02-27 | 297.55 | -12 | 130 |
| 2020-02-28 | 296.16 | -12.5 | 113 |
| 2020-03-02 | 309.08 | -8.6 | 110 |
| 2020-03-03 | 300.34 | -11.2 | 102 |
| 2020-03-04 | 312.91 | -7.5 | 102 |
| 2020-03-05 | 302.45 | -10.6 | 92 |
| 2020-03-06 | 297.42 | -12.1 | 74 |
| 2020-03-09 | 274.4 | -18.9 | 54 |
| 2020-03-10 | 288.44 | -14.7 | 76 |
| 2020-03-11 | 274.36 | -18.9 | 82 |
| 2020-03-12 | 248.1 | -26.7 | 88 |
| 2020-03-13 | 270.93 | -19.9 | 94 |
| 2020-03-16 | 239.41 | -29.2 | 73 |
| 2020-03-17 | 254.19 | -24.9 | 102 |
每个数字背后的完整 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_dateSPY在2020-02-19创下338.31美元的历史收盘高点,随后于2020-03-23跌至222.51美元,回撤幅度为-34.2%。整个下跌过程的每个交易日都包含在面板的24行中。
收益率一栏揭示了关键变化。在2020-03-09之前,10年期收益率从156个基点骤降至当时的纪录低点54。这体现了典型的避险情绪,资金从股票转向债券。随后,模式发生改变:截至2020-03-18,收益率已翻倍以上,升至118个基点,而SPY的回撤则从-18.9%扩大至-28.8%。股票和美国国债价格同时下跌,是被迫抛售的典型特征。持有人通过出售仍有买盘的资产来筹集现金。到3月中旬,危机已不再只是股票价格问题,而是蔓延至信贷体系本身的运转。
美联储实际宣布了什么,以及哪些措施未能奏效
降息此前已经实施过。上方面板按日期列出了各项措施,时间顺序清晰可见:
- 2020-03-03,紧急降息50个基点。这是2008年以来首次在议息会议之间降息。SPY收于$300.34,较高点低-11.2%,随后跌势延续。
- 3月15日,星期日,利率降至零,并推出规模为7000亿美元的资产购买计划。下一交易日2020-03-16收盘时,较2月高点低-29.2%,成为整个暴跌期间最糟糕的单日交易时段之一。
- 3月23日,美国东部时间上午8:00,美联储取消了购买上限:美国国债和抵押贷款支持证券将“按所需金额”持续购买,不设上限。相关措施还包括PMCCF和SMCCF。这是美联储首次设立公司债购买工具;此外,重启的TALF为消费信贷提供支持。但当天下午,SPY仍收于熊市最低点。
- 3月24日,即下方所示交易日。隔夜,国会就规模约2万亿美元的《CARES法案》达成一致;法案于3月27日签署,属于下文进一步记录的三天密集政策行动。
3月23日方案与此前措施之间有两项设计差异。固定规模的计划有明确终止日期,压力市场可以提前消化这一点;而“按所需金额”购买则没有这一限制。公司债工具将公共部门买方直接置于信贷市场内部,而当时该市场的运作机制已经失灵。
这些差异是否决定了结果,仍取决于判断。市场走势记录了这一过程:两次升级后市场继续下跌,第三次采用不同设计,随后出现转折。
同日走势
| 前收盘价 | 正常交易时段开盘价 | 跳空幅度(%) | 正常交易时段最低价 | 最低价时间(美东) | 正常交易时段最高价 | 正常交易时段收盘价 | 日变化(%) | 最低价较前收盘价变化(%) | 日成交股数(百万) | 正常交易时段分钟K线 |
|---|---|---|---|---|---|---|---|---|---|---|
| 222.51 | 234.42 | 5.4 | 233.8 | 09:31 | 244.1 | 243.59 | 9.5 | 5.1 | 232.4 | 390 |
每个数字背后的完整 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')从3月23日收盘价$222.51(熊市最后一个收盘价)算起,SPY高开+5.4%,开盘报$234.42。开盘几分钟内(美国东部时间09:31)录得盘中低点$233.8,此后再未回到该价位。最终收盘报$243.59,当日上涨+9.5%。低点在第一分钟成交价中出现的上涨行情,是以最低价收盘的暴跌行情的镜像。不过,单行数据会掩盖价格路径;下方的半小时行情显示,市场在该交易日还消化了这轮回落。
本交易时段的走势形态
| 美东时间 | 区间收盘价 | 区间最低价 | 成交股数(百万) |
|---|---|---|---|
| 09:30 | 235.51 | 233.8 | 27.3 |
| 10:00 | 238.45 | 234.6 | 17.4 |
| 10:30 | 237.46 | 237.04 | 13.2 |
| 11:00 | 238.36 | 236.16 | 11.5 |
| 11:30 | 240.43 | 237.58 | 12.5 |
| 12:00 | 242.24 | 239.65 | 14.2 |
| 12:30 | 239.65 | 239.57 | 12.9 |
| 13:00 | 239.41 | 237.86 | 16.1 |
| 13:30 | 237.25 | 236.76 | 10.7 |
| 14:00 | 237.38 | 235.05 | 16.9 |
| 14:30 | 240.58 | 236.61 | 11.5 |
| 15:00 | 241.45 | 240.21 | 12.1 |
| 15:30 | 243.59 | 240.41 | 37.5 |
每个数字背后的完整 SQL
SELECT
b.et_time AS et_time,
b.bucket_close AS bucket_close,
b.bucket_low AS bucket_low,
round((b.bar_shares + if(b.et_time = '15:30', p.print_shares, 0)) / 1e6, 1) AS shares_m
FROM
(
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,
toFloat64(sum(volume)) AS bar_shares
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
) AS b
CROSS JOIN
(
SELECT toFloat64(maxIf(size, has(conditions, 8))) AS print_shares
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= toDateTime('2020-03-24 20:00:00', 'UTC')
AND sip_timestamp < toDateTime('2020-03-24 20:15:00', 'UTC')
) AS p
ORDER BY et_time盘面显示,走势并非一路直行。开盘第一分钟录得233.8美元的低点,此后再未触及。这部分单边行情的判断确实成立。但午间时段触及242.24美元后,盘面在随后两小时回吐涨幅。13:30时段收于237.25美元,14:00时段录得午后的最低点235.05美元。这一阶段本可能让当天再次成为一次失败的反弹。实际回吐后的低点仍远高于开盘低点。最后半小时则录得全时段最高的时段收盘价243.59美元,成交量为37.5百万股,是全天232.4百万股成交量中最大的时段,甚至高于开盘时的27.3百万股。午间回调获得买盘承接,随后在成交量达到峰值时收于高位。
广泛上涨,还是局部行情?
指数可能仅靠少数超大盘股就被推高。但这次并非如此。以下十二只基金——三只主要指数跟踪基金和九只标普行业基金——在这两个收盘日均上涨:
| ticker | 3月23日收盘价 | 3月24日收盘价 | 变化(%) |
|---|---|---|---|
| XLE | 23.53 | 27.39 | 16.4 |
| XLI | 48.75 | 54.97 | 12.8 |
| XLF | 17.62 | 19.85 | 12.7 |
| DIA | 185.87 | 206.96 | 11.3 |
| XLU | 44.92 | 49.76 | 10.8 |
| XLK | 70.2 | 77.64 | 10.6 |
| XLY | 87.42 | 95.77 | 9.6 |
| SPY | 222.51 | 243.59 | 9.5 |
| IWM | 99.83 | 109.17 | 9.4 |
| QQQ | 170.61 | 183.79 | 7.7 |
| XLV | 74.8 | 80.31 | 7.4 |
| XLP | 48.66 | 51.12 | 5.1 |
每个数字背后的完整 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年以来最佳单日表现”的标题;这一最高纪录应放在道琼斯指数更长的价格历史中理解。涨幅最小的是传统防御板块,包括必需消费品(XLP,+5.1%)和医疗保健(XLV,+7.4%)。纳斯达克100指数的 QQQ(+7.7%)落后于 SPY 的 +9.5%。由周期性板块领涨、全线飘红的盘面,正是局部超大盘股挤压行情的相反形态。市场广度成为当天行情的主要特征。
这一天的历史意义究竟有多大?
“自1933年以来最强劲的一天”是当周报纸引用的道琼斯指数统计。以下是我们自己的行情数据能够核实的内容,范围仅限于数据实际覆盖的时期:
| 测量交易时段数 | 首个交易时段 | 3月24日涨幅(%) | 更大涨幅日数 | 3月24日排名 | 更大涨幅日期 | 3日突发行情涨幅(%) | 更大突发行情数 | 相对30日波动率 | 相对250日波动率 | 2024年3月股份数(百万) |
|---|---|---|---|---|---|---|---|---|---|---|
| 5613 | 2003-09-10 | 9.5 | 2 | 3 | 2008-10-13, 2008-10-28 | 17.5 | 0 | 1.12 | 2.86 | 232 |
每个数字背后的完整 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共出现5613次收盘至收盘的日回报。2020年3月24日的+9.5%排名第3位:恰好有2个交易日的涨幅超过它(2008-10-13, 2008-10-28),而且都发生在2008年10月的恐慌行情期间。三日走势更加罕见:从3月23日收盘至3月26日收盘的+17.5%涨幅,在整个样本中仅有0次更大的三日涨幅。这一数据仓库能够核查的范围内,没有任何行情能与这轮爆发相提并论。
成交量揭示了较为平静的一面:232百万股SPY成交量是过去一年的平均水平的2.86倍,但仅为此前30个交易日平均水平的1.12倍。与历史上任何正常时期相比,当天的交易活动都异常活跃;但与此前几周的崩盘行情相比,它只是风暴中的普通一天。历史性转折并不会以历史性成交量预先宣告自己。
三日爆发
| 交易时段 | 收盘价(美元) | 变化(%) | 成交股数(百万) |
|---|---|---|---|
| 2020-03-23 | 222.51 | -2.8 | 322.4 |
| 2020-03-24 | 243.59 | 9.5 | 232.4 |
| 2020-03-25 | 246.77 | 1.3 | 297.4 |
| 2020-03-26 | 261.39 | 5.9 | 253.8 |
每个数字背后的完整 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市场随即连续转强:24日上涨+9.5%,25日上涨+1.3%,26日上涨+5.9%。这三个交易日的连续上涨扭转了数周的暴跌。在上述样本中,没有更大幅度的三日反弹。2020年3月的走势有意呼应2009年3月:两次行情中,决定性的政策应对都在接近低点时出台,第一轮反弹都极为猛烈,而机会最大的那一天,在当日上午看来,都与熊市中的另一轮反弹没有区别。
反弹是否站稳?
在实时交易中,市场共识仍是“熊市反弹”。怀疑者也有自己的依据:就在十一天前,盘面已经出现过规模近似的反弹,从2020-03-12的$248.1涨至2020-03-13的$270.93;而在那之后的下一个交易日,收于$239.41,成为整个崩盘期间表现最差的一天。单日上涨无法证明任何问题。3月24日的不同之处,在于随后发生了什么:
| 2月19日历史最高收盘价 | 3月23日最低收盘价 | 恢复日期 | 达到新高所需交易日数 | 从低点到新高的天数 | 往返天数 | 之后最低收盘价 | 最低收盘价日期 | 最接近重测涨跌幅 | 2007年峰值日期 | 2013年恢复日期 | 2008年往返天数 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 338.31 | 222.51 | 2020-08-18 | 103 | 148 | 181 | 243.59 | 2020-03-24 | 9.5 | 2007-10-09 | 2013-03-14 | 1983 |
每个数字背后的完整 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回测并未出现。3月23日之后,SPY最低的收盘价是2020-03-24的$243.59,也就是刺激计划推动反弹的当天。此后,市场收盘价再也没有回到距离底部9.5%以内。COVID-19疫情前的高点$338.31于2020-08-18收复,距离低点过去了103个交易日;从历史高点跌回历史高点,再重新收复,整个往返耗时181天。以相同方法计算2008年的情况:SPY在2007-10-09触及的峰值,直到2013-03-14才创出新的收盘高点,间隔1983天。两场危机,两种速度,而这期间市场的运行节奏已经发生变化。
这一天带来的启示
有三点值得牢记。第一,涨幅主要来自跳空:当天的大部分涨幅在开盘前就已出现。任何等待正常交易时段入场的人,全天都只能以更高价格买入。这正是隔夜跳空机制达到最大幅度的表现。第二,底部先于确认出现:3月23日收盘价就是低点,但只有在之后的交易时段拒绝再次触及该点后,这一点才变得清晰。第三,速度具有双向作用:将-34.2%跌幅压缩到上文24行所示水平的同一市场结构,也将初步复苏压缩在三个交易日内。速度是这一时代市场基础设施的特征,并非利好或利空消息本身的属性。
那一周持怀疑态度的人并非愚蠢:市场广度、突然爆发的涨势,以及始终没有出现的回踩,所有区分3月24日与失败反弹的依据,都只有事后才能量化。熊市反弹与新一轮牛市之间的差异,在第一天无法看清,但几个月内便会变得毫无疑问。
新冠疫情反弹常见问题
2020年3月24日发生了什么?
这是美联储宣布无限量量化宽松后的首个完整交易日:SPY开盘跳涨5.4%,收盘上涨9.5%。在我们的分钟级行情数据覆盖的5613个交易日中,这是单日涨幅排名第3的交易日,仅次于2008年10月的两天。
美联储于2020年3月23日宣布了什么?
美联储宣布开放式购买美国国债和抵押贷款支持证券,“按所需金额”进行购买;同时推出PMCCF和SMCCF,这是其首次设立用于购买公司债券的工具,并重新启动用于消费者信贷的TALF。声明于美东时间上午8:00发布,早于开盘;SPY当天收盘价仍处于熊市低点。
2020年3月23日是新冠疫情崩盘的底部吗?
是,就收盘价而言:SPY于3月23日收于222.51美元,创下最低收盘价。该收盘价此后再未被触及;之后的最低收盘价出现在2020-03-24,比底部高9.5%。
股市何时收复疫情前高点?
SPY首次收盘高于2020年2月19日的历史最高收盘价是在2020-08-18,即底部之后第103个交易日。这段往返历时181天,而2008年崩盘的对应修复过程耗时1983天。
消息公布后买入,仍有机会取得良好表现吗?
在常规交易开始前,开盘已跳涨5.4%;当天市场继续上行。之后每个买入时点的成本都高于前一交易日收盘价,但在2020年8月市场复苏时,价格仍远低于当时的市场水平。
数据说明
- 收盘价为常规交易时段(美东时间上午9:30至下午4:00)分钟级行情数据中的最后一笔成交价;与官方集合竞价收盘价相比,可能相差几美分。
- 复苏日期仅基于价格;总回报指标将股息再投资,因此按定义会更早恢复。
- 10年期国债收益率在交易日接入美国财政部的每日序列;基点为百分点的百分之一。
- 排名面板的样本始于2003-09-10;本页所称“自2003年以来”指该时间窗口,而非所有有记录的市场历史。
上方每个面板都是基于历史行情的已存储、版本化查询。展开SQL即可查看每项指标的计算方式。想亲身感受这一天,而不是只阅读相关内容?它是Strasmore Labs交易模拟器中可玩的场景之一。