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.
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) ASCDans 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.
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)) ASCSur 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.
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) ASCLes 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.
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 ASCLa 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
- L’horizon. Un taux de comblement sans délai précis n’est pas une statistique.
- 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.
- 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.
- 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.