Comprendre les marchés locked et crossed
Définition des concepts de locked market et crossed market. Analyse de la réglementation Reg NMS et fréquence d'apparition de ces anomalies de spread.
Un marché verrouillé (locked market) survient lorsque la meilleure offre d'un titre est égale à sa meilleure demande — le spread bid-ask est alors de zéro. Un marché croisé (crossed market) est une situation plus extrême : la meilleure offre est supérieure à la meilleure demande. La réglementation des marchés américains interdit aux bourses d'afficher l'un ou l'autre de ces états, pourtant ils apparaissent régulièrement dans les registres de cotations consolidées. Cette page définit ces deux concepts, explique la réglementation et mesure leur fréquence d'apparition.
Qu'est-ce qu'un marché verrouillé (locked market) ?
Chaque action américaine possède deux prix simultanés : le bid, le prix d'achat le plus élevé, et l'ask, le prix de vente le plus bas. L'ask est normalement supérieur au bid ; l'écart entre les deux est le bid-ask spread, qui représente le coût intrinsèque d'une exécution immédiate.
Un marché est dit « verrouillé » lorsque cet écart devient nul : une action cotée 10,00 $ (bid) / 10,05 $ (ask) présente un spread de cinq cents. Si le meilleur ask descend à 10,00 $ alors que le bid se maintient, la cotation est verrouillée à 10,00 $ / 10,00 $.
Sur une seule place boursière, cet état est impossible : un achat à 10,00 $ rencontrant une vente à 10,00 $ entraîne une exécution immédiate. Une cotation verrouillée n'existe qu'entre plusieurs plateformes. Les actions américaines s'échangent sur plus d'une douzaine de bourses simultanément. Le NBBO — le national best bid and offer, la cotation affichée par votre application de courtage — agrège les meilleurs bid et ask de l'ensemble de ces plateformes. Un bid à 10,00 $ sur une plateforme et un ask à 10,00 $ sur une autre verrouillent la cotation nationale, même si aucune plateforme ne présente de carnet d'ordres verrouillé.
Qu'est-ce qu'un marché croisé ?
Un marché croisé inverse l'ordre habituel : le meilleur bid se situe au-dessus du meilleur ask — par exemple, un bid à 10,02 $ face à un ask à 10,00 $. Théoriquement, n'importe qui pourrait acheter à 10,00 $, vendre à 10,02 $ et empocher deux cents de profit par action sans risque. Ce profit immédiat explique pourquoi une cotation croisée ne peut pas durer : les firmes professionnelles — dont les market makers qui cotent les deux côtés de la plupart des actions — saisissent l'arbitrage dès qu'il apparaît, ce qui consomme les deux cotations. Ce qui subsiste dans les données est un artefact : un enregistrement croisé capturé entre la mise à jour d'une plateforme et celle d'une autre.
Pourquoi la Reg NMS interdit les quotes locked et crossed
Cette interdiction est inscrite dans la Regulation NMS, le règlement de la SEC (adopté en 2005) régissant les échanges sur les bourses américaines. La règle 610(d) impose à chaque plateforme d'empêcher ses membres d'afficher des quotes qui créent un lock ou un cross par rapport aux protected quotes — les meilleurs bids et asks automatisés sur les autres bourses — pendant les heures de trading régulier. L'objectif est le suivant : si un bid est égal à l'ask d'un autre participant, la transaction doit être routée et exécutée immédiatement, au lieu de rester affichée comme une contradiction.
Une limite de cette règle est importante pour les données ci-dessous : elle régule l'affichage, pas l'existence des ordres. Chaque plateforme contrôle ce que son propre carnet d'ordres affiche ; le NBBO consolidé est assemblé en temps réel à partir des flux de données de toutes les places boursières. Un NBBO locked peut donc apparaître dans ce flux sans qu'aucun participant n'ait enfreint la règle.
Pourquoi les quotes locked et crossed apparaissent toujours dans le tape
La vitesse. Les bourses mettent à jour les quotes en microsecondes, et le flux consolidé se reconstruit à chaque mise à jour. Deux événements ordinaires génèrent des enregistrements locked et crossed :
- Races. Une bourse augmente son bid à 10,00 $ alors qu'une autre affiche toujours un ask à 10,00 $. Une fois agrégé, le NBBO est lu comme locked jusqu'à la mise à jour du côté le plus lent ; une race dépassant d'un cent le prix affiché est lue comme crossed.
- Enregistrements stale ou unilatéraux. Certains enregistrements ne comportent qu'un seul côté — un bid sans ask, ou l'inverse. Les titres peu liquides y passent une part beaucoup plus importante de la journée, comme le montre le recensement ci-dessous.
Les règles de comptage de cette page : locked = le bid est égal à l'ask, les deux côtés sont positifs ; crossed = le bid est supérieur à un ask positif ; one-sided = l'un des deux côtés est à zéro ou manquant. Rien n'est supprimé silencieusement — les enregistrements one-sided disposent de leur propre colonne.
À quelle fréquence les marchés lockés et crossed surviennent-ils ?
Considérez l'ensemble du tape : à chaque mise à jour du NBBO, pour chaque symbole coté, sur 2026-07-14 — la session complète la plus récente de notre échantillon.
Le SQL exact derrière chaque chiffre
WITH (
SELECT max(toDate(toTimeZone(window_start, 'America/New_York')))
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start < toDateTime(today() - 3)
) AS census_day
SELECT
formatDateTime(census_day, '%Y-%m-%d') AS session_date,
round(count() / 1e6, 0) AS updates_m,
round(countIf(bid_price = ask_price AND bid_price > 0) / 1e6, 2) AS locked_m,
round(countIf(bid_price > ask_price AND ask_price > 0) / 1e3, 1) AS crossed_k,
round(countIf(bid_price = ask_price AND bid_price > 0) / toFloat64(greatest(countIf(bid_price > ask_price AND ask_price > 0), 1)), 0) AS locked_per_crossed,
round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
round(countIf(bid_price <= 0 OR ask_price <= 0) / toFloat64(count()) * 1e4, 1) AS one_sided_per_10k
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= toDateTime(census_day)
AND sip_timestamp < toDateTime(census_day + 1)Cette session a enregistré 477 millions de mises à jour de cotations : 9.7 millions de quotes lockées et 67 milliers de quotes crossed — soit 204.9 pour 10 000 mises à jour, avec un ratio de 145 lockées pour une crossed. Les enregistrements sans côté (one-sided) s'élevaient à 2.8 pour 10 000. Le récapitulatif de marché du 7 juillet affiche les mêmes chiffres pour chaque spread mesuré.
Le taux global du marché mélange des milliers de titres très différents. Le tableau ci-dessous reprend l'échantillon sur dix titres sélectionnés — huit tickers majeurs et deux small caps à faible liquidité, Nathan's Famous (NATH) et Seneca Foods (SENEA) — sur les sessions récentes, hors-série incluses, avec le spread typique de chaque titre.
Le SQL exact derrière chaque chiffre
SELECT ticker,
round(count() / 1e3, 1) AS updates_k,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100, 1) AS median_spread_cents,
countIf(bid_price = ask_price AND bid_price > 0) AS locked_records,
countIf(bid_price > ask_price AND ask_price > 0) AS crossed_records,
round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
round(countIf(bid_price <= 0 OR ask_price <= 0) / toFloat64(count()) * 1e4, 1) AS one_sided_per_10k
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
AND sip_timestamp >= toDateTime(today() - 10)
AND sip_timestamp < toDateTime(today() - 3)
GROUP BY ticker
ORDER BY tickerComparez la colonne spread au taux observé. Coca-Cola, dont le spread typique est de 1¢, a présenté une cotation lockée ou crossed sur 215.9 des 10 000 mises à jour ; Nvidia (2¢) affichait 91 pour 10 000 et SPY (2¢) 52.2. AMD, dont le spread typique en extended-hours est de 44¢, n'affiche que 5.9 pour 10 000. Un lock survient lorsque deux places de marché atteignent le même centime au même instant — plus le spread typique est large, plus cette probabilité est faible.
Les titres peu liquides sont peu impactés : Nathan's Famous a enregistré 0 records lockés et 0 records crossed sur 8.4 mille mises à jour, et Seneca Foods 0 et 0 sur 40.5 mille. La colonne correspondante montre que les enregistrements one-sided s'élèvent à 41.5 pour 10 000 pour Nathan's Famous et 17 pour Seneca Foods, contre 0 pour SPY. Les records lockés et crossed apparaissent lorsque la cotation est rapide et serrée ; les enregistrements one-sided apparaissent lorsque la liquidité est faible.
Quand les quotes locked et crossed se regroupent-elles ?
Le recensement des noms indique le lieu ; l'horloge indique le moment. Voici le taux de quotes locked ou crossed pour l'échantillon vérifié, par intervalle de 30 minutes (heure de l'Est), de 4h00 à 20h00, avec le volume de mises à jour pour chaque intervalle.
Le SQL exact derrière chaque chiffre
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
round(count() / 1e6, 2) AS updates_m
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
AND sip_timestamp >= toDateTime(today() - 10)
AND sip_timestamp < toDateTime(today() - 3)
GROUP BY et_time
HAVING et_time >= '04:00' AND et_time < '20:00'
ORDER BY et_timeLe taux augmente tout au long de la session. L'intervalle de 05h00 en premarket affichait 3 pour 10 000 sur 0.59 millions de mises à jour ; l'intervalle de 09h30 — la première demi-heure de la séance régulière, débutant par l'opening auction — présentait 24.9 pour 10 000 sur 9.98 millions de mises à jour. À partir de là, le taux augmente jusqu'à la clôture, atteignant 109.9 pour 10 000 dans l'intervalle de 15h30, juste avant la closing auction. Une ligne de données illustre cette tendance :
Le SQL exact derrière chaque chiffre
SELECT
round(countIf(is_locked) / 1e3, 1) AS locked_k,
round(countIf(is_crossed) / 1e3, 1) AS crossed_k,
round(countIf(is_locked) / toFloat64(greatest(countIf(is_crossed), 1)), 1) AS locked_per_crossed,
round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 240 AND 569) / toFloat64(countIf(et_minute BETWEEN 240 AND 569)) * 1e4, 1) AS premarket_per_10k,
round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 570 AND 599) / toFloat64(countIf(et_minute BETWEEN 570 AND 599)) * 1e4, 1) AS opening_half_hour_per_10k,
round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 720 AND 779) / toFloat64(countIf(et_minute BETWEEN 720 AND 779)) * 1e4, 1) AS midday_hour_per_10k,
round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)) * 1e4, 1) AS closing_half_hour_per_10k,
round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
/ (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 570 AND 599) / toFloat64(countIf(et_minute BETWEEN 570 AND 599))), 1) AS close_to_open_ratio,
round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
/ (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 720 AND 779) / toFloat64(countIf(et_minute BETWEEN 720 AND 779))), 1) AS close_to_midday_ratio,
round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
/ (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 240 AND 569) / toFloat64(countIf(et_minute BETWEEN 240 AND 569))), 1) AS close_to_premarket_ratio
FROM (
SELECT
bid_price = ask_price AND bid_price > 0 AS is_locked,
bid_price > ask_price AND ask_price > 0 AS is_crossed,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_minute
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
AND sip_timestamp >= toDateTime(today() - 10)
AND sip_timestamp < toDateTime(today() - 3)
)Sur l'ensemble de la période, l'échantillon vérifié a enregistré 257.2 mille records locked contre 25.6 mille records crossed — soit 10.1 locked pour chaque record crossed. Le taux de la dernière demi-heure de séance, soit 109.9 pour 10 000, était 4.4 fois supérieur à celui de la première demi-heure (24.9) et 2.3 fois supérieur à celui de la mi-journée (48.5).
L'interdiction d'affichage ne s'applique pas avant 09h30, pourtant la période 04h00–09h30 — le premarket trading, avec un volume de cotation bien inférieur à celui de la séance régulière — n'affichait que 10.9 pour 10 000, tandis que la dernière demi-heure affichait un taux 10.1 fois supérieur. Ces anomalies surviennent lorsque la cotation est rapide et serrée, et non lorsque la réglementation est la plus souple.
Notes sur les données : période et périmètre
- Le recensement global couvre une journée civile complète en UTC, incluant tous les symboles cotés ; les tableaux de l'échantillon vérifié couvrent une période glissante de sessions récentes terminées, incluant les horaires étendus (4h00–20h00 ET). Chaque période se termine trois jours avant la date de mise à jour — l'entrepôt de données présente un délai d'ingestion de un à deux jours.
- Le tableau des dix noms est un échantillon vérifié et non un classement du marché entier ; les intervalles horaires après 16h00 reposent sur une faible fraction du volume de la séance régulière (la colonne du nombre de mises à jour est affichée pour cette raison).
- Il s'agit de décomptes d'enregistrements et non de durées. L'analyse microstructurale par mise à jour — écarts de nanosecondes, ainsi que les réceptions de quotes crossed ou à bid nul sur le tape du SPY pour une seule session — est disponible dans le deep-dive microstructural du 29 juin.
FAQ
Qu'est-ce qu'un marché verrouillé (locked market) en actions ?
Un marché verrouillé est une cotation où le meilleur bid est égal au meilleur ask — soit un spread de zéro. Cela se produit entre différentes bourses lorsqu'un bid sur une plateforme correspond au ask d'une autre. La réglementation NMS interdit aux bourses d'afficher des cotations créant cette situation pendant les heures de négociation régulières.
Que signifie un bid supérieur au ask ?
Un bid supérieur au ask correspond à un marché croisé (crossed market). Le carnet d'ordres d'une seule bourse ne peut pas présenter cette configuration — les ordres qui se chevauchent sont exécutés immédiatement. Un NBBO croisé est presque toujours le résultat de cotations provenant de deux places boursières mises à jour à des instants légèrement différents.
Les marchés verrouillés et croisés sont-ils illégaux ?
Pas pour un investisseur particulier. La règle 610(d) de la réglementation NMS oblige les bourses à empêcher leurs membres d'afficher des cotations verrouillées ou croisées pendant les heures de négociation régulières. Les enregistrements transitoires dans le flux consolidé sont des artefacts dus aux mises à jour décalées des différentes places boursières.
À quelle fréquence les marchés verrouillés et croisés apparaissent-ils ?
De manière routinière : 9.7 millions de records verrouillés et 67 mille records croisés sont enregistrés sur le tape consolidé pour 2026-07-14 uniquement — soit 204.9 de chaque tranche de 10 000 mises à jour. Ce taux est nettement plus élevé pour les titres à cotation serrée que pour les titres peu liquides, et il est plus élevé en fin de séance qu'à l'ouverture.
Chaque chiffre sur cette page provient d'une requête stockée — développez le SQL sous chaque panneau pour voir exactement comment un lock ou un cross est comptabilisé. Pour effectuer le même recensement sur les titres que vous tradez, formulez votre demande en anglais sur le terminal Strasmore.