Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Wachtrijpositie schatten op basis van L2 data

De wachtrijpositie bepaalt of een passieve order de spread verdient. Leer hoe u deze positie schat uit geaggregeerde data en wanneer u beter kunt kiezen voor MBO data.

De wachtrijpositie is uw plek in de rij tussen de orders die op één prijsniveau rusten. Op een handelsplatform met prijs-tijd-prioriteit bepaalt deze positie of een passieve order de spread verdient of dat deze nooit wordt uitgevoerd. Geaggregeerde marktdata verstrekken dit getal niet: een Level 2-orderboek toont welk volume op elke prijs rust, maar nooit van wie dit is. Hieronder leest u hoe u de wachtrijpositie kunt schatten op basis van de data waarover de meeste handelaren beschikken, en hoe u vaststelt wanneer een schatting niet langer volstaat.

Waarom de wachtrijpositie het volledige voordeel bepaalt

Een passieve order rust in het orderboek en wacht tot een andere partij de spread oversteekt. Onder prijs-tijd-prioriteit rangschikt de matching engine rustende orders eerst op prijs en daarna op tijdstip van binnenkomst. Als er al 10.000 aandelen op de biedkant staan tegen $10,00 en u voegt er 100 achteraan toe, dan moeten die 10.000 aandelen eerst worden verhandeld of geannuleerd voordat u aan de beurt bent. Annuleert u en voert u de order opnieuw in tegen dezelfde prijs, dan sluit u weer achteraan in de rij aan.

Die rangschikking bepaalt de economische uitkomst. Vooraan in de rij handelt u vaak en int u de spread plus eventuele add-liquidity rebates, het onderwerp van maker-taker fees en rebates. Achteraan in de rij handelt u pas nadat iedereen voor u is bediend; dit gebeurt wanneer er eenzijdige orderstroom van omvang binnenkomt. Uitvoeringen achteraan in de rij clusteren op de momenten vlak voordat de koers door uw niveau heen breekt. Dezelfde prijs, dezelfde order, tegenovergestelde resultaten.

Wat Level 2-data wel en niet kunnen tonen

Level 1 is de beste bied- en laatprijs met het volume per zijde. Level 2, ook wel market by price genoemd, voegt diepte toe: een lijst met prijsniveaus en het totale volume dat op elk niveau rust. Beide zijn aggregaten, en Level 1 vs Level 2 marktdata vergelijkt deze volledig. Wanneer het biedvolume op $10,00 daalt van 10.000 naar 8.500 aandelen, rapporteert de feed dat er 1.500 aandelen zijn verdwenen. Er wordt niet vermeld of deze zijn verhandeld, of er één order is vertrokken of veertig, of waar in de rij deze zich bevonden.

Uitvoeringen zijn de zichtbare helft: de tape print elke transactie met een volume, dus die kunt u exact aftrekken. De rest is annulering, en bij annuleringen begint het gissen. Het onderstaande paneel telt berichten aan de geconsolideerde top van het orderboek tegenover prints op de tape voor één liquide aandeel gedurende één normale sessie, woensdag 10 juni 2026.

QueryTop of book berichten versus prints op de tape, AAPL, 10 juni 2026
De exacte SQL achter elk getal
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_time
Run this yourself

Het 08:00-uur ligt vóór de openingsbel: de top van het orderboek veranderde daar 0.8 keer per print, minder berichten dan prints. Binnen de reguliere sessie draait de verhouding om. In het 15:00-uur veranderde de top van het orderboek 1.6 keer per print, over 233433 berichten in dat uur alleen al. Het merendeel van wat er met een prijsniveau gebeurt in een open markt, bestaat uit orders die binnenkomen en vertrekken zonder ooit te worden verhandeld, en elk van die gebeurtenissen verschuift uw plek in de rij met een hoeveelheid die geen enkele geaggregeerde feed vermeldt.

De aanname van uniforme annulering, en waar deze u vleit

De standaard eerste benadering gaat ervan uit dat annuleringen gelijkmatig over de wachtrij zijn verspreid. Noem x uw fractionele diepte: de aandelen vóór u gedeeld door het totaal dat op uw prijs rust. Het uniforme model stelt de kans dat een geannuleerd aandeel vóór u stond gelijk aan x, genoteerd als p(x) = x. Als u halverwege een wachtrij van 10.000 aandelen staat en 1.000 aandelen ziet annuleren zonder print, schuift het model u 500 plaatsen op.

Echte wachtrijen vertonen scheefheid. Een order die al een tijdje rust, is meestal van iemand die bereid is te wachten, terwijl een order die zojuist is toegevoegd veel vaker een vluchtige quote is die binnen seconden verdwijnt. Annuleringen concentreren zich naar de achterkant van de rij, bij u en achter u. Van die 1.000 geannuleerde aandelen stonden er misschien 200 vóór u, terwijl het model u er 500 toerekende. Herhaal dit de hele dag en de gesimuleerde wachtrij schuift sneller op dan de echte. De foutmarge werkt één kant op: meer uitvoeringen, op betere momenten, dan live orders in werkelijkheid ontvangen.

Hoe de wachtrij leegloopt

Annuleringen verplaatsen u onzichtbaar. Transacties verplaatsen u zichtbaar, in de omvang van de prints.

QueryUitsplitsing van AAPL prints naar trade size, 10 juni 2026
De exacte SQL achter elk getal
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)
Run this yourself

Prints onder een round lot waren 90% van het totaal in deze sessie en 42.5% van de aandelen. Blokken van duizend aandelen of meer waren 0.2% van de prints en 19.9% van het volume. Wachtrijen lopen leeg in kleine beetjes, dus het gat tussen positie 2.000 en positie 3.500 bestaat uit honderden prints wachten. Een simulator die een uitvoering toekent na twee grote transacties, heeft het grootste deel van de tape overgeslagen.

De order die u niet kunt zien

Diepte-feeds zijn afgekapt. Als u tien prijsniveaus ontvangt en uw order rust op het elfde, bevindt uw order zich buiten de data: niet het volume ervoor, en niet de orders die erachter aansluiten. Op dat punt bent u het getal aan het verzinnen in plaats van het te schatten. De situatie is alledaags in plaats van exotisch, aangezien een order die de markt niet najaagt, snel wegvalt van de binnenkant.

QueryDe best bid en de bezochte prijsniveaus, AAPL, 15-minuten buckets
De exacte SQL achter elk getal
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_time
Run this yourself

In de 10:00-bucket bedroeg de beste biedprijs gemiddeld $290.29 en bezocht deze 187 verschillende prijzen binnen vijftien minuten. Elk van die prijzen is een afzonderlijk niveau voor een aandeel dat in centen wordt genoteerd, dus een weergave van tien niveaus beslaat tien cent aan orderboek. Een order die op één prijs blijft staan tijdens een sessie als deze, kan lange periodes doorbrengen onder het diepste niveau dat de eigenaar kan zien.

Waar de wachtrijpositie het meest waard is

De wachtrijpositie is het meest waard waar prijsverbetering onmogelijk is. Een aandeel dat vastzit op een spread van één cent laat geen ruimte om de rij in te halen met een betere prijs: iedereen stapelt zich op dezelfde tick, en het tijdstip van binnenkomst bepaalt de rest. Waar de spread enkele centen breed is, stapt een handelaar voor een cent voor de hele wachtrij, en de prijsbeslissing weegt zwaarder dan de rij.

QueryGemiddelde quoted spread en tijd op een spread van één cent, middag 10 juni 2026
De exacte SQL achter elk getal
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_cents
Run this yourself

Over vier middaguren van dezelfde sessie bedroeg de krapste van de zes namen, KO, gemiddeld 1.18 cent breed en toonde deze een spread van één cent op 82.5% van de updates. De breedste, MSFT, bedroeg gemiddeld 8.46 cent, met een spread van één cent op 1.1% van de updates. Een wachtrijmodel dat is gekalibreerd op de eerste naam zegt niets nuttigs over de tweede. Orders die tussen de quotes rusten, behandeld in midpoint peg orders, vormen hun eigen rij onder dezelfde regels.

Vier diagnostische punten voor uw eigen backtest

  1. Vergelijk het gesimuleerde uitvoeringspercentage met uw live uitvoeringspercentage voor dezelfde namen over dezelfde uren. Een simulator die 70% van de orders uitvoert die live 40% van de tijd werden uitgevoerd, beschrijft uw aanname, niet de markt.
  2. Splits gesimuleerde uitvoeringen in twee stapels: die waarbij het prijsniveau daarna bleef bestaan, en die waarbij de uitvoering pas plaatsvond toen het niveau volledig werd leeggemaakt. Een stapel die zwaarder weegt naar het tweede type betekent dat de simulator u uitvoeringen geeft precies op het moment dat de koers door uw niveau heen handelt.
  3. Klem de aanname in. Voer de simulatie opnieuw uit waarbij elke annulering van de voorkant van de wachtrij wordt gehaald, en vervolgens waarbij elke annulering van de achterkant wordt gehaald. Die twee runs vormen de eerlijke foutmarges rond elke p(x) die u kiest.
  4. Meet hoe vaak uw prijs buiten de diepte viel die uw feed bevat. Uitvoeringen daar waren verzonnen. Look-ahead bias in backtesting beschrijft dezelfde fout vanuit een andere hoek: een resultaat dat rust op informatie waarover de strategie nooit beschikte.

Wanneer u moet stoppen met modelleren en de orderdata moet kopen

Market-by-order data (MBO) bevat een bericht voor elke individuele order, vanaf het moment van binnenkomst tot het moment van uitvoering of annulering, elk voorzien van een eigen identificatiecode. Speel die feed af en uw plek in de rij is een telling in plaats van een schatting, zodra u een realistische vertraging aanneemt voor het bereiken van het platform door uw eigen order. Het kost meer dan een diepte-feed en het opslaan ervan vergt veel meer capaciteit.

Diagnostisch punt 3 is de beslissingsregel. Als zowel de voorste als de achterste klem de strategie winstgevend laten, volstaat een gemiddelde aanname. Als de strategie geld verdient onder de ene klem en verliest onder de andere, is het wachtrijmodel de strategie zelf, en is het kopen van de order-by-order feed goedkoper dan het verdedigen van een gok.

Pro-rata platformen veranderen de vraag

Sommige futures- en optiemarkten splitsen een inkomende order over de rustende orders op een prijsniveau in verhouding tot het volume in plaats van op volgorde van binnenkomst. Tijd is daar veel minder relevant en het genoteerde volume wordt de hefboom: uw volume verdubbelen betekent grofweg een verdubbeling van uw aandeel in elke uitvoering. De foutmodus verschuift mee, richting het noteren van meer volume dan u wilt bezitten. Waarom optieorders niet worden uitgevoerd behandelt hoe dat eruitziet vanaf de retailkant van een optieorderboek.

Veelgestelde vragen

Wat is wachtrijpositie in de handel?

De wachtrijpositie is uw rangorde tussen de orders die op dezelfde prijs op hetzelfde platform rusten. Op een orderboek met prijs-tijd-prioriteit moeten de orders vóór u worden verhandeld of geannuleerd voordat de uwe kan worden verhandeld.

Kunt u de wachtrijpositie berekenen uit Level 2-data?

Niet exact. Level 2 toont het totale volume per prijsniveau zonder orderidentiteit, dus wanneer volume verdwijnt zonder print, kunt u niet zien of die aandelen vóór u of achter u stonden. U kunt het getal schatten en de schatting inklemmen. Voor het exacte cijfer is order-by-order data nodig.

Waarom zijn backtested uitvoeringspercentages meestal te hoog?

De gebruikelijke aanname verspreidt annuleringen gelijkmatig over de wachtrij, terwijl echte annuleringen zich concentreren naar de achterkant. Een uniform model laat uw gesimuleerde order sneller opschuiven dan de echte rij beweegt, wat zich vertaalt in meer en betere uitvoeringen dan live handel oplevert.

Wat is MBO-data?

Market-by-order data geeft elke individuele order eigen berichten, van binnenkomst tot uitvoering of annulering. Dit is de feed waarbij uw plek in de rij telbaar is in plaats van gemodelleerd, wat het belangrijkst is voor strategieën die leven op een spread van één tick.

Doet de wachtrijpositie ertoe op pro-rata platformen?

Minder. Pro-rata allocatie splitst een inkomende order over rustende orders op basis van volume, dus als eerste aankomen levert u weinig op en het genoteerde volume doet het werk. Controleren welk allocatiemodel een platform gebruikt, gaat vooraf aan elke wachtrijmodellering.


Elk paneel hier bevat de SQL die het heeft gegenereerd. Wijzig de ticker, verplaats de datum en stel dezelfde vraag over de namen die u verhandelt op de Strasmore-terminal.