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

Les gaps boursiers sont-ils toujours comblés ?

Les gaps boursiers ne sont pas toujours comblés. Comparez les taux de comblement à la même séance, après 5, 20 et 60 séances, avec le SQL utilisé.

Les gaps boursiers sont-ils toujours comblés ? Pas dans un horizon suffisamment court pour être exploitable en trading, et cette affirmation ne tient surtout que lorsque personne ne précise l’horizon. Un gap est l’écart entre le cours d’ouverture du jour et la clôture de la séance régulière précédente. Un gap est comblé lorsque le cours repasse par cette clôture. Toute la question dépend donc du délai que l’on accepte d’attendre.

Ce qui définit un gap et ce qui définit un comblement

Un gap se mesure entre l’ouverture et la clôture précédente. La séance d’hier s’est terminée à un certain niveau et celle d’aujourd’hui a ouvert à un autre. La différence entre les deux constitue le gap. Il ne s’agit pas de l’écart par rapport au plus haut ou au plus bas intraday de la veille. C’est une autre mesure, beaucoup plus facile à atteindre. Les confondre permet de faire passer discrètement un « gap » pour un mouvement qui se comble avant midi lors d’une séance ordinaire. De petits gaps apparaissent presque à chaque séance : les échanges dans d’autres fuseaux horaires, les changements de composition des indices, les nouvelles propres à une valeur et les ajustements liés à la date ex-dividende font évoluer le prix d’équilibre pendant la fermeture du marché américain. Pourquoi les actions ouvrent-elles en gap pendant la nuit explique l’origine de cette réévaluation nocturne.

Un gap est comblé au premier instant où l’action repasse par le cours de clôture précédent. Cette définition reste incomplète si aucun délai n’est précisé. Sur un horizon illimité, une action liquide repasse tôt ou tard par presque tous les niveaux cités par un lecteur. L’affirmation selon laquelle « les gaps sont toujours comblés » devient alors irréfutable plutôt que vraie. Chaque chiffre ci-dessous est associé à un horizon explicite.

Un même échantillon est utilisé dans tout l’article : huit grandes capitalisations américaines, les journées avec gap de janvier 2021 à février 2026, et des comblements testés à partir des plus hauts et des plus bas intraday sur des barres d’une minute en séance régulière. Les gaps inférieurs à 0,25 % sont écartés pour éviter les effets d’arrondi.

Les gaps boursiers sont-ils toujours comblés le jour même ?

Commençons par l’ampleur du mouvement. Regroupons chaque gap selon sa taille, puis vérifions si le cours de clôture précédent a de nouveau été touché avant la fin de la même séance.

RequêteTaux de comblement du gap le jour même selon sa taille, huit grandes capitalisations, 2021 à 2026
Le SQL exact derrière chaque chiffre
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

Dans l’échantillon, les plus petits gaps, compris entre 0,25 % et 0,5 %, ont été comblés le jour même dans 74.6% des cas, sur 2381 occurrences. Les gaps d’au moins 4 % ont été comblés le jour même dans 14.8% des cas. La pente descendante du graphique résume l’essentiel : plus le gap est petit, plus l’action repasse souvent par ce niveau au cours de la séance. Autrement dit, les petits gaps relèvent du bruit, et le bruit s’inverse.

Combien de temps faut-il pour combler un gap ?

Lorsque le délai s’allonge, le taux de comblement ne peut qu’augmenter. Une fenêtre plus longue ajoute des comblements sans en supprimer. La question est de savoir quelle part du total intervient assez tard pour ne plus être exploitable.

RequêtePart des gaps de 1 % ou plus comblés selon le délai d’attente
Le SQL exact derrière chaque chiffre
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

Sur 2191 gaps d’au moins 1 %, 34% ont été comblés au cours de la même séance et 88.7% l’avaient été dans un délai de 60 sessions. C’est généralement ce second chiffre qui est cité, sans préciser l’horizon. Soixante séances représentent environ trois mois de trading. C’est une période longue pour une position fondée sur une dislocation d’une journée. Un gap comblé au 47e jour, après que l’action a d’abord évolué nettement dans l’autre direction, est pourtant comptabilisé comme comblé dans cette statistique.

Les gaps de bruit et les gaps d’information sont deux populations distinctes

Un gap observé lors d’une séance calme, avec des volumes ordinaires, correspond à un petit ajustement de prix. Un gap lié à une publication de résultats ou à une offre de rachat traduit une modification de la valeur de l’entreprise. Il n’existe alors plus nécessairement d’ancien prix vers lequel revenir. Le volume permet de distinguer assez bien les deux situations : lorsqu’une réévaluation intéresse l’ensemble du marché, elle génère de nombreux prints par rapport au turnover habituel.

RequêteTaux de comblement du gap selon le volume de la séance d’apparition du gap
Le SQL exact derrière chaque chiffre
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

Les gaps d’au moins 1 % observés sur un volume inférieur à 1,5 fois le turnover habituel de l’action ont été comblés le jour même dans 35.9% des cas. Pour les gaps de même taille observés sur un volume au moins égal à trois fois la normale, le taux de comblement le jour même était de 15.3%, et de 45.8% dans un délai de 20 séances, sur 59 de l’ensemble. Le groupe à fort volume comprend les gaps liés aux résultats et aux opérations de marché. Faire la moyenne des deux groupes dans un seul chiffre ne décrit correctement ni l’un ni l’autre.

Pourquoi les premières minutes de la séance faussent les statistiques de comblement

Un comblement enregistré à 9 h 31 est fragile. Le cours d’ouverture est déterminé par une auction, c’est-à-dire un cross unique qui fixe un prix pour tous les ordres accumulés pendant la nuit. Notre explication de l’auction d’ouverture en détaille le mécanisme. Dans les minutes qui suivent ce cross, les spreads affichés sont les plus larges de la séance. Un seul petit print peut alors définir un plus haut ou un plus bas auquel aucune taille significative n’a été traitée. Les spreads s’élargissent à l’ouverture explique pourquoi la liquidité affichée est si faible à ce moment-là.

Le graphique ci-dessous montre cette configuration sur le tape de l’échantillon : l’amplitude moyenne entre le plus haut et le plus bas sur une minute, en points de base (un point de base représente un centième de pour cent), par tranche horaire de quinze minutes, jusqu’à fin 2025.

RequêteAmplitude moyenne sur une minute et volume selon l’heure de la journée, 2025
Le SQL exact derrière chaque chiffre
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

La première tranche affiche en moyenne 24.4 points de base d’amplitude par minute, contre 6.9 points de base pour la tranche 12:30, avec respectivement 303.9 milliers d’actions et 69.6 milliers par minute. Un comblement enregistré dans cette première tranche repose sur les cours les moins fiables de la journée. Les chiffres de comblement au cours de la même séance présentés plus haut incluent ces minutes. Ils sont donc légèrement biaisés à la hausse. Cette réserve s’applique à toutes les statistiques de comblement le jour même, y compris celle-ci.

Les points à vérifier avant de traiter un gap comme une opportunité de trading

  1. L’horizon. Un taux de comblement sans délai précis n’est pas une statistique.
  2. La population. Il faut savoir si les gaps liés aux nouvelles ont été séparés des gaps observés lors de séances calmes, et comment cette séparation a été définie.
  3. La mesure. Il faut vérifier si les comblements ont été testés sur des fourchettes effectivement traitées et si les premières minutes de la séance ont été incluses.
  4. Les survivants. Il faut vérifier si l’échantillon ne comprend que les actions qui se négocient encore aujourd’hui. Cela supprime discrètement les gaps qui n’ont jamais été comblés.

La formulation exacte est plus limitée que le slogan. Les petits gaps sur des volumes ordinaires s’inversent souvent et rapidement. Les grands gaps sur des volumes élevés correspondent à des réévaluations qui persistent fréquemment pendant plusieurs mois. Pour suivre en temps réel les valeurs qui ouvrent en gap, la page plus fortes hausses et baisses de la semaine suit la semaine en cours. La page comment les marchés se redressent après les krachs applique la même discipline d’horizon aux drawdowns des indices.

FAQ

Les gaps boursiers sont-ils toujours comblés ?

Non. Dans l’échantillon étudié, 88.7% des gaps d’au moins 1 % sont repassés par la clôture précédente dans un délai de 60 sessions. Une part significative n’était donc toujours pas comblée après environ trois mois de trading. La version qui affirme que les gaps sont « toujours » comblés ne fonctionne qu’en l’absence de limite de temps. Elle devient alors impossible à tester.

Combien de temps faut-il pour combler un gap ?

Tout dépend du gap. Ici, 34% des gaps d’au moins 1 % ont été comblés au cours de la même séance. Les autres comblements se produisent au fil des semaines et des mois suivants. Les petits gaps se concentrent dans la fenêtre du jour même. Les gaps accompagnés de volumes élevés sont les plus lents à se combler.

Quelle est la différence entre un common gap et un breakaway gap ?

Le vocabulaire de l’analyse graphique classe les gaps selon leur contexte. Un common gap apparaît lors d’une séance ordinaire, avec un volume ordinaire et sans nouvelle précise. Un breakaway gap apparaît sur un volume élevé, avec une nouvelle information, souvent à la sortie d’une zone de prix dans laquelle l’action évoluait depuis un certain temps. La distinction fondée sur le volume dans le panneau ci-dessus en constitue une version mesurable.

Pourquoi les statistiques de comblement des gaps varient-elles autant selon les sources ?

Quatre choix peuvent modifier fortement le chiffre : l’horizon de comblement, l’échantillon d’actions, la période étudiée et la méthode de mesure du gap, à partir de la clôture précédente ou des plus hauts et plus bas précédents. Un taux de comblement qui ne précise pas ces quatre éléments ne peut pas être comparé à un autre.


Méthode de mesure de ces chiffres

Les séances sont reconstituées à partir de barres d’une minute pendant les heures de cotation régulières, selon l’heure de New York. Le cours d’ouverture est celui de la première barre de la séance régulière. La clôture est celle de la dernière barre. Le plus haut et le plus bas du jour correspondent aux extrêmes de ces barres. Chaque gap est mesuré par rapport à la clôture de la séance précédente du même ticker.

Les horizons de 5, 20 et 60 séances incluent la journée du gap. Les journées avec gap s’arrêtent à fin février 2026, tandis que le tape se prolonge jusqu’à juin 2026. Chaque gap de l’analyse par horizon dispose donc d’au moins soixante séances ultérieures disponibles. Aucun gap n’est considéré comme non comblé faute de données.

Dans le troisième panneau, le volume normal correspond au volume moyen en séance régulière sur les 20 séances se terminant deux jours avant le gap. La journée du gap et la veille sont ainsi exclues de leur propre référence.

L’échantillon comprend huit grandes capitalisations liquides. Les valeurs moins liquides ouvrent plus souvent en gap et présentent des taux de comblement différents. Ces taux ne peuvent donc pas être transposés aux small caps sans reproduire le même test sur ces titres.

Chaque panneau est accompagné de la requête SQL exacte utilisée. Pour appliquer le même test à un ticker que vous suivez, formulez votre question en anglais courant dans le terminal Strasmore.

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