Strasmore Research
Enquêtes Matt ConnorPar Matt Connor

Prévention de l’auto-appariement et wash trades

La prévention de l’auto-appariement bloque vos ordres avant leur exécution. Découvrez son fonctionnement dans le matching engine et le cadre légal des wash trades.

La prévention de l’auto-appariement est une fonctionnalité du matching engine qui empêche deux ordres d’une même entreprise de se négocier entre eux. Les ordres portent un identifiant lors de leur entrée dans le carnet. Lorsque deux ordres partageant cet identifiant vont se croiser, le moteur en annule un, ou les deux, avant qu’aucun print n’ait lieu. La prévention de l’auto-appariement est un dispositif technique de la place que vous activez. L’interdiction des wash trades relève de la loi. Les deux mécanismes ne couvrent pas le même périmètre.

Dès qu’une deuxième stratégie cote un instrument déjà coté par votre première stratégie, cette règle vous concerne. Un bot de grid à deux échelons sur un même symbole y est soumis dans les mêmes conditions qu’un desk bancaire.

Fonctionnement de la prévention de l’auto-appariement dans le matching engine

Chaque ordre reçu par une place comporte des champs que le moteur lit avant l’appariement : sens, prix, taille et durée de validité. La prévention de l’auto-appariement en ajoute deux. Le premier est un identifiant, sous forme de nombre ou de chaîne de caractères, qui indique l’entreprise, le compte ou le groupe de stratégies auquel appartient l’ordre. Le second est une instruction précisant au moteur quoi faire lorsque deux ordres actifs portant cet identifiant sont sur le point de se négocier entre eux.

Le contrôle s’effectue au moment précis où un ordre agressif atteint le prix d’un ordre au repos avec lequel il pourrait s’apparier. Quatre issues sont courantes :

  • Annulation de l’ordre au repos. L’ordre entrant poursuit son parcours dans le carnet et peut s’apparier avec les ordres situés derrière lui à ce prix.
  • Annulation de l’ordre entrant. L’ordre au repos conserve sa position dans la file et l’ordre agressif disparaît.
  • Annulation des deux ordres. Il s’agit du paramétrage le plus strict.
  • Réduction puis annulation. Le plus gros ordre est réduit de la taille du plus petit. Le plus petit est annulé et le reliquat reste actif.

Dans les quatre cas, aucune transaction n’a lieu. Rien n’apparaît sur le tape, rien ne figure dans un journal d’exécution, et un message d’annulation non sollicité arrive sur un seul ou sur les deux ordres.

La position dans la file constitue le coût moins visible. Un ordre au repos annulé avec une instruction d’annulation de l’ancien ordre perd tout le bénéfice de son attente. Avec la priorité prix-temps, cette perte est totale : lors de sa réintroduction, l’ordre passe derrière tous ceux qui ont rejoint la file pendant qu’il y figurait. Notre guide sur l’estimation de la position dans la file explique la valeur de cette position.

Un instrument, plusieurs carnets

Le contrôle s’effectue place par place. Un moteur ne compare que les ordres qu’il détient lui-même. Deux de vos ordres au repos dans deux carnets différents sont invisibles l’un pour l’autre. Aucun mécanisme du marché actions américain ne permet de les comparer entre eux. Une seule action américaine peut être cotée simultanément sur de nombreux carnets. Le panneau ci-dessous compte les places distinctes qui cotent et exécutent des transactions sur six valeurs connues, pendant une fenêtre de quinze minutes le matin du 10 juin 2026.

RequêteVenues cotant et exécutant la même action sur une fenêtre de 15 minutes
Le SQL exact derrière chaque chiffre
SELECT
    q.ticker          AS ticker,
    q.quoting_venues  AS quoting_venues,
    t.printing_venues AS printing_venues
FROM
(
    SELECT
        ticker,
        countDistinct(bid_exchange) AS quoting_venues
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-06-10 14:15:00', 'UTC')
      AND bid_price > 0
    GROUP BY ticker
) AS q
INNER JOIN
(
    SELECT
        ticker,
        countDistinct(exchange) AS printing_venues
    FROM global_markets.stocks_trades
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-06-10 14:15:00', 'UTC')
    GROUP BY ticker
) AS t ON t.ticker = q.ticker
ORDER BY quoting_venues DESC, ticker
Run this yourself

AAPL a reçu des bids de 16 places distinctes au cours de ce quart d’heure, et des prints ont eu lieu sur 17 d’entre elles. La valeur la moins liquide du panneau comptait tout de même 11 places de cotation. Un smart order router qui répartit volontairement les child orders placera souvent vos deux stratégies dans des carnets différents. Aucun contrôle au niveau du moteur ne s’applique alors. Les entreprises comblent cet écart en amont, dans la couche de gestion des ordres, avant toute sortie de l’entreprise. Vos propres ordres au repos, placés de part et d’autre du marché au même prix dans deux carnets, créent également un marché locked ou crossed, soumis à ses propres règles.

Combien d’appariements un carnet réalise pendant une séance

Le contrôle d’auto-appariement se trouve sur le chemin de chaque appariement réalisé par le moteur. Sur une valeur liquide, ce flux reste actif toute la journée. Le panneau ci-dessous découpe une séance complète sur une action en tranches de quinze minutes et compte les prints dans chacune. Seules les tranches ayant compté au moins 200 prints sont conservées.

RequêteTransactions par intervalle de 15 minutes, séance complète
Le SQL exact derrière chaque chiffre
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
    count() AS trade_count
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
  AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-11 04:00:00', 'UTC')
GROUP BY et_time
HAVING count() >= 200
ORDER BY et_time
Run this yourself

À 04:00 ET, cette valeur a enregistré 9402 transactions en quinze minutes. À 19:45 ET, elle en a enregistré 1345. Au total, 64 tranches ont dépassé le seuil de 200 prints. Chaque print correspond à une paire d’ordres rapprochés par le moteur. Le contrôle lit les identifiants des deux côtés avant de les laisser se rencontrer. Tout ordre qui reste dans le carnet peut donc rencontrer plus tard dans la journée un autre ordre du même compte.

Ce que montre le tape lorsqu’un auto-appariement est exécuté

Un auto-appariement empêché ne laisse aucune trace. Le tape ne contient que les transactions exécutées. Chaque print comporte des indicateurs de condition : des codes ajoutés par la place déclarante pour décrire la manière dont la transaction a eu lieu. Le panneau ci-dessous répartit une séance complète sur une action selon ces indicateurs.

RequêteFlags de condition de transaction sur une séance complète
Le SQL exact derrière chaque chiffre
SELECT
    condition_name,
    print_count,
    round(100 * print_count / sum(print_count) OVER (), 2) AS share_pct
FROM
(
    SELECT
        cc.id        AS condition_id,
        any(cc.name) AS condition_name,
        count()      AS print_count
    FROM
    (
        SELECT toInt32(arrayJoin(conditions)) AS condition_id
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL'
          AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-11 04:00:00', 'UTC')
    ) AS f
    INNER JOIN
    (
        SELECT
            toInt32(id)  AS id,
            any(name)    AS name
        FROM global_markets.stocks_condition_codes
        WHERE asset_class = 'stocks'
          AND has(data_types, 'trade')
        GROUP BY id
    ) AS cc ON cc.id = f.condition_id
    GROUP BY condition_id
)
ORDER BY print_count DESC
LIMIT 10
Run this yourself

Odd Lot Trade représente 48.34% des prints assortis d’un indicateur au cours de cette séance. Le panneau présente les 10 indicateurs les plus fréquents de la journée. Observez la liste et ce qui en est absent. Aucun code n’indique que deux ordres provenaient d’une même entreprise. Un auto-appariement exécuté ressemble à toute autre transaction au même prix. Sa surveillance repose donc sur le tape, les identifiants des participants détenus par la place et les numéros de compte associés aux ordres.

Là où s’arrêtent la prévention de l’auto-appariement et le droit applicable aux wash trades

La prévention de l’auto-appariement est un service de la place. Vous y souscrivez, vous le configurez, et le moteur appariera volontiers vos deux ordres si vous ne l’avez jamais activé. L’interdiction des wash trades n’est pas facultative et ne dépend d’aucun paramétrage.

La section 9(a)(1) du Securities Exchange Act de 1934 vise les transactions sur valeurs mobilières n’entraînant aucun changement de bénéficiaire effectif et conclues pour donner une apparence trompeuse d’activité sur le marché. Le Commodity Exchange Act prévoit l’équivalent pour les futures, et la règle 534 du CME le reprend dans le règlement de la place. La règle 5210 de la FINRA s’applique aux broker-dealers dans les deux cadres. Ses dispositions complémentaires traitent directement des auto-appariements : les transactions entre deux algorithmes sans lien opérant au sein d’une même entreprise ne constituent pas, à elles seules, une violation, et l’entreprise est censée maintenir des politiques permettant de les examiner et de les réduire.

Deux conséquences en découlent pour toute personne qui exploite plusieurs stratégies. Un self-cross peut constituer une violation sur une place où vous n’avez configuré aucune instruction de prévention de l’auto-appariement, car la règle s’applique à la transaction et à l’intention qui la sous-tend. Un self-cross arrêté par la prévention de l’auto-appariement ne constitue aucune violation : empêcher ce type de transaction est précisément l’objectif du dispositif.

Configuration par les opérateurs : CME, ICE, LME et MiFID II

Sur CME Globex, la prévention de l’auto-appariement repose sur un identifiant transmis lors de l’entrée de l’ordre. Les entreprises enregistrent les identifiants qu’elles utiliseront. Chaque ordre en porte un. Une instruction associée précise quel côté le moteur doit annuler lorsque deux ordres portant cet identifiant se rencontrent. Les ordres envoyés sans identifiant sont normalement appariés. C’est le piège pour un nouvel opérateur : le paramétrage par défaut est désactivé.

ICE propose la Self-Trade Prevention Functionality. Elle est configurée avec un identifiant d’entreprise de trading plutôt qu’ordre par ordre, selon la même famille de modalités d’annulation. Le London Metal Exchange propose la Self-Execution Prevention sur LMEselect pour les identifiants de trading des membres. En Europe, l’article 17 de MiFID II impose des systèmes et contrôles à toute entreprise d’investissement pratiquant le trading algorithmique. Ces obligations couvrent les tests, la fonctionnalité kill et la prévention des conditions de marché désordonnées. L’article 48 impose une obligation parallèle à la place elle-même. Les outils de prévention côté place sont devenus des équipements standard.

La configuration s’effectue au niveau du compte ou de l’entreprise, et non symbole par symbole. La taille de la surface d’options d’un même sous-jacent l’explique.

RequêteContrats d’options avec volume sur un même sous-jacent, juin 2026
Le SQL exact derrière chaque chiffre
SELECT
    toString(date)                 AS session_date,
    countDistinct(ticker)          AS contracts_traded,
    countDistinct(strike_price)    AS strikes_traded
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
  AND date >= '2026-06-01'
  AND date <= '2026-06-30'
  AND volume > 0
  AND iv_converged = 1
GROUP BY date
ORDER BY date
Run this yourself

Le 2026-06-01, un sous-jacent comptait 1579 contrats négociables distincts avec du volume, répartis sur 112 strikes. Le panneau couvre 21 séances de profil comparable. À ce niveau, configurer une règle contrat par contrat est ingérable. L’identifiant est donc attaché au compte et accompagne chaque ordre envoyé par ce compte.

Le mode de défaillance que vos journaux d’exécution n’expliqueront pas

Voici ce qui se passe en pratique. Une instruction d’annulation du plus récent ordre supprime l’ordre que vous venez d’envoyer dès son arrivée, avant tout appariement. Dans le bot, la séquence apparaît comme un nouvel ordre suivi d’une annulation que personne n’a demandée. Il n’y a ni exécution, ni rejet, ni chaîne d’erreur indiquant la cause. Les opérateurs qui rencontrent ce cas pour la première fois cherchent donc souvent un bug dans leur propre logique d’annulation.

Deux habitudes permettent de le rendre lisible. Journalisez les messages de statut de la place mot pour mot, plutôt qu’un résumé normalisé, car la raison de la prévention figure généralement dans un champ de ce message. Déclenchez une alerte pour toute annulation qui n’a pas été générée par votre propre code. Cette alerte doit être rattachée à vos disjoncteurs du trading automatisé, car le mode de défaillance relève de la même catégorie : la place a modifié l’état de votre ordre, tandis que votre processus a continué comme si rien ne s’était passé.

FAQ

Qu’est-ce que la prévention de l’auto-appariement ?

Il s’agit d’un contrôle du matching engine qui empêche deux ordres portant le même identifiant d’entreprise ou de compte de se négocier entre eux. Lorsqu’ils vont s’apparier, le moteur annule l’ordre au repos, l’ordre entrant ou les deux, conformément à l’instruction associée à l’ordre.

Un auto-trade est-il la même chose qu’un wash trade ?

Non. Un auto-trade est toute exécution entre deux ordres du même bénéficiaire effectif. Un wash trade est un auto-trade conclu sans prise de risque réelle sur le marché et avec l’intention de donner une apparence trompeuse d’activité. Les auto-trades non intentionnels entre algorithmes sans lien sont traités différemment des transactions arrangées. Les entreprises doivent néanmoins les surveiller.

La prévention de l’auto-appariement fonctionne-t-elle entre différentes places ?

Non. Chaque matching engine applique le contrôle uniquement aux ordres présents dans son propre carnet. Deux ordres d’une même entreprise placés sur deux places peuvent se négocier entre eux. Les contrôles pré-trade internes de l’entreprise doivent alors prendre le relais en amont des places.

Pourquoi mon ordre a-t-il été annulé sans exécution ni raison ?

Une instruction d’annulation du plus récent ordre en cas d’auto-appariement est une possibilité. La place a annulé l’ordre à son arrivée, avant qu’il puisse s’apparier avec un ordre au repos portant votre identifiant. La raison figure généralement dans un champ du message d’annulation de la place, plutôt que dans un message de rejet.

Quelles places exigent un identifiant de prévention de l’auto-appariement ?

Les exigences varient selon la place et le produit. Le CME demande un identifiant lors de l’entrée de l’ordre et son enregistrement préalable. ICE et le London Metal Exchange proposent leurs propres configurations au niveau de l’entreprise. Les places européennes sont soumises aux obligations de systèmes et contrôles prévues par MiFID II. Le règlement de la place applicable au produit négocié fait foi.


Chaque panneau contient le SQL qui l’a produit. Développez-en un pour le consulter. Pour compter les places qui cotent une valeur que vous négociez ou répartir une séance selon les indicateurs de condition, formulez votre question en anglais courant sur le terminal Strasmore.

#market structure#matching engine#wash trades#trading bots#exchange rules