Estimer sa position dans la file d'attente L2
La position dans la file détermine si un ordre passif capte le spread. Apprenez à estimer votre rang via le carnet agrégé et identifiez quand passer aux données MBO.
La position dans la file d'attente (« queue position ») correspond à votre rang parmi les ordres en attente à un prix donné. Sur une plateforme fonctionnant selon la priorité prix-temps, elle détermine si un ordre passif capte le spread ou ne s'exécute jamais. Les données de marché agrégées ne fournissent pas ce chiffre : un carnet de niveau 2 indique le volume total à chaque prix, mais jamais à qui il appartient. Voici comment estimer cette position à partir des données accessibles à la plupart des traders, et comment identifier le moment où ces estimations ne suffisent plus.
Pourquoi la position dans la file est le seul avantage réel
Un ordre passif reste dans le carnet en attendant qu'un intervenant vienne croiser le spread pour l'exécuter. Selon la règle de priorité prix-temps, le moteur d'appariement classe les ordres d'abord par prix, puis par heure d'arrivée. Si 10 000 actions sont déjà à l'achat à 10,00 $ et que vous en ajoutez 100 derrière, ces 10 000 actions doivent être traitées ou annulées avant que votre tour ne vienne. Si vous annulez et replacez votre ordre au même prix, vous retournez en fin de file.
Ce classement détermine la rentabilité. En début de file, vous traitez souvent et encaissez le spread ainsi que tout rabais lié à l'apport de liquidité, sujet abordé dans frais et rabais maker-taker. En fin de file, vous ne traitez qu'une fois que tous ceux qui vous précèdent ont été servis, ce qui survient lors d'afflux directionnels importants. Les exécutions en fin de file se concentrent dans les instants précédant le franchissement de votre niveau de prix. Même prix, même ordre, résultat opposé.
Ce que les données de niveau 2 peuvent et ne peuvent pas montrer
Le niveau 1 affiche le meilleur prix acheteur et vendeur avec le volume associé. Le niveau 2, aussi appelé « market by price », ajoute de la profondeur : une liste de niveaux de prix avec le volume total en attente pour chacun. Il s'agit dans les deux cas d'agrégats ; données de marché niveau 1 vs niveau 2 les compare en détail. Lorsque l'offre à 10,00 $ passe de 10 000 à 8 500 actions, le flux indique que 1 500 actions ont disparu. Il ne précise pas si elles ont été traitées, si un seul ordre est parti ou quarante, ni quelle était leur place dans la file.
Les exécutions sont la partie visible : la bande (« tape ») imprime chaque transaction avec son volume, que vous soustrayez donc précisément. Le reste correspond aux annulations, et c'est là que les conjectures commencent. Le tableau ci-dessous compare le nombre de messages au sommet du carnet consolidé avec les transactions sur la bande pour une action liquide lors d'une séance ordinaire, le mercredi 10 juin 2026.
Le SQL exact derrière chaque chiffre
SELECT
q.et_time AS et_time,
q.quote_updates AS quote_updates,
t.trades AS trades,
round(q.quote_updates / t.trades, 1) AS updates_per_trade
FROM
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
count() AS quote_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY et_time
) AS q
INNER JOIN
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS trade_hour,
count() AS trades
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_hour
) AS t ON q.et_time = t.trade_hour
ORDER BY et_timeL'heure 08:00 précède l'ouverture : le sommet du carnet a changé 0.8 fois par transaction, soit moins de messages que de transactions. Durant la séance régulière, le ratio s'inverse. À l'heure 15:00, le sommet du carnet a changé 1.6 fois par transaction, pour un total de 233433 messages sur cette seule heure. La majeure partie de l'activité sur un niveau de prix en marché ouvert consiste en des ordres qui arrivent et repartent sans jamais être exécutés ; chacun de ces événements modifie votre place dans la file d'une manière qu'aucun flux agrégé ne révèle.
L'hypothèse d'annulation uniforme, et ses limites
L'approche standard suppose que les annulations sont réparties uniformément dans la file. Soit x votre profondeur fractionnaire : le nombre d'actions devant vous divisé par le total en attente à votre prix. Le modèle uniforme fixe la probabilité qu'une action annulée se situait devant vous à p(x) = x. Si vous êtes à mi-file dans un carnet de 10 000 actions et que 1 000 actions sont annulées sans transaction, le modèle vous fait avancer de 500 places.
Les files réelles sont biaisées. Un ordre présent depuis un certain temps appartient souvent à un intervenant patient, tandis qu'un ordre ajouté récemment est probablement une cotation éphémère qui disparaîtra en quelques secondes. Les annulations se concentrent vers la fin de la file, près de vous et derrière vous. Sur ces 1 000 actions annulées, peut-être 200 étaient devant vous, alors que le modèle vous en a crédité 500. Répétez cela toute la journée et la file simulée avance plus vite que la réalité. L'erreur est systématique : elle génère plus d'exécutions, aux meilleurs moments, que ce que les ordres réels permettent.
Comment la file se vide
Les annulations vous font avancer de manière invisible. Les transactions vous font avancer de manière visible, à hauteur du volume des transactions.
Le SQL exact derrière chaque chiffre
SELECT
multiIf(size < 100, 'under 100 shares',
size = 100, 'exactly 100 shares',
size <= 499, '101 to 499 shares',
size <= 999, '500 to 999 shares',
'1000 shares or more') AS trade_size_group,
round(100 * count() / sum(count()) OVER (), 1) AS share_of_prints_pct,
round(100 * sum(size) / sum(sum(size)) OVER (), 1) AS share_of_shares_pct
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_size_group
ORDER BY min(size)Les transactions inférieures à un lot standard (« round lot ») représentaient 90% du nombre total sur cette séance et 42.5% du volume. Les blocs de mille actions ou plus représentaient 0.2% des transactions et 19.9% du volume. Les files se vident par petits incréments ; l'écart entre la position 2 000 et 3 500 représente des centaines de transactions d'attente. Un simulateur qui accorde une exécution après deux transactions importantes a ignoré la majeure partie de la bande.
L'ordre que vous ne voyez pas
Les flux de profondeur sont tronqués. Si vous recevez dix niveaux de prix et que votre ordre est au onzième, il est hors de portée : vous ne connaissez ni le volume devant lui, ni les ordres qui s'ajoutent derrière. À ce stade, vous inventez le chiffre plutôt que de l'estimer. Cette situation est courante, car un ordre qui ne suit pas le marché s'éloigne rapidement du sommet du carnet.
Le SQL exact derrière chaque chiffre
SELECT
formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
round(avg(toFloat64(bid_price)), 2) AS best_bid,
uniqExact(bid_price) AS bid_levels_touched
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
AND bid_price > 0
GROUP BY et_time
ORDER BY et_timeDans le compartiment 10:00, le meilleur prix acheteur était en moyenne de 290.29 $ et a visité 187 prix distincts en quinze minutes. Chaque prix correspond à un niveau distinct pour une action cotée au centime, donc une vue sur dix niveaux couvre dix centimes de carnet. Un ordre laissé à un prix fixe lors d'une telle séance peut passer de longues périodes sous le niveau le plus profond visible par son propriétaire.
Où la position dans la file est la plus précieuse
La position dans la file est cruciale là où l'amélioration du prix est impossible. Une action bloquée sur un spread d'un centime ne laisse aucune marge pour passer devant la file avec un meilleur prix : tout le monde s'empile au même tick, et l'heure d'arrivée tranche. Lorsque le spread est large de plusieurs centimes, un trader peut passer devant toute la file pour un centime, et la décision sur le prix l'emporte sur la file.
Le SQL exact derrière chaque chiffre
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS avg_spread_cents,
round(100 * countIf(round(toFloat64(ask_price - bid_price) * 100) <= 1) / count(), 1) AS one_cent_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'KO', 'NVDA', 'MSFT', 'BKNG')
AND sip_timestamp >= '2026-06-10 15:00:00'
AND sip_timestamp < '2026-06-10 19:00:00'
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY avg_spread_centsSur quatre heures de milieu de séance, le titre le plus étroit parmi les six, KO, affichait un spread moyen de 1.18 centimes et un spread d'un centime sur 82.5% de ses mises à jour. Le plus large, MSFT, affichait une moyenne de 8.46 centimes, avec un spread d'un centime sur 1.1% des mises à jour. Un modèle de file calibré sur le premier titre ne dit rien d'utile sur le second. Les ordres qui restent entre les cours, traités dans ordres midpoint peg, forment leur propre file selon les mêmes règles.
Quatre diagnostics pour votre propre backtest
- Comparez le taux d'exécution simulé avec votre taux d'exécution réel sur les mêmes titres et aux mêmes heures. Un simulateur qui exécute 70 % des ordres alors que le taux réel est de 40 % décrit votre hypothèse, pas le marché.
- Séparez les exécutions simulées en deux groupes : celles où le niveau de prix a survécu après, et celles qui ne sont survenues qu'au moment où le niveau a été totalement vidé. Un groupe pondéré vers le second type signifie que le simulateur vous accorde des exécutions au moment précis où le prix vous franchit.
- Encadrez l'hypothèse. Relancez le test en supposant que chaque annulation provient du début de la file, puis de la fin. Ces deux simulations constituent les marges d'erreur honnêtes autour de tout p(x) choisi.
- Mesurez la fréquence à laquelle votre prix se situait en dehors de la profondeur fournie par votre flux. Les exécutions à ce niveau étaient inventées. Biais de regard vers l'avenir dans le backtesting décrit le même échec sous un autre angle : un résultat reposant sur des informations que la stratégie n'a jamais eues.
Quand arrêter de modéliser et acheter les données d'ordres
Les données « market-by-order » (MBO) contiennent un message pour chaque ordre individuel, de son arrivée à son exécution ou annulation, chacun avec son propre identifiant. En rejouant ce flux, votre place dans la file est un compte exact plutôt qu'une estimation, une fois pris en compte un délai réaliste pour l'arrivée de votre ordre sur la plateforme. Cela coûte plus cher qu'un flux de profondeur et nécessite un stockage bien plus important.
Le diagnostic 3 est la règle de décision. Si les bornes haute et basse laissent la stratégie rentable, une hypothèse intermédiaire suffira. Si la stratégie gagne avec une borne et perd avec l'autre, le modèle de file est la stratégie elle-même, et acheter le flux ordre par ordre est moins coûteux que de défendre une estimation.
Les plateformes au prorata changent la donne
Certains marchés de contrats à terme et d'options répartissent un ordre entrant entre les ordres en attente au prorata du volume plutôt que par ordre d'arrivée. Le facteur temps importe beaucoup moins, et le volume affiché devient le levier : doubler votre volume double approximativement votre part de chaque exécution. Le mode de défaillance se déplace alors vers la cotation d'un volume supérieur à ce que vous souhaitez détenir. Pourquoi les ordres d'options ne sont pas exécutés explique ce phénomène du point de vue du trader particulier sur un carnet d'options.
FAQ
Qu'est-ce que la position dans la file en trading ?
La position dans la file est votre rang parmi les ordres en attente au même prix sur la même plateforme. Sur un carnet à priorité prix-temps, les ordres devant vous doivent être exécutés ou annulés avant que le vôtre ne puisse l'être.
Peut-on calculer la position dans la file à partir des données de niveau 2 ?
Pas exactement. Le niveau 2 affiche le volume total par niveau de prix sans identité d'ordre ; quand le volume disparaît sans transaction, vous ne pouvez pas savoir si ces actions étaient devant ou derrière vous. Vous pouvez estimer le chiffre et encadrer cette estimation. Le chiffre exact nécessite des données ordre par ordre.
Pourquoi les taux d'exécution en backtest sont-ils généralement trop élevés ?
L'hypothèse courante répartit les annulations uniformément dans la file, alors que les annulations réelles se concentrent vers la fin. Un modèle uniforme fait avancer votre ordre simulé plus vite que la file réelle, ce qui se traduit par plus d'exécutions, et de meilleure qualité, que ce que le trading réel offre.
Qu'est-ce que les données MBO ?
Les données « market-by-order » fournissent des messages pour chaque ordre individuel, de l'arrivée à l'exécution ou l'annulation. C'est le flux où votre place dans la file est comptable plutôt que modélisée, ce qui est crucial pour les stratégies vivant sur un spread d'un tick.
La position dans la file compte-t-elle sur les plateformes au prorata ?
Moins. L'allocation au prorata répartit un ordre entrant selon le volume, donc arriver le premier apporte peu et c'est le volume affiché qui fait le travail. Vérifier quel modèle d'allocation une plateforme utilise est un préalable à toute modélisation de file.
Chaque tableau ici contient le SQL qui l'a généré. Changez le ticker, modifiez la date et posez la même question sur les titres que vous tradez sur le terminal Strasmore.