Strasmore Research
深度研究 Matt Connor作者: Matt Connor · 更新于 2026-07-23

2022年2月24日俄乌冲突股市行情

回顾俄罗斯入侵乌克兰当日美股行情,解析QQQ等指数如何从大幅跳空低开转为收涨,并深度复盘油金及国防股走势。

2022年2月24日凌晨,俄罗斯全面入侵乌克兰。美国股市经历了十年间最受关注的交易日之一。隔夜指数期货大幅下跌,Nasdaq-100 ETF QQQ 开盘下跌 -3.2%,最终收涨 3.4%。本页面记录了整个事件:逐分钟的行情反转、S&P 500 与道琼斯指数的表现、石油、黄金、国防股、国债及波动率的走势,以及随后几周的市场情况。所有数据均可进行查询;点击任何面板即可查看对应的 SQL 语句。

开盘前:局势如何演变

入侵并非突如其来。2021年底至2022年初,俄罗斯在乌克兰边境集结了大量部队——当时的西方估计人数远超10万——市场已连续数周在交易此类风险。2月21日星期一,莫斯科承认了乌克兰东部的两个自称独立的共和国;由于正值华盛顿诞辰假期,美国市场处于休市状态,直到22日星期二才迎来首个消化该消息的交易日,且当日股市走低。同日,首轮西方制裁出台,德国也停止了对 Nord Stream 2 管道的认证。

随后,在莫斯科时间2月24日星期四凌晨6点前(约纽约时间周三晚上10点),俄罗斯总统宣布开展行动,随后一小时内乌克兰各城市便传出爆炸声。进行夜盘交易的美国股指期货立即遭到抛售。到日出时分,市场唯一的悬念是 9:30 a.m. 的 开盘竞价 会比周三收盘价低多少。

当日行情概览

单行数据涵盖所有关键指标:前收盘价、缺口、最低价、最高价、收盘价及成交量:

查询QQQ 2022年2月24日 — 侵略日反转,已记录
每个数字背后的完整 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 = 'QQQ'
          AND window_start >= toDateTime('2022-02-23 00:00:00') AND window_start < toDateTime('2022-02-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(argMaxIf(close, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) / minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS trough_to_close_pct,
    round((maxIf(toFloat64(high), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / toFloat64(argMaxIf(close, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) - 1) * 100, 2) AS close_to_high_pct,
    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)) / minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 2) AS open_above_low_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 = 'QQQ'
  AND window_start >= toDateTime('2022-02-24 04:00:00') AND window_start < toDateTime('2022-02-24 23:59:00')

核心参考数据:当日最低价为 $318.26,出现在 09:30 ET — 开盘首分钟 — 较前收盘价低 -3.4%。自该点位起,QQQ 持续上涨六个半小时,最终收于 $340.65:当日涨幅 3.4%。在 128 百万股的成交量下,从最低点到收盘的振幅为 7%。收盘并未出现尾盘回落:收盘价仅比当日最高价 $341.040.11,意味着当日基本在最高点附近结束。任何在开盘首分钟卖出的投资者,其卖出价格与当日最低价的差距仅为 0.18% —— 实际最低点出现在开盘集合竞价后的片刻,而非竞价瞬间(竞价价格为 $318.84;最低价为 $318.26)。

逐个时间段的逆转

半小时时间段展示了上涨走势:

查询QQQ 半小时线 — 2022年2月24日常规交易时段
每个数字背后的完整 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 = 'QQQ'
  AND window_start >= toDateTime('2022-02-24 04:00:00') AND window_start < toDateTime('2022-02-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

上涨过程并非完全平稳 —— 12:00 ET 时间段收于 $328.03,低于 11:30 的收盘价 $330.29 —— 但趋势从未发生实质性逆转,最后一个时间段收于 $340.65,处于图表顶部。成交量呈现典型的 U 型:开盘前半小时为 18.6 百万股,最后半小时为 15 百万股,而午间成交量约为 4.7 百万股。这与 2011 年的阶梯式下跌 正好相反。此类交易日解释了为何“市场因入侵而下跌”的说法具有误导性:期货在隔夜下跌;而现货交易时段从第一分钟起就开始反弹。您的实际体验完全取决于订单成交的时间 —— 隔夜缺口 衡量的是更平稳交易周期的主题。

不仅仅是纳斯达克:全市场出现反转

仅关注单一指数会留下一个显而易见的问题:这是成长股的异常波动,还是全市场的反转?下表通过统一标准对十一个代码进行了衡量——包括三大指数 ETF,以及地缘政治冲击下常见的资产:能源、黄金、长期国债、波动率 ETF 以及四家国防承包商。

查询11只标的 2022年2月24日 — 跳空、日内极值、收盘价 (% vs 前一交易日)
每个数字背后的完整 SQL
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    round((rth_open / prior_close - 1) * 100, 1) AS gap_pct,
    round((rth_low / prior_close - 1) * 100, 1) AS low_vs_prior_pct,
    round((rth_high / prior_close - 1) * 100, 1) AS high_vs_prior_pct,
    round((rth_close / prior_close - 1) * 100, 1) AS day_change_pct
FROM (
    SELECT
        ticker,
        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('2022-02-23')) AS prior_close,
        argMinIf(toFloat64(open), 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('2022-02-24')) AS rth_open,
        minIf(toFloat64(low), (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('2022-02-24')) AS rth_low,
        maxIf(toFloat64(high), (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('2022-02-24')) AS rth_high,
        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('2022-02-24')) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('QQQ', 'SPY', 'DIA', 'XLE', 'GLD', 'TLT', 'VIXY', 'LMT', 'NOC', 'RTX', 'GD')
      AND window_start >= toDateTime('2022-02-23 00:00:00') AND window_start < toDateTime('2022-02-24 23:59:00')
    GROUP BY ticker
)
ORDER BY indexOf(['QQQ', 'SPY', 'DIA', 'XLE', 'GLD', 'TLT', 'VIXY', 'LMT', 'NOC', 'RTX', 'GD'], ticker)

市场反转是全方位的,但其幅度并不完全取决于早盘跳空的程度:QQQ 开盘跳空 -3.2%,收盘上涨 3.4%。SPY 和 DIA 的跳空幅度几乎相同——分别为 -2.6% 和 -2.6%——但 SPY 收盘上涨 1.5%,而 DIA 仅微涨 0.3%。权重偏向成长股的指数反转幅度最大;权重偏向工业股的道指反转幅度最小。SPY 与 DIA 的差异在于成分股构成,而非跳空幅度。

资金流向:石油、黄金、国防与波动率

请查看同一面板的下行部分——即“战争交易”。能源板块开盘走高,随后收跌:XLE 跳空上涨 +2.1%,盘中一度跌至较前一交易日低 -3.4%,最终收于 -0.9%。黄金经历了同样的走势:GLD 开盘上涨 +2.4%,收盘报 -0.6%。VIXY(持有短期 VIX 期货的 ETF,是波动率指数最接近的交易工具)开盘跳空上涨 +11.1%,收盘报 -3%,低于前一交易日收盘价。典型的避险资产在新闻最负面时达到峰值,并随股市回升而走低:股市反转,避险资产反向。

国防承包商是少数维持涨势的板块。四家公司均收涨:LMT +1.7%、NOC +2.4%、RTX +2.1%、GD +1.1%。其中,Northrop Grumman 全天未曾跌破周三收盘价(其盘中最低价为 +1%),是四家公司中唯一未出现跌幅的标的。

国债:避险买盘出现较晚

国债收益率下跌意味着债券价格上涨,这是典型的避险资金流向。在入侵发生当天,收盘时的这种资金流向并不明显:

查询2年期与10年期国债收益率, 2022年2月18日 – 3月8日 (%)
每个数字背后的完整 SQL
SELECT
    toString(date) AS session,
    round(yield_2_year, 2) AS yield_2_year,
    round(yield_10_year, 2) AS yield_10_year
FROM global_markets.treasury_yields
WHERE date BETWEEN '2022-02-18' AND '2022-03-08'
ORDER BY date

2月24日,10年期国债收益率收于 1.96%,略低于前一天的 1.99%。真正的避险潮出现在次周:到 2022-03-01 时,10年期收益率降至 1.72%,为该期间的最低收盘水平;同期,2年期收益率从 1.58% 降至 1.31%。上方图表中的长期国债 ETF (TLT) 也反映了类似的日内走势:开盘跳空上涨 1.8%,但收盘时涨幅收窄至 0.2%。

相关交易日

连续三周的收盘数据反映了反转的背景,并能静默地验证其是否企稳:

查询QQQ 日线收盘价, 2022年2月22日 – 3月14日
每个数字背后的完整 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 = 'QQQ'
          AND window_start >= toDateTime('2022-02-18 00:00:00') AND window_start < toDateTime('2022-03-15 23:59:00')
        GROUP BY et_date
    )
)
WHERE et_date >= toDate('2022-02-22') AND et_date <= toDate('2022-03-14')
ORDER BY et_date

由于局势升级占据头条,入侵发生的交易日呈现下跌态势(2月22日至23日的 -1-2.6)。入侵当日收涨 3.4%,次日继续上涨 1.5%。市场在“威胁”下下跌,在“事件”发生时反弹,这种模式早已被华尔街谚语所总结,而这段行情记录是其最清晰的现代例证。但请继续观察数据表:2022-03-14 当收于 $318.21,低于入侵当日早盘恐慌抛售时的价格。

反弹维持住了吗?

没有——事实证明了这一点:

查询反转之后:QQQ 跌破侵略日低点的时间及跌幅
每个数字背后的完整 SQL
WITH
    daily AS (
        SELECT
            toDate(toTimeZone(window_start, 'America/New_York')) AS d,
            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 c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'QQQ'
          AND window_start >= toDateTime('2022-02-24 04:00:00') AND window_start < toDateTime('2023-01-01 00:00:00')
        GROUP BY d
    ),
    (SELECT c FROM daily WHERE d = toDate('2022-02-24')) AS invasion_close,
    (
        SELECT round(minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'QQQ'
          AND window_start >= toDateTime('2022-02-24 04:00:00') AND window_start < toDateTime('2022-02-24 23:59:00')
    ) AS invasion_low
SELECT
    invasion_close,
    invasion_low,
    toString(minIf(d, c < invasion_low AND d > toDate('2022-02-24'))) AS first_close_below_invasion_low,
    dateDiff('day', toDate('2022-02-24'), minIf(d, c < invasion_low AND d > toDate('2022-02-24'))) AS calendar_days_to_new_low,
    round(minIf(c, d BETWEEN toDate('2022-02-25') AND toDate('2022-03-31')), 2) AS march_low_close,
    toString(argMinIf(d, (c, d), d BETWEEN toDate('2022-02-25') AND toDate('2022-03-31'))) AS march_low_date,
    round((minIf(c, d BETWEEN toDate('2022-02-25') AND toDate('2022-03-31')) / invasion_close - 1) * 100, 1) AS march_low_vs_invasion_close_pct,
    round(minIf(c, d > toDate('2022-02-24')), 2) AS year_low_close,
    toString(argMinIf(d, (c, d), d > toDate('2022-02-24'))) AS year_low_date,
    round((minIf(c, d > toDate('2022-02-24')) / invasion_close - 1) * 100, 1) AS year_low_vs_invasion_close_pct
FROM daily

在入侵发生 18 个日历日后的 2022-03-14,QQQ 的收盘价跌破了入侵当天开盘首分钟的 318.26 恐慌低点。该 3 月低点收盘价为 $318.21,比入侵当日的收盘价低 -6.6%。随后行情持续走低:到 2022-12-28,QQQ 收盘价为 $260.02,比入侵当日收盘价低 -23.7%。2 月 24 日的反转是真实、剧烈且局部的。决定 2022 年走势的是加息周期而非战争,这与 2020 年 3 月崩盘 所展示的相反教训如出一辙。

如此规模的反转有多罕见?

通过对 2003 年至 2025 年底的所有 QQQ 交易日进行扫描,发现仅有 2 个交易日出现了以下情况:日内跌幅至少达到前一交易日收盘价的 3%,但最终收盘仍高于前一交易日收盘价至少 1%:

查询2003年以来 QQQ 交易时段:日内低点 ≤ −3% (vs 前一交易日) 且收盘价 ≥ +1%
每个数字背后的完整 SQL
SELECT
    toString(d) AS session,
    low_vs_prior_pct,
    close_vs_prior_pct,
    trough_to_close_pct
FROM (
    SELECT
        d,
        round((lo / prev_c - 1) * 100, 1) AS low_vs_prior_pct,
        round((c / prev_c - 1) * 100, 1) AS close_vs_prior_pct,
        round((c / lo - 1) * 100, 1) AS trough_to_close_pct
    FROM (
        SELECT d, c, lo,
               lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_c
        FROM (
            SELECT
                toDate(toTimeZone(window_start, 'America/New_York')) AS d,
                argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS c,
                minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS lo
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'QQQ'
              AND window_start >= toDateTime('2003-01-01 00:00:00') AND window_start < toDateTime('2026-01-01 00:00:00')
            GROUP BY d
        )
    )
    WHERE prev_c > 0 AND isFinite(prev_c)
)
WHERE low_vs_prior_pct <= -3 AND close_vs_prior_pct >= 1
ORDER BY session

2022 年 2 月 24 日便是其中之一。另一个案例是 2022-10-13 —— 在通胀报告高于预期后一小时开盘,随后出现“跳空低开并收阳线”的情况。入侵日的反转幅度更大:相对于 5.7%,其从最低点到收盘的波动幅度达到 7%。在 23 年的历史数据中,这两个案例都发生在同一年。

今日的启示

盘面揭示了三个持久的市场机制。首先:在重大事件发生前,仓位布局往往已经完成——入侵事件前的两个交易日已反映了市场预期。其次:开盘竞价是消化隔夜恐慌并形成单一价格的过程,该价格可能成为当日的最高或最低点。第三:剧烈的单日反转反映的是当日资金流向,而非下一季度的趋势——事实上,该交易日后的几周内价格持续走低。在事件交易日,了解市场机制能带来回报;若将单日走势误判为长期趋势,则会遭受惩罚。

成交量细节证实了市场参与者的行为:128.5 百万股的成交量使其成为上述三周统计中最活跃的交易日。在底部反转并收涨的过程中伴随巨量,意味着这是真实买盘与真实卖盘的交锋,而非无量阴跌后的虚假反弹。请参考 2020年3月24日的反弹,当时的放量同样标志着恐慌的转折;与之相对的是那些成交稀疏、随后便会回落的弱势反弹。

侵略日常见问题解答

俄罗斯入侵乌克兰时股市表现如何?

在 2022 年 2 月 24 日当天,Nasdaq-100 ETF QQQ 在开盘首分钟触及低点,跌幅为 -3.2%,随后全天走高,收涨 3.4%。S&P 500 ETF SPY 收涨 1.5%,Dow ETF DIA 收涨 0.3%。

为什么俄罗斯入侵乌克兰时股价反而上涨?

本页面不推测动机;仅记录交易序列——开盘时(9:30)出现了剧烈的抛售压力,但随后的每小时均由买盘主导。这种“因威胁而下跌,因事件而反弹”的模式在历史上屡见不鲜。

俄罗斯入侵乌克兰时石油和黄金表现如何?

两者均在开盘时飙升后回落:能源 ETF XLE 跳空上涨 2.1%,收盘涨 -0.9%;黄金 ETF GLD 跳空上涨 2.4%,收盘涨 -0.6%。国防股维持了涨幅:上述板块中的四家主要公司均收涨。

侵略后的反弹持续了吗?

没有。2022-03-14 日(即侵略发生 18 个日历日后),QQQ 收盘价跌破了侵略当日的恐慌低点 18。到 2022-12-28 日触及 2022 年低点时,其价格较侵略当日收盘价下跌了 -23.7%。

像 2022 年 2 月 24 日这样的反转有多罕见?

非常罕见。从 2003 年到 2025 年底,QQQ 仅有 2 个交易日出现了盘中跌幅超过 3% 但最终收涨至少 1% 的情况——本次反转即是其中之一,另外还有 2022-10-13


上述所有图表均为基于历史行情数据的存储版本化查询——您可以展开 SQL 语句查看各项指标。想亲身体验这一天的行情而非阅读文字?您可以在 Strasmore Labs 交易模拟器 中体验该场景。

#market history#geopolitics#reversals#qqq