Strasmore Research
심층 분석 Matt Connor작성자 Matt Connor · 업데이트됨 2026-07-24

2022년 2월 24일 러시아 우크라이나 전쟁

러시아의 우크라이나 침공과 미국 주식 시장의 급변동을 분석합니다. 지수 반등과 유가 및 금 가격의 변화를 상세히 확인하십시오.

2022년 2월 24일 새벽, 러시아가 우크라이나를 전면 침공했습니다. 이로 인해 미국 주식 시장은 지난 10년 중 가장 심도 있게 연구된 거래일 중 하나를 기록했습니다. 야간 거래에서 지수 선물은 급락했습니다. Nasdaq-100 ETF인 QQQ는 -3.2% 하락하며 개장했으나, 최종적으로는 +3.4%로 마감했습니다. 이 페이지는 해당 사건의 전 과정을 기록합니다. 분 단위의 반전 상황, S&P 500과 Dow Jones 산업평균지수의 움직임, 그리고 유가, 금, 방산주, 국채 및 변동성 지수의 추이를 다룹니다. 또한 그 이후 몇 주간의 시장 상황도 포함합니다. 모든 수치는 저장된 쿼리(query)를 기반으로 합니다. SQL 코드를 확인하려면 각 패널을 확장하십시오.

개장 전: 밤사이 진행 상황

침공은 갑작스럽게 발생한 것이 아닙니다. 2021년 말부터 2022년 초까지 러시아는 우크라이나 국경 인근에 군대를 집결시켰습니다. 당시 서방의 추정치는 100,000명(십만 명)을 훨씬 상회했습니다. 시장은 수 주 동안 이러한 리스크를 반영하며 거래되었습니다. 2월 21일 월요일, 모스크바는 우크라이나 동부의 분리주의 공화국 두 곳을 승인했습니다. 미국 시장은 워싱턴 탄생일(Washington's Birthday) 공휴일로 인해 휴장했습니다. 이 소식을 가격에 반영할 수 있었던 첫 거래 세션은 22일 화요일이었으며, 하락세를 보였습니다. 같은 화요일에 서방의 1차 제재가 시행되었고, 독일은 Nord Stream 2 파이프라인 인증을 중단했습니다.

이후 2월 24일 목요일 모스크바 시간 오전 6시 직전(뉴욕 시간 수요일 오후 10시경), 러시아 대통령이 작전을 발표했습니다. 한 시간 이내에 우크라이나 전역의 도시에서 폭발이 보고되었습니다. 야간 거래가 이루어지는 미국 지수 선물은 즉각적으로 매도세가 나타났습니다. 일출 무렵 유일한 의문점은 오전 9시 30분의 개장 경매 가격이 수요일 종가보다 얼마나 더 낮게 형성될 것인가 하는 점뿐이었습니다.

하루의 흐름 요약

한 줄에 모든 답변이 담겨 있습니다. 전일 종가, 갭, 저가, 고가, 종가 및 거래량입니다:

조회2022년 2월 24일 QQQ — 침공 당일의 반전, 기록됨
모든 수치 뒤에 숨겨진 정확한 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.2609:30 ET — 개장 직후 — 전일 종가 대비 -3.4% 하락하며 기록되었습니다. 해당 저점 형성 이후 QQQ는 6시간 반 동안 상승하여 $340.65로 마감했습니다. 이는 당일 3.4% 상승이며, 128 백만 주 거래량 기준 저점 대비 종가까지 7%의 변동폭을 기록한 것입니다. 종가는 장 마감 직전 하락하지 않았습니다. 세션 고가인 $341.04보다 단 0.11% 낮은 수준에서 마감하며 사실상 당일 최고점 부근에서 거래를 마쳤습니다. 개장 첫 1분 이내에 매도한 투자자는 세션 최저점인 0.18% 이내에서 매도한 셈입니다. 실제 최저점은 개장 경매 시점이 아닌, 경매 직후에 형성되었습니다 (경매 가격은 $318.84였으며, 실제 저가는 $318.26였습니다).

구간별 반전 양상

30분 단위 구간은 상승 곡선의 형태를 보여줍니다:

조회30분 단위 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 ETF(Exchange Traded Fund, 상장지수펀드) 구간은 11:30 종가인 $330.29보다 낮은 $328.03에 마감되었습니다. 하지만 추세가 반전되지는 않았으며, 마지막 구간은 표의 최상단인 $340.65로 마감되었습니다. 거래량은 일반적인 U자형 패턴을 보였습니다. 점심 시간대 약 4.7 million 주를 기록한 것에 비해, 개장 후 첫 30분 동안은 18.6 million 주, 마지막 30분 동안은 15 million 주가 거래되었습니다. 이는 2011년의 계단식 하락과 대칭을 이룹니다. 이러한 거래 세션은 "침공으로 인해 시장이 하락했다"는 식의 회고가 왜 오해를 불러일으키는지 보여줍니다. 선물(futures)은 밤사이 하락했지만, 현물 세션(cash session)은 첫 1분부터 반등했습니다. 투자자가 경험하는 방향은 주문이 도달한 시점에 따라 완전히 달라집니다. Overnight gaps(장전 갭) 테마는 이보다 더 조용한 주간의 수치를 측정합니다.

Nasdaq뿐만이 아니다: 시장 전체의 반전

단일 지수만으로는 성장주만의 특이 현상인지, 아니면 시장 전체의 반전인지에 대한 의문이 남습니다. 아래 표는 11개의 티커(ticker)를 하나의 기준으로 비교합니다. 3개의 주요 지수 ETF(Exchange Traded Fund)와 지정학적 충격 시 대응하는 자산인 에너지, 금, 장기 국채, 변동성 ETF, 그리고 4개의 방산주를 포함합니다.

조회2022년 2월 24일 11개 티커(ticker) — 갭(gap), 장중 극값, 종가(전일 종가 대비 %)
모든 수치 뒤에 숨겨진 정확한 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)

반전은 시장 전체에서 나타났으나, 그 규모가 오전의 갭(gap) 크기를 그대로 반영하지는 않았습니다. QQQ는 개장 시 -3.2%만큼 갭 하락했으나 종가는 +3.4%로 마감했습니다. SPY와 DIA도 거의 비슷한 수준인 각각 -2.6%와 -2.6%만큼 갭 하락했습니다. 그러나 SPY는 +1.5%로 마감한 반면, DIA는 +0.3%로 간신히 상승 마감했습니다. 성장주 비중이 높은 지수가 가장 큰 반전을 보였고, 산업주 비중이 높은 Dow는 가장 적은 반전을 보였습니다. SPY와 DIA의 차이는 갭의 크기가 아니라 구성 종목에서 비롯되었습니다.

자금 흐름: 석유, 금, 방산, 변동성

동일한 패널의 하단 행인 "전쟁 관련 거래"를 확인하십시오. 에너지 섹터는 고가에서 시작했으나 하락하며 마감했습니다. XLE는 +2.1% 갭 상승으로 시작했으나, 장중 전일 종가 대비 -3.4%까지 하락하며 -0.9%으로 마감했습니다. 금 또한 동일한 흐름을 보였습니다. GLD는 +2.4%로 시작하여 -0.6%로 마감했습니다. 변동성 지수(VIX)의 가장 근접한 거래 대용치인 단기 VIX 선물 보유 ETF인 VIXY는 개장 시 +11.1% 갭 상승을 기록했으나, 전일 종가보다 낮은 -3%로 마감했습니다. 전형적인 공포 자산들은 헤드라인 뉴스가 가장 좋지 않았던 시점에 정점을 찍었으며, 주식 시장이 회복됨에 따라 하락했습니다. 즉, 주식 시장의 반전이 거꾸로 나타난 것입니다.

방산 업체들은 유일하게 상승세를 유지했습니다. 네 기업 모두 상승 마감했습니다. LMT +1.7%, NOC +2.4%, RTX +2.1%, GD +1.1%를 기록했습니다. Northrop Grumman은 장중 한 번도 수요일 종가 아래로 내려가지 않았으며(장중 저가는 +1%), 네 기업 중 유일하게 하락세를 보이지 않았습니다.

국채: 안전 자산 수요는 뒤늦게 나타났다

국채 수익률 하락은 채권 가격의 상승을 의미하며, 이는 전형적인 안전 자산(safe-haven)으로의 자금 유입을 나타냅니다. 침공 당일 종가 기준으로는 이러한 자금 유입이 거의 관찰되지 않았습니다:

조회2년 및 10년 국채(Treasury) 수익률, 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.99%보다 약간 낮은 1.96%로 마감했습니다. 실제 자금 유입은 그다음 주에 발생했습니다. 2022-03-01까지 10년물 수익률은 해당 기간 중 가장 낮은 수준인 1.72%을 기록했으며, 2년물 수익률은 같은 기간 동안 1.58%에서 1.31%로 하락했습니다. 상단 패널에 표시된 장기 국채 ETF인 TLT도 동일한 흐름을 보여주었습니다. 장중 개장 시 +1.8%의 갭 상승을 보였으나, 종가에는 +0.2%로 하락하며 상승 폭을 반납했습니다.

관련 기간 분석

3주간의 일일 종가는 반전의 맥락을 보여주며, 해당 추세가 유지되었는지 여부를 조용히 결정합니다:

조회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는 침공 당일 아침 첫 1분간 발생한 $318.26 패닉 저점보다 낮은 가격으로 종가를 형성했습니다. 해당 3월 저점 종가인 $318.21는 침공 당일 종가보다 -6.6% 낮았습니다. 하락세는 계속되었습니다. 2022-12-28까지 QQQ는 침공 당일 종가보다 -23.7% 낮은 $260.02에 종가를 형성했습니다. 2월 24일의 반전은 실질적이고 격렬했으며 국지적이었습니다. 2022년의 방향을 결정한 것은 전쟁이 아니라 금리 인상 주기였습니다. 이는 2020년 3월 폭락이 반대 방향으로 보여주었던 교훈과 동일합니다.

이 정도 규모의 반전은 얼마나 드문가?

2003년부터 2025년 말까지 모든 QQQ 세션을 분석한 결과, 장중 가격이 전일 종가보다 최소 3% 하락했음에도 불구하고 종가는 전일 대비 최소 1% 상승하며 마감한 세션은 정확히 2회였습니다.

조회2003년 이후 QQQ 세션: 장중 저점 ≤ −3% (전일 종가 대비) 및 종가 ≥ +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입니다. 이는 예상보다 높은 인플레이션 보고서가 발표된 후 한 시간 뒤에 시작된 세션으로, 또 다른 '갭 하락 후 양봉 마감(gap-down-close-green)' 사례입니다. 침공 당일의 반전이 두 사례 중 더 규모가 컸습니다. 이는 5.7% 대비 7%의 저점 대비 종가 변동폭을 기록했습니다. 23년 동안의 기록 중 두 사례 모두 같은 해에 발생했습니다.

오늘의 교훈

이 시장 흐름에는 세 가지 지속적인 메커니즘이 존재합니다. 첫째, 널리 예상되는 이벤트가 발생할 때쯤에는 이미 포지션 구축이 완료된 경우가 많습니다. 침공 전 두 번의 하락 세션이 이미 그 기대감을 반영했습니다. 둘째, 시가 경매는 밤사이 축적된 공포가 단일 가격에 해소되는 구간이며, 이 가격은 당일의 상단 또는 하단 극점이 될 수 있습니다. 셋째, 급격한 일일 반전은 다음 분기의 방향이 아닌 해당일의 자금 흐름을 나타냅니다. 실제로 이 세션 이후 몇 주 동안 시장은 신저가를 기록했습니다. 이벤트가 발생하는 날에는 시장의 메커니즘을 이해하는 것이 중요하며, 특정 세션의 형태를 전체적인 추세와 혼동해서는 안 됩니다.

거래량 세부 사항은 시장 참여자의 움직임을 확인시켜 줍니다. 128.5 million(백만) 주의 거래량은 위 3주간의 표에서 가장 높은 거래량을 기록했습니다. 저점에서 종가까지 상승하며 대량 거래가 발생했다는 것은 매수세가 실제 매도세를 압도하는 실질적인 규모였음을 의미하며, 이는 거래량이 없는 상태에서의 단순한 흐름이 아니었습니다. 확신에 찬 거래량이 패닉의 전환점을 나타냈던 2020년 3월 24일의 반등 사례와 비교해 보십시오. 그리고 다음 세션에서 힘이 빠지는 거래량 빈약한 반등일과는 대조를 이룹니다.

Invasion day FAQ

What did the stock market do when Russia invaded Ukraine?

On the day itself — February 24, 2022 — the Nasdaq-100 ETF QQQ opened -3.2% down with its low in the opening minute, then climbed all session to close +3.4%. The S&P 500 ETF SPY closed +1.5% and the Dow ETF DIA +0.3%.

Why did stocks go up when Russia invaded Ukraine?

This page doesn't assign motives; the tape records the sequence — heavy selling pressure was fully expressed at the 9:30 open, and buying dominated every subsequent hour. The falling-on-threat, rallying-on-event pattern has many historical parallels.

What did oil and gold do when Russia invaded Ukraine?

Both spiked at the open and faded: the energy ETF XLE gapped +2.1% and closed -0.9%, and the gold ETF GLD gapped +2.4% and closed -0.6%. Defense stocks held their gains: all four majors in the panel above closed green.

Did the rally after the invasion last?

No. QQQ closed below its invasion-day panic low 18 calendar days later, on 2022-03-14, and by its 2022 low on 2022-12-28 it stood -23.7% below the invasion-day close.

How rare is a reversal like February 24, 2022?

Very. From 2003 through the end of 2025, only 2 QQQ sessions traded 3% or more below the prior close intraday and still closed at least 1% higher — this one, and 2022-10-13.


Every panel above is a stored, versioned query over the historical tape — expand the SQL to see each measurement. Want to feel this day instead of reading it? It is one of the playable scenarios in the Strasmore Labs trading simulator.

#market history#geopolitics#reversals#qqq