Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-08

股票跳空是否總會回補?數據揭示真相

股票跳空並不會在固定期限內一律回補。查看大型股同日、5、20與60個交易日的回補率,以及背後SQL,了解跳空幅度如何改變結果。

股票跳空是否都會回補?在任何短到足以據此交易的期間內,都不會。這個說法之所以多半能成立,只是因為沒有人說明期間。跳空是今日開盤價與昨日正常交易時段收盤價之間的距離;回補則是價格重新穿越昨日收盤價的時刻。整個爭論取決於讀者願意等待多久。

什麼才算跳空,什麼才算回補

跳空是以今日開盤價對照前一日收盤價計算。昨日交易時段以一個價格結束,今日則以另一個價格開盤,兩者之間的差距就是跳空。這不是昨日盤中最高價或最低價與今日開盤價之間的距離。後者是不同、也容易得多的目標。把兩者混為一談,就會讓「跳空」悄悄變成普通交易日午餐時間前就能收斂的現象。小幅跳空幾乎每個交易時段都會出現:其他時區的交易、指數調整、個股新聞,以及除息調整,都可能在美股市場休市期間推動合理價格變動。股票為何會在隔夜跳空說明了隔夜重新定價的來源。

回補是股票價格首次重新穿越前一日收盤價的時刻。但若沒有附帶期限,這個定義並不完整。在無限期的期間內,流動性高的股票遲早會穿越讀者指定的幾乎任何價位。這使「跳空總會回補」變得不可證偽,而不代表它為真。以下每個數字都會說明採用的期間。

全文使用同一組樣本:八檔美國大型股,涵蓋2021年1月至2026年2月的跳空日,並以正常交易時段的一分鐘最高價與最低價測試是否回補。低於0.25%的跳空因四捨五入影響而剔除。

股票跳空是否都會在同一天回補?

先看跳空幅度。將每個跳空依幅度分組,再檢視前一日收盤價是否在同一交易時段結束前再次被觸及。

查詢同一交易日缺口回補率(按缺口幅度),8檔大型股,2021年至2026年
每個數據背後的精確 SQL 語法
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
gapped AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close
    FROM sessions
),
measured AS
(
    SELECT
        abs(100 * (session_open / prior_close - 1)) AS gap_pct,
        toUInt8(if(session_open > prior_close,
                   session_low  <= prior_close,
                   session_high >= prior_close))    AS filled_same_session
    FROM gapped
    WHERE prior_close > 0
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 0.25
)
SELECT
    multiIf(gap_pct < 0.5, '0.25 to 0.5%',
            gap_pct < 1,   '0.5 to 1%',
            gap_pct < 2,   '1 to 2%',
            gap_pct < 4,   '2 to 4%',
                           '4% or more')         AS gap_bucket,
    count()                                      AS gap_days,
    round(100 * avg(filled_same_session), 1)     AS same_session_fill_pct
FROM measured
GROUP BY gap_bucket
ORDER BY min(gap_pct) ASC
Run this yourself

樣本中最小的跳空,即0.25%至0.5%,有 74.6% 的比例在同一交易時段內回補,共計 2381 次。幅度達4%或以上的跳空,只有 14.8% 的比例在同一交易時段內回補。圖表向下傾斜的部分就是主要結論:跳空越小,股票越常在當天重新穿越該價位。換句話說,小幅跳空多半是雜訊,而雜訊容易反轉。

跳空需要多久才會回補?

延長期限後,回補率只會上升。較長的觀察期間會增加回補案例,不會刪除原有案例。問題在於,總回補數中有多少發生得太晚,已無法用於交易。

查詢1%以上缺口回補比例(按等待時間)
每個數據背後的精確 SQL 語法
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
paths AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)                                                          AS prior_close,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING)   AS low_5,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING)   AS high_5,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING)  AS low_20,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING)  AS high_20,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING)  AS low_60,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING)  AS high_60
    FROM sessions
),
gaps AS
(
    SELECT
        session_open > prior_close AS gap_up,
        prior_close,
        session_low,
        session_high,
        low_5,
        high_5,
        low_20,
        high_20,
        low_60,
        high_60
    FROM paths
    WHERE prior_close > 0
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 1
),
flags AS
(
    SELECT arrayJoin([
        (1, '1 session',   toUInt8(if(gap_up, session_low <= prior_close, session_high >= prior_close))),
        (2, '5 sessions',  toUInt8(if(gap_up, low_5  <= prior_close, high_5  >= prior_close))),
        (3, '20 sessions', toUInt8(if(gap_up, low_20 <= prior_close, high_20 >= prior_close))),
        (4, '60 sessions', toUInt8(if(gap_up, low_60 <= prior_close, high_60 >= prior_close)))
    ]) AS f
    FROM gaps
)
SELECT
    tupleElement(f, 2)                        AS horizon,
    count()                                   AS gaps_measured,
    round(100 * avg(tupleElement(f, 3)), 1)   AS filled_pct
FROM flags
GROUP BY horizon
ORDER BY min(tupleElement(f, 1)) ASC
Run this yourself

2191 個幅度達1%或以上的跳空中,34% 個在同一交易時段內回補,88.7% 個在 60 sessions 內回補。後一個數字通常會被引用,但引用時省略了觀察期間。60個交易時段約等於三個交易月。對一個建立在單日失衡上的部位而言,這是很長的持有期間。如果股票先大幅朝另一方向移動,直到第47個交易日才回補,仍會被這項統計視為已回補。

雜訊型跳空與資訊型跳空是兩個不同群體

在交易清淡、成交量正常的日子裡,跳空通常只是小幅價格調整。財報消息或收購提議引發的跳空,則代表公司價值發生變化,市場不再有一個必然回歸的舊價格。成交量可以相當有效地區分兩者:如果是整個市場都想交易的重新定價,成交筆數通常會遠高於正常水準。

查詢缺口回補率(按缺口日成交量多寡)
每個數據背後的精確 SQL 語法
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low,
        sum(toFloat64(volume))                               AS session_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
paths AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        session_volume,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)                                                         AS prior_close,
        avg(session_volume) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN 21 PRECEDING AND 2 PRECEDING) AS normal_volume,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING) AS low_20,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING) AS high_20
    FROM sessions
),
measured AS
(
    SELECT
        session_volume / normal_volume AS volume_ratio,
        toUInt8(if(session_open > prior_close, session_low <= prior_close, session_high >= prior_close)) AS filled_same_session,
        toUInt8(if(session_open > prior_close, low_20 <= prior_close, high_20 >= prior_close))           AS filled_20_sessions
    FROM paths
    WHERE prior_close > 0
      AND normal_volume > 0
      AND d >= toDate('2021-03-01')
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 1
)
SELECT
    multiIf(volume_ratio < 1.5, 'Under 1.5x normal',
            volume_ratio < 3,   '1.5x to 3x normal',
                                '3x or more')        AS volume_regime,
    count()                                          AS gap_days,
    round(100 * avg(filled_same_session), 1)         AS same_session_fill_pct,
    round(100 * avg(filled_20_sessions), 1)          AS within_20_sessions_fill_pct
FROM measured
WHERE isFinite(volume_ratio)
GROUP BY volume_regime
ORDER BY min(volume_ratio) ASC
Run this yourself

在成交量低於股票正常成交量1.5倍的情況下,幅度達1%或以上的跳空,有 35.9% 的比例在同一交易時段內回補。成交量達正常水準三倍或以上的同幅度跳空,有 15.3% 的比例在同一交易時段內回補,且其中 45.8% 在20個交易時段內回補,共計 59 個案例。高成交量群體包含財報跳空與交易消息跳空。將兩個群體平均成一個數字,無法準確描述任何一方。

為何交易時段開盤前幾分鐘會扭曲跳空統計

在上午9:31記錄的回補,可靠性很低。開盤價來自集合競價,也就是將隔夜排隊的所有委託集中撮合,並以單一價格成交的交易。開盤集合競價說明了相關機制。撮合後幾分鐘內,報價價差通常處於當日最寬,單筆小額成交就可能形成一個幾乎沒有實際交易量支撐的最高價或最低價。開盤時價差會擴大說明了開盤報價為何如此稀疏。

下方圖表顯示該籃子股票自身成交紀錄的型態:截至2025年,按每15分鐘時段計算的一分鐘平均高低價區間,單位為基點(一個基點是百分之一個百分點)。

查詢2025年各時段平均1分鐘波動區間與成交量
每個數據背後的精確 SQL 語法
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
    round(10000 * avg(toFloat64(high) / toFloat64(low) - 1), 1) AS avg_range_bps,
    round(avg(toFloat64(volume)) / 1000, 1)                     AS avg_volume_k
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
  AND window_start >= '2025-01-01'
  AND window_start <  '2026-01-01'
  AND toFloat64(low) > 0
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY et_time
ORDER BY et_time ASC
Run this yourself

開盤時段每分鐘平均區間為 24.4 個基點;相較之下,12:30 時段為 6.9 個基點。兩者每分鐘成交量分別為 303.9 千股與 69.6 千股。在第一個時段內記錄的回補,建立在當日最不可靠的價格上方。上文的同日回補數字包含這些分鐘,因此略微偏高。這項限制適用於所有同日回補統計,包括本項統計。

將跳空視為交易前應檢查什麼

  1. 觀察期間。沒有截止期限的回補率,不算統計數字。
  2. 樣本群體。是否將新聞跳空與清淡交易日的跳空分開,以及分界線如何設定。
  3. 衡量方式。是否以實際成交區間測試回補,以及是否計入交易時段開盤前幾分鐘。
  4. 存續偏誤。樣本是否只保留目前仍在交易的股票,因而悄悄刪除從未回補的跳空。

較誠實的說法比口號更窄。正常成交量下的小幅跳空,通常會快速反轉。高成交量下的大幅跳空,屬於重新定價,往往會持續數月。若要即時查看哪些個股正在跳空,本週漲跌幅最大的股票頁面會追蹤當週行情;市場如何從崩盤中復甦則將相同的期間紀律應用於指數跌幅。

常見問題

股票跳空是否都會回補?

不會。在此樣本中,幅度達1%或以上的跳空,只有 88.7% 在 60 sessions 內重新穿越前一日收盤價。這表示約三個交易月後,仍有相當比例尚未回補。「總會」這種說法只有在不設定時間限制時才成立,但那時便無法進行檢驗。

跳空需要多久才會回補?

取決於跳空類型。在此樣本中,幅度達1%或以上的跳空,有 34% 在同一交易時段內回補,其餘回補則分散在接下來數週與數月。小幅跳空多集中在同日回補;高成交量跳空的回補速度最慢。

普通跳空與突破跳空有何不同?

圖表術語會依背景區分跳空。普通跳空發生在成交量正常、沒有特定新聞的交易日;突破跳空則伴隨新資訊與高成交量,且股票通常會脫離維持一段時間的價格區間。上方面板的成交量分組,正是對這項區分的可量化呈現。

為何不同來源的跳空回補統計差異很大?

四項選擇會大幅改變數字:回補觀察期間、股票樣本、涵蓋的時期,以及跳空是以前一日收盤價,還是以前一日最高價與最低價計算。缺少其中任何一項的回補率,都無法與另一項統計直接比較。


這些數字的計算方式

交易時段由紐約時間正常交易時段內的一分鐘 K 線組成。開盤價是正常交易時段第一根 K 線的開盤價,收盤價是最後一根 K 線的收盤價,當日最高價與最低價則是這些 K 線中的極值。每個跳空都以同一 ticker 前一交易時段的收盤價為基準計算。

5、20與60個交易時段的觀察期間都包含跳空當天。跳空日截至2026年2月底,市場成交紀錄則延續至2026年6月。因此,期間面板中的每個跳空都至少有60個後續交易時段可供觀察,不會因資料不足而被判定為未回補。

第三個面板中的正常成交量,是跳空日前兩天結束時往前計算20個交易時段的正常交易時段平均成交量。這樣可以排除跳空日及前一日,避免它們進入自身的基準值。

樣本是八檔流動性高的大型股。流動性較低的股票更常出現跳空,回補方式也不同。因此,若未對小型股重新執行相同測試,這些回補率不應直接套用。

本頁每個面板下方都附有完整 SQL。若要對你關注的 ticker 執行相同測試,請在 Strasmore terminal 以自然語言提出問題。

#gaps#gap fill#opening auction#overnight returns#technical analysis