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

Laging Napupunan ba ang Stock Gaps? Datos

Laging napupunan ba ang stock gaps? Hindi sa tiyak na horizon. Tingnan ang fill rates sa parehong session, 5, 20 at 60 session para sa large caps, kasama ang SQL.

Laging napupunan ba ang stock gaps? Hindi sa loob ng anumang sapat na maikling horizon para ma-trade ito, at nananatili lamang ang claim kapag walang nagsasabi kung gaano katagal ang paghihintay. Ang gap ay ang pagitan ng opening price ngayon at regular-session close kahapon; ang fill ay ang sandaling muling nag-trade ang presyo lampas sa naunang close. Nakasalalay ang buong argumento sa kung gaano katagal handang maghintay ang mambabasa.

Ano ang itinuturing na gap, at ano ang itinuturing na fill

Sinusukat ang gap mula sa open kumpara sa naunang close. Nagtapos ang session kahapon sa isang presyo, at nagbukas ngayon sa iba; ang diperensiya ang gap. Hindi ito ang pagitan mula sa intraday high o low kahapon. Ibang target iyon at mas madaling maabot. Kapag pinagpalit ang dalawang depinisyon, nagiging isang “gap” ang bagay na tahimik na nagsasara bago magtanghali sa karaniwang araw. Lumilitaw ang maliliit na gap sa halos bawat session: binabago ng trading sa ibang time zone, index changes, single-name news, at ex-dividend adjustments ang fair price habang sarado ang US market. Sinasaklaw ng Bakit nagkakaroon ng overnight gap ang stocks kung saan nanggagaling ang overnight repricing na iyon.

Ang fill ay ang unang sandaling muling nag-trade ang stock lampas sa naunang closing price. Hindi kumpleto ang depinisyong ito kung walang kalakip na deadline. Sa walang limitasyong horizon, tatawirin ng liquid stock ang halos anumang level na pangalanan ng mambabasa sa isang punto. Dahil dito, ang pahayag na “laging napupunan ang mga gap” ay hindi mapasisinungalingan, sa halip na mapatunayang totoo. May nakasaad na horizon para sa bawat numerong nasa ibaba.

Isang sample ang ginagamit sa buong page: walong large-cap US stocks, mga gap day mula January 2021 hanggang February 2026, at mga fill na sinusuri batay sa one-minute highs at lows sa regular session. Inaalis ang mga gap na mas mababa sa 0.25% dahil sa rounding.

Laging napupunan ba ang stock gaps sa parehong araw?

Magsimula sa laki. Igrupo ang bawat gap ayon sa laki nito, at tingnan kung muling nahawakan ang naunang close bago matapos ang parehong session.

QueryRate ng same-session gap fill ayon sa laki ng gap, walong large caps, 2021 hanggang 2026
Ang eksaktong SQL sa likod ng bawat numero
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

Ang pinakamaliliit na gap sa sample, na 0.25% hanggang 0.5%, ay nagsara sa parehong session 74.6% ng pagkakataon sa 2381 occurrences. Ang mga gap na 4% o higit pa ay nagsara sa parehong session 14.8% ng pagkakataon. Karamihan ng aral ay nasa pababang slope ng chart: habang lumiit ang gap, mas madalas na bumabalik ang stock at tinatawid ito sa maghapon. Sa ibang paraan, noise ang maliliit na gap, at kadalasang bumabaligtad ang noise.

Gaano katagal bago mapunan ang isang gap?

Kapag pinalawig ang deadline, maaari lamang tumaas ang fill rate. Nagdaragdag ng mga fill ang mas mahabang window at walang inaalis. Ang tanong ay kung gaano karami sa kabuuang fills ang dumarating nang huli na para maging kapaki-pakinabang.

QueryBahagi ng 1%+ gaps na na-fill, ayon sa tagal ng paghihintay
Ang eksaktong SQL sa likod ng bawat numero
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

Sa 2191 gap na 1% o higit pa, 34% ang napunan sa loob ng parehong session at 88.7% ang napunan sa loob ng 60 sessions. Ang ikalawang figure ang karaniwang binabanggit, habang iniiwan ang horizon. Tinatayang tatlong trading month ang 60 sessions. Mahaba itong holding period para sa posisyong nakabatay sa isang one-day dislocation. Ang gap na napunan sa ika-47 araw, matapos munang bumiyahe nang malayo ang stock sa kabilang direksiyon, ay binibilang pa rin bilang filled sa statistic na iyon.

Dalawang population ang noise gaps at information gaps

Ang gap sa tahimik na araw na may karaniwang volume ay maliit na pricing adjustment. Ang gap dahil sa earnings news o takeover approach ay nagpapahiwatig ng pagbabago sa halaga ng kumpanya, kaya wala nang dating presyo na dapat balikan. Makatuwirang naihihiwalay ang dalawa gamit ang volume: kapag buong merkado ang gustong mag-trade sa repricing, maraming prints ang nagaganap kumpara sa normal na turnover.

QueryRate ng gap fill ayon sa bigat ng volume sa araw ng gap
Ang eksaktong SQL sa likod ng bawat numero
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

Ang mga gap na 1% o higit pa na may volume na mas mababa sa 1.5 times ng normal turnover ng stock ay napunan sa parehong session 35.9% ng pagkakataon. Ang mga gap na kapareho ang laki ngunit may volume na tatlong times ng normal o higit pa ay napunan sa parehong session 15.3% ng pagkakataon, at 45.8% sa loob ng 20 sessions, mula sa 59 ng mga ito. Nasa heavy-volume group ang earnings gaps at deal gaps. Kung pag-iisahin ang dalawang group sa isang number, hindi nito mailalarawan nang tama ang alinman sa dalawa.

Bakit binabaluktot ng mga unang minuto ng session ang gap statistics

Marupok ang fill na naitala sa 9:31 a.m. Galing sa auction ang opening price, isang batched cross na nagtatakda ng iisang presyo para sa lahat ng order na naka-queue overnight. Ipinaliliwanag ng aming opening auction explainer ang mechanics nito. Sa mga minutong kasunod ng cross na iyon, pinakamalawak ang quoted spreads sa buong araw. Maaari ring magtala ang isang maliit na print ng high o low na walang malaking volume na aktuwal na nag-trade sa presyong iyon. Sinasaklaw ng Lumalawak ang spreads sa open kung bakit manipis ang quote sa oras na iyon.

Ipinapakita ng chart sa ibaba ang pattern sa sariling tape ng basket: ang average one-minute high-low range sa basis points (ang one basis point ay isang daan ng isang porsiyento), ayon sa fifteen-minute clock bucket, hanggang 2025.

QueryAverage na one-minute range at volume ayon sa oras ng araw, 2025
Ang eksaktong SQL sa likod ng bawat numero
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

Ang opening bucket ay may average na 24.4 bps na range bawat minuto, kumpara sa 6.9 bps sa 12:30 bucket, sa volume na 303.9 thousand shares bawat minuto kumpara sa 69.6 thousand. Ang fill na na-stamp sa loob ng unang bucket na iyon ay nakabatay sa pinakamababang reliability ng mga presyo sa araw. Kasama sa mga same-session number sa itaas ang mga minutong iyon, kaya bahagyang napapataas nito ang mga resulta. Nalalapat ang caveat na ito sa lahat ng same-day fill statistics, kabilang ang isang ito.

Ano ang dapat tingnan bago ituring na trade ang isang gap

  1. Ang horizon. Ang fill rate na walang kalakip na deadline ay hindi isang statistic.
  2. Ang population. Dapat malaman kung pinaghiwalay ang news gaps sa mga tahimik na gap, at kung paano itinakda ang linya sa pagitan ng mga ito.
  3. Ang measurement. Dapat malaman kung sinuri ang fills batay sa aktuwal na traded ranges, at kung isinama ang mga unang minuto ng session.
  4. Ang survivors. Dapat malaman kung ang sample ay naglalaman lamang ng mga stock na patuloy na nagta-trade ngayon. Tahimik nitong inaalis ang mga gap na hindi kailanman napunan.

Mas makitid kaysa sa slogan ang tapat na bersiyon ng claim. Madalas at mabilis bumabalik ang maliliit na gap sa ordinaryong volume. Ang malalaking gap sa heavy volume ay mga repricing na madalas nananatili nang maraming buwan. Para sa live view ng mga pangalan na nagkakaroon ng gap, sinusubaybayan ng page na pinakamalalaking stock movers ngayong linggo ang kasalukuyang linggo. Inilalapat naman ng kung paano bumabawi ang mga merkado mula sa crashes ang parehong disiplina sa horizon sa index drawdowns.

Mga Madalas Itanong

Laging napupunan ba ang stock gaps?

Hindi. Sa sample dito, 88.7% ng mga gap na 1% o higit pa ang muling nag-trade lampas sa naunang close sa loob ng 60 sessions. Nangangahulugan ito na may malaking bahagi pa ring hindi napunan pagkalipas ng humigit-kumulang tatlong trading month. Gumagana lamang ang bersiyong “laging” walang itinakdang time limit. Sa puntong iyon, hindi na ito masusuri.

Gaano katagal bago mapunan ang isang gap?

Depende ito sa gap. Dito, 34% ng mga gap na 1% o higit pa ang napunan sa loob ng parehong session. Dumarating ang natitirang fills sa mga sumunod na linggo at buwan. Mas nakapokus ang maliliit na gap sa same-day bucket, habang pinakamabagal ang mga gap na may heavy volume.

Ano ang pagkakaiba ng common gap at breakaway gap?

Hinahati ng chart vocabulary ang mga gap batay sa konteksto. Nagbubukas ang common gap sa karaniwang araw na may karaniwang volume at walang partikular na news. Ang breakaway gap naman ay nagbubukas sa heavy volume kasabay ng bagong impormasyon, madalas mula sa price range na matagal nang pinananatili ng stock. Nasusukat ng volume split sa panel sa itaas ang parehong distinction.

Bakit malaki ang pagkakaiba ng gap fill statistics sa iba’t ibang source?

Malaki ang epekto ng apat na pagpipilian sa number: ang fill horizon, ang basket ng stocks, ang sakop na period, at kung sinusukat ang gap mula sa naunang close o mula sa naunang high at low. Hindi maihahambing ang isang quoted fill rate sa iba kung kulang ito sa alinman sa apat.


Paano sinukat ang mga numerong ito

Binubuo ang mga session mula sa one-minute bars sa loob ng regular trading hours ayon sa New York time. Ang opening price ay ang open ng unang regular-session bar, ang close ay ang close ng huling bar, at ang day's high at low ay ang extremes ng mga bar na iyon. Sinusukat ang bawat gap batay sa close ng nakaraang session ng parehong ticker.

Kasama sa 5, 20 at 60 session horizons ang mismong gap day. Nagtatapos ang gap days sa katapusan ng February 2026, habang umaabot ang tape hanggang June 2026. Dahil dito, may hindi bababa sa sixty na susunod na sessions para sa bawat gap sa horizon panel, at walang gap na minarkahang unfilled dahil lamang sa kakulangan ng data.

Sa third panel, ang normal volume ay ang average regular-session volume sa 20 sessions na nagtatapos dalawang araw bago ang gap. Iniiwasan nito na maisama ang gap day at ang araw bago nito sa sarili nilang benchmark.

Ang basket ay binubuo ng walong liquid large caps. Mas madalas magkaroon ng gap ang thinner names at iba ang fill behavior ng mga ito. Kaya hindi awtomatikong mailalapat ang mga rate na ito sa small caps nang hindi inuulit ang parehong test para sa mga iyon.

May eksaktong SQL sa ilalim ng bawat panel dito. Para patakbuhin ang parehong test sa ticker na sinusubaybayan mo, itanong ito sa plain English sa Strasmore terminal.

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