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

Worden stock gaps altijd gedicht? De data analyse

Worden stock gaps altijd gedicht? Niet binnen een vaste tijdshorizon. Bekijk de fill rates voor large caps over vijf, twintig en zestig sessies inclusief de SQL code.

Worden stock gaps altijd gedicht? Niet binnen een tijdshorizon die kort genoeg is om in te handelen, en de bewering houdt alleen stand zolang niemand er een termijn aan verbindt. Een gap is het verschil tussen de opening van vandaag en de slotkoers van de reguliere handelssessie van gisteren; een fill is het moment waarop de koers weer door die eerdere slotkoers beweegt. Het hele argument valt of staat bij de vraag hoe lang een lezer bereid is daarop te wachten.

Wat telt als een gap en wat als een fill

Een gap wordt gemeten als het verschil tussen de opening en de voorgaande slotkoers. De sessie van gisteren eindigde op een bepaalde koers, die van vandaag opende op een andere, en het verschil daartussen is de gap. Het is niet de afstand tot de intraday high of low van gisteren. Dat is een ander en veel eenvoudiger doelwit; door die twee met elkaar te verwarren, wordt een "gap" op een gewone dag stilletjes iets dat tegen lunchtijd alweer is gedicht. Kleine gaps komen in bijna elke sessie voor: handel in andere tijdzones, indexwijzigingen, nieuws over individuele aandelen en aanpassingen voor ex-dividenddata zorgen allemaal voor een verschuiving van de fair price terwijl de Amerikaanse markt gesloten is. Waarom aandelen 's nachts gapen behandelt de oorsprong van die overnight herwaardering.

Een fill is het eerste moment waarop het aandeel weer door de voorgaande slotkoers handelt. Die definitie is incompleet zonder een deadline. Over een onbeperkte horizon kruist een liquide aandeel op een gegeven moment bijna elk koersniveau dat een lezer kan noemen, wat de stelling "gaps worden altijd gedicht" onweerlegbaar maakt in plaats van waar. Elk cijfer hieronder is gekoppeld aan een specifieke horizon.

Eén steekproef loopt door de hele pagina: acht large-cap Amerikaanse aandelen, gap-dagen van januari 2021 tot en met februari 2026, waarbij fills zijn getoetst aan de highs en lows van de reguliere handelssessie op éénminuutbasis. Gaps kleiner dan 0,25% zijn weggelaten vanwege afronding.

Worden stock gaps altijd op dezelfde dag gedicht?

Begin bij de omvang. Groepeer elke gap op basis van de grootte en kijk vervolgens of de voorgaande slotkoers opnieuw werd aangeraakt voordat diezelfde sessie eindigde.

QueryGap fill rate per sessie naar gap-grootte, acht large caps, 2021 tot 2026
De exacte SQL achter elk getal
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

De kleinste gaps in de steekproef, 0,25% tot 0,5%, werden in 74.6% van de gevallen binnen dezelfde sessie gedicht over 2381 waarnemingen. Gaps van 4% of meer werden in 14.8% van de gevallen binnen dezelfde sessie gedicht. De neerwaartse helling in de grafiek vormt de kern van de les: hoe kleiner de gap, hoe vaker het aandeel gedurende de dag weer door dat niveau beweegt. Dat is een andere manier om te zeggen dat kleine gaps ruis zijn en ruis corrigeert zichzelf.

Hoe lang duurt het voordat een gap wordt gedicht?

Verleng de deadline en het fill-percentage kan alleen maar stijgen. Een langere tijdshorizon voegt fills toe en verwijdert er nooit. De vraag is hoeveel van het totaal zo laat binnenkomt dat het onbruikbaar is.

QueryAandeel van 1%+ gaps gevuld, naar tijdsduur
De exacte SQL achter elk getal
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

Van de 2191 gaps van 1% of meer werd 34% binnen dezelfde sessie gedicht en 88.7% was binnen 60 sessions gedicht. Het tweede cijfer is het cijfer dat meestal wordt geciteerd, zonder vermelding van de horizon. Zestig sessies is ongeveer drie handelsmaanden; een lange periode voor een positie die gebaseerd is op een eendaagse verstoring. Een gap die op dag 47 wordt gedicht, nadat het aandeel eerst ver de andere kant op is bewogen, telt in die statistiek nog steeds als gedicht.

Ruis-gaps en informatie-gaps zijn twee verschillende populaties

Een gap op een rustige dag met een gemiddeld volume is een kleine prijsaanpassing. Een gap op basis van kwartaalcijfers of een overnamebod bevat een verandering in de waarde van het bedrijf, en er is geen oude koers meer om naar terug te keren. Volume scheidt de twee redelijk goed: een herwaardering waar de hele markt op wil reageren, genereert vele malen het normale handelsvolume.

QueryGap fill rate naar volume op de dag van de gap
De exacte SQL achter elk getal
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

Gaps van 1% of meer bij een volume onder 1,5 keer het normale handelsvolume van het aandeel werden in 35.9% van de gevallen binnen dezelfde sessie gedicht. Gaps van dezelfde omvang bij drie keer het normale volume of meer werden in 15.3% van de gevallen binnen dezelfde sessie gedicht, en 45.8% binnen 20 sessies, over 59 van de gevallen. De groep met het hoge volume bevat de gaps door kwartaalcijfers en overnames. Het middelen van beide groepen tot één getal beschrijft geen van beide correct.

Waarom de eerste minuten van de sessie de gap-statistieken vertekenen

Een fill die om 09:31 uur wordt geregistreerd, is fragiel. De openingskoers komt voort uit een veiling, een enkele gebundelde transactie die één prijs vaststelt voor alle orders die 's nachts in de wachtrij stonden; onze uitleg over de openingsveiling doorloopt de mechanica hiervan. In de minuten na die transactie zijn de spreads op hun breedst en kan één kleine transactie een high of low registreren die nooit door een substantieel volume is verhandeld. Spreads worden breder bij de opening behandelt waarom de koersvorming daar zo dun is.

De onderstaande grafiek toont het verloop op de tape van de mand: gemiddelde high-low range per minuut in basispunten (één basispunt is een honderdste procent), per tijdvak van vijftien minuten, tot en met 2025.

QueryGemiddelde range en volume per minuut naar tijdstip, 2025
De exacte SQL achter elk getal
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

Het openingsblok heeft een gemiddelde range van 24.4 basispunten per minuut tegenover 6.9 basispunten in het 12:30 blok, bij 303.9 duizend aandelen per minuut tegenover 69.6 duizend. Een fill die in dat eerste blok wordt gestempeld, rust op de minst betrouwbare koersen van de dag. De cijfers voor dezelfde sessie hierboven bevatten die minuten, wat ze enigszins vertekent; die kanttekening geldt voor elke statistiek over fills op dezelfde dag, inclusief deze.

Waar u op moet letten voordat u een gap als trade beschouwt

  1. De horizon. Een fill-percentage zonder deadline is geen statistiek.
  2. De populatie. Of nieuws-gaps werden gescheiden van rustige gaps en hoe die grens werd getrokken.
  3. De meting. Of fills werden getoetst aan werkelijk verhandelde ranges en of de eerste minuten van de sessie werden meegeteld.
  4. De overlevers. Of de steekproef alleen aandelen bevat die vandaag nog verhandeld worden, wat stilletjes de gaps verwijdert die nooit werden gedicht.

De eerlijke versie van de bewering is genuanceerder dan de slogan. Kleine gaps bij een gemiddeld volume keren vaak en snel terug. Grote gaps bij een hoog volume zijn herwaarderingen die vaak maandenlang standhouden. Voor een live overzicht van welke aandelen gapen, volgt de pagina grootste stijgers en dalers van de week de huidige week, en hoe markten herstellen van crashes past dezelfde discipline toe op indexdalingen.

Veelgestelde vragen

Worden stock gaps altijd gedicht?

Nee. In de steekproef hier handelde 88.7% van de gaps van 1% of meer binnen 60 sessions weer door de voorgaande slotkoers, wat betekent dat een aanzienlijk deel na ongeveer drie handelsmaanden nog steeds niet gedicht is. De "altijd"-versie werkt alleen zonder tijdslimiet, maar op dat punt is de stelling niet langer toetsbaar.

Hoe lang duurt het voordat een gap wordt gedicht?

Dat hangt af van de gap. Hier werd 34% van de gaps van 1% of meer binnen dezelfde sessie gedicht, en de overige fills vonden plaats in de daaropvolgende weken en maanden. Kleine gaps concentreren zich in het blok van dezelfde dag, terwijl de gaps met een hoog volume het langzaamst zijn.

Wat is het verschil tussen een common gap en een breakaway gap?

De grafiekterminologie onderscheidt gaps op basis van de context. Een common gap opent op een gewone dag met een gemiddeld volume en zonder specifiek nieuws, terwijl een breakaway gap opent bij een hoog volume in combinatie met nieuwe informatie, vaak buiten een koersbereik waar het aandeel zich al een tijdje in bevond. De splitsing op basis van volume in het bovenstaande paneel is een meetbare versie van datzelfde onderscheid.

Waarom verschillen gap-fill-statistieken zo sterk tussen bronnen?

Vier keuzes beïnvloeden het cijfer aanzienlijk: de fill-horizon, de mand met aandelen, de onderzochte periode en of de gap wordt gemeten vanaf de voorgaande slotkoers of vanaf de voorgaande high en low. Een geciteerd fill-percentage waarbij een van deze vier factoren ontbreekt, kan niet met een ander worden vergeleken.


Hoe deze cijfers zijn gemeten

Sessies zijn opgebouwd uit éénminuut-bars binnen de reguliere handelstijden in New York-tijd. De openingskoers is de opening van de eerste bar van de reguliere sessie, de slotkoers is het slot van de laatste bar, en de high en low van de dag zijn de extremen van die bars. Elke gap wordt gemeten ten opzichte van de slotkoers van de vorige sessie van hetzelfde ticker-symbool.

De horizons van 5, 20 en 60 sessies omvatten de gap-dag zelf. De gap-dagen eindigen eind februari 2026, terwijl de tape doorloopt tot juni 2026, waardoor elke gap in het horizon-paneel ten minste zestig latere sessies beschikbaar heeft en er geen enkele als ongedicht wordt aangemerkt bij gebrek aan data.

Het normale volume in het derde paneel is het gemiddelde volume tijdens de reguliere sessie over de 20 sessies eindigend twee dagen vóór de gap, waardoor de gap-dag en de dag daarvoor buiten hun eigen benchmark blijven.

De mand bestaat uit acht liquide large-caps. Dunnere namen gapen vaker en vullen anders, dus deze percentages zijn niet zonder meer van toepassing op small-caps zonder dezelfde test op hen uit te voeren.

Elk paneel hier wordt geleverd met de exacte SQL eronder. Om dezelfde test uit te voeren op een ticker die u volgt, stelt u de vraag in begrijpelijke taal op de Strasmore-terminal.

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