Come stimare la queue position dai dati L2
La queue position determina se un ordine passivo cattura lo spread. Ecco come stimarla tramite i dati aggregati del book e quando conviene acquistare feed MBO.
Perché la queue position è l'intero vantaggio competitivo
Un ordine passivo resta nel book in attesa che qualcun altro attraversi lo spread per colpirlo. Secondo la price-time priority, il motore di matching classifica gli ordini in attesa prima in base al prezzo e poi in base all'orario di arrivo. Se ci sono già 10.000 azioni in bid a 10,00 $ e ne aggiungi 100 dietro di loro, quelle 10.000 azioni devono essere scambiate o cancellate prima che arrivi il tuo turno. Se cancelli e reinserisci allo stesso prezzo, torni in fondo alla fila.
Questa classificazione determina l'economia dell'operazione. Vicino alla testa della fila scambi spesso e incassi lo spread più eventuali rebate per l'aggiunta di liquidità, argomento trattato in maker-taker fees and rebates. Vicino alla coda scambi solo dopo che tutti coloro che ti precedono sono stati serviti, il che accade quando arriva un flusso unidirezionale di dimensioni consistenti. I fill in coda si concentrano nei momenti immediatamente precedenti il superamento del tuo livello di prezzo. Stesso prezzo, stesso ordine, esito opposto.
Cosa possono e non possono mostrare i dati Level 2
Il Level 1 è il miglior bid e offer con la relativa size. Il Level 2, chiamato anche market by price, aggiunge profondità: un elenco di livelli di prezzo con la size totale in attesa su ciascuno. Entrambi sono aggregati e Level 1 vs Level 2 market data li confronta nel dettaglio. Quando il bid a 10,00 $ scende da 10.000 a 8.500 azioni, il feed segnala che 1.500 azioni sono sparite. Non dice se siano state scambiate, se sia uscito un ordine o quaranta, o dove fossero posizionate nella fila.
Le esecuzioni sono la metà visibile: il tape stampa ogni trade con una size, quindi quelle si sottraggono esattamente. Il resto è cancellazione, ed è qui che iniziano le congetture. Il pannello sottostante conta i messaggi al top of book consolidato rispetto ai print sul tape per un titolo liquido durante una sessione ordinaria, mercoledì 10 giugno 2026.
L'esatto SQL dietro ogni numero
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'ora 08:00 precede la campana di apertura: il top of book è cambiato 0.8 volte per ogni print, meno messaggi che print. Durante la sessione regolare il rapporto si inverte. Nell'ora 15:00 il top of book è cambiato 1.6 volte per ogni print, a fronte di 233433 messaggi solo in quell'ora. La maggior parte di ciò che accade a un livello di prezzo in un mercato aperto consiste in ordini che arrivano e se ne vanno senza mai essere scambiati, e ognuno di questi eventi sposta la tua posizione in fila di una quantità che nessun feed aggregato dichiara.
L'ipotesi di cancellazione uniforme e dove ti illude
Il primo approccio standard assume che le cancellazioni siano distribuite uniformemente nella coda. Chiamiamo x la tua profondità frazionaria: le azioni davanti a te divise per il totale in attesa al tuo prezzo. Il modello uniforme stabilisce che la probabilità che una qualsiasi azione cancellata si trovasse davanti a te sia uguale a x, scritta come p(x) = x. Se ti siedi a metà di una coda da 10.000 azioni, vedi 1.000 azioni cancellate senza print, il modello ti fa avanzare di 500 posizioni.
Le code reali sono asimmetriche. Un ordine che è rimasto in attesa per un po' tende ad appartenere a qualcuno disposto ad aspettare, mentre un ordine aggiunto un momento fa è molto più probabile che sia una quotazione fugace che scompare in pochi secondi. Le cancellazioni si concentrano verso la fine della fila, vicino a te e dietro di te. Di quelle 1.000 azioni cancellate, forse 200 si trovavano davanti a te, ma il modello te ne ha accreditate 500. Ripeti questo processo tutto il giorno e la coda simulata avanza più velocemente di quella reale. L'errore va in una sola direzione: più fill, nei momenti migliori, di quanti gli ordini reali ne raccolgano.
Come si svuotano le code
Le cancellazioni ti spostano in modo invisibile. I trade ti spostano in modo visibile, in base alla size dei print.
L'esatto SQL dietro ogni numero
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)I print inferiori a un round lot sono stati 90% del totale in questa sessione e 42.5% delle azioni. I blocchi di mille azioni o più sono stati 0.2% dei print e 19.9% del volume. Le code si svuotano a piccoli morsi, quindi il divario tra la posizione 2.000 e la 3.500 è composto da centinaia di print di attesa. Un simulatore che concede un fill dopo due grandi trade ha saltato la maggior parte del tape.
L'ordine che non puoi vedere
I feed di profondità troncano i dati. Se ricevi dieci livelli di prezzo e il tuo ordine si trova all'undicesimo, il tuo ordine è fuori dai dati: non conosci la size davanti ad esso, né gli ordini che si accodano dietro. A quel punto stai inventando il numero invece di stimarlo. La situazione è ordinaria, non esotica, poiché un ordine che non insegue il mercato si allontana rapidamente dall'interno.
L'esatto SQL dietro ogni numero
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_timeNel bucket 10:00 il miglior bid ha mediato 10,00 $ 290.29 e ha visitato 187 prezzi distinti in quindici minuti. Ognuno di questi prezzi è un livello separato su un titolo quotato in centesimi, quindi una vista a dieci livelli copre dieci centesimi di book. Un ordine lasciato a un prezzo durante una sessione come questa può trascorrere lunghi periodi sotto il livello più profondo che il suo proprietario può vedere.
Dove la queue position vale di più
La queue position vale di più dove il miglioramento del prezzo è impossibile. Un titolo bloccato su uno spread di un centesimo non lascia spazio per saltare la fila con un prezzo migliore: tutti si accumulano allo stesso tick e l'orario di arrivo risolve il resto. Dove lo spread è ampio diversi centesimi, un trader si posiziona davanti all'intera coda per un centesimo, e la decisione sul prezzo prevale sulla fila.
L'esatto SQL dietro ogni numero
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_centsIn quattro ore centrali della stessa sessione, il più stretto dei sei nomi, KO, ha mediato 1.18 centesimi di ampiezza e ha mostrato uno spread di un centesimo nel 82.5% dei suoi aggiornamenti. Il più ampio, MSFT, ha mediato 8.46 centesimi, con uno spread di un centesimo nel 1.1% degli aggiornamenti. Un modello di coda calibrato sul primo nome non dice nulla di utile sul secondo. Gli ordini che restano tra le quotazioni, trattati in midpoint peg orders, formano la propria fila secondo le stesse regole.
Quattro diagnostiche per il tuo backtest
- Confronta il tasso di fill simulato con il tuo tasso di fill reale sugli stessi nomi e nelle stesse ore. Un simulatore che esegue il 70% degli ordini che dal vivo sono stati eseguiti il 40% delle volte sta descrivendo la tua ipotesi, non il mercato.
- Dividi i fill simulati in due gruppi: quelli in cui il livello di prezzo è sopravvissuto dopo l'esecuzione e quelli avvenuti solo quando il livello è stato completamente svuotato. Un gruppo sbilanciato verso il secondo tipo significa che il simulatore ti assegna i fill proprio mentre il prezzo attraversa il tuo livello.
- Inquadra l'ipotesi. Riesegui il test con ogni cancellazione sottratta dalla testa della coda, poi con ogni cancellazione sottratta dalla coda. Queste due esecuzioni rappresentano le barre di errore oneste attorno a qualsiasi p(x) tu scelga.
- Misura quanto spesso il tuo prezzo si è seduto al di fuori della profondità fornita dal tuo feed. I fill in quel caso sono stati inventati. Look-ahead bias in backtesting descrive lo stesso fallimento da un'altra angolazione: un risultato basato su informazioni che la strategia non ha mai avuto.
Quando smettere di modellare e acquistare i dati sugli ordini
I dati market-by-order (MBO) contengono un messaggio per ogni singolo ordine, dal momento in cui arriva a quello in cui viene eseguito o cancellato, ognuno contrassegnato con il proprio identificativo. Riproduci quel feed e la tua posizione in fila è un conteggio piuttosto che una stima, una volta ipotizzato un ritardo realistico per l'arrivo del tuo ordine sulla sede di negoziazione. Costa più di un feed di profondità ed è molto più voluminoso da archiviare.
La diagnostica 3 è la regola decisionale. Se entrambe le parentesi (testa e coda) rendono la strategia redditizia, un'ipotesi intermedia sarà sufficiente. Se la strategia guadagna con una parentesi e perde con l'altra, il modello di coda è la strategia stessa, e acquistare il feed ordine per ordine è più economico che difendere una congettura.
Le sedi pro-rata cambiano la domanda
Alcuni mercati di futures e opzioni dividono un ordine in arrivo tra gli ordini in attesa a un prezzo in proporzione alla size piuttosto che per ordine di arrivo. Il tempo conta molto meno lì, e la size quotata diventa la leva: raddoppiare la tua size raddoppia approssimativamente la tua quota di ogni fill. La modalità di fallimento si sposta di conseguenza, verso la quotazione di una size maggiore di quella che si desidera detenere. Why options orders do not get filled copre come appare dal lato retail di un book di opzioni.
FAQ
Cos'è la queue position nel trading?
La queue position è il tuo rango tra gli ordini in attesa allo stesso prezzo sulla stessa sede di negoziazione. Su un book con priorità prezzo-tempo, gli ordini davanti a te devono essere scambiati o cancellati prima che il tuo possa essere scambiato.
Si può calcolare la queue position dai dati Level 2?
Non esattamente. Il Level 2 mostra la size totale per livello di prezzo senza identità dell'ordine, quindi quando la size scompare senza un print non puoi dire se quelle azioni si trovassero davanti o dietro di te. Puoi stimare il numero e inquadrare la stima. La cifra esatta richiede dati ordine per ordine.
Perché i tassi di fill dei backtest sono solitamente troppo alti?
L'ipotesi comune distribuisce le cancellazioni uniformemente nella coda, mentre le cancellazioni reali si concentrano verso la fine. Un modello uniforme fa avanzare il tuo ordine simulato più velocemente di quanto si muova la fila reale, il che si traduce in più fill, e migliori, di quanto il trading dal vivo offra.
Cos'è il dato MBO?
Il dato market-by-order fornisce messaggi per ogni singolo ordine, dall'arrivo fino all'esecuzione o alla cancellazione. È il feed in cui la tua posizione in fila è contabile anziché modellata, il che conta soprattutto per le strategie che vivono su uno spread di un tick.
La queue position conta nelle sedi pro-rata?
Meno. L'allocazione pro-rata divide un ordine in arrivo tra gli ordini in attesa in base alla size, quindi arrivare per primi serve a poco e la size quotata fa il lavoro. Verificare quale modello di allocazione utilizza una sede di negoziazione viene prima di qualsiasi modellazione della coda.