Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Como estimar a posição na fila usando dados de Level 2

A posição na fila define se uma ordem passiva captura o spread. Aprenda a estimar esse lugar com dados agregados e saiba quando migrar para o MBO para maior precisão.

A posição na fila é o seu lugar na ordem de chegada entre as ordens que aguardam em um determinado preço. Em um ambiente de prioridade preço-tempo, ela decide se uma ordem passiva captura o spread ou se nunca é executada. Dados de mercado agregados não fornecem esse número: o book de Level 2 mostra o volume total em cada preço, mas nunca a quem pertence. A seguir, explicamos como estimar a posição na fila a partir dos dados disponíveis para a maioria dos traders e como identificar quando essa estimativa deixa de ser suficiente.

Por que a posição na fila é a única vantagem

Uma ordem passiva permanece no book aguardando que alguém cruze o spread até ela. Sob a prioridade preço-tempo, o motor de execução classifica as ordens primeiro pelo preço e, em segundo lugar, pela ordem de chegada. Se já existem 10.000 ações na compra a US$ 10,00 e você adiciona 100 atrás delas, essas 10.000 ações precisam ser executadas ou canceladas antes que chegue a sua vez. Se cancelar e inserir novamente no mesmo preço, você volta para o final da fila.

Essa classificação define a economia da operação. Perto do início, você opera com frequência e captura o spread somado a qualquer rebate de liquidez, tema de taxas e rebates maker-taker. Perto do final, você só opera depois que todos à sua frente foram atendidos, o que ocorre quando há um fluxo unilateral de grande volume. As execuções no final da fila concentram-se nos momentos anteriores ao rompimento do nível de preço. Mesmo preço, mesma ordem, resultados opostos.

O que os dados de Level 2 podem e não podem mostrar

O Level 1 é a melhor oferta de compra e venda com o volume em cada uma. O Level 2, também chamado de market by price, adiciona profundidade: uma lista de níveis de preço com o volume total em cada um. Ambos são agregados, e Level 1 vs Level 2 market data os compara detalhadamente. Quando a oferta a US$ 10,00 cai de 10.000 para 8.500 ações, o feed informa que 1.500 ações desapareceram. Ele não diz se foram executadas, se uma ordem saiu ou quarenta, ou em que posição da fila elas estavam.

As execuções são a metade visível: o tape registra cada negócio com um volume, então esses você subtrai exatamente. O restante é cancelamento, e é no cancelamento que as suposições começam. O painel abaixo contabiliza mensagens no topo do book consolidado em relação aos negócios no tape para uma ação líquida durante um pregão comum, quarta-feira, 10 de junho de 2026.

QueryMensagens no topo do book vs. prints na fita, AAPL, 10 de junho de 2026
O SQL exato por trás de cada número
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

A hora 08:00 antecede o sino de abertura: o topo do book mudou 0.8 vezes por negócio, menos mensagens do que negócios. Durante o pregão regular, a proporção inverte. Na hora 15:00, o topo do book mudou 1.6 vezes por negócio, totalizando 233433 mensagens apenas nessa hora. A maior parte do que acontece em um nível de preço em um mercado aberto são ordens chegando e saindo sem nunca serem executadas, e cada um desses eventos altera sua posição na fila em um montante que nenhum feed agregado informa.

A suposição de cancelamento uniforme e onde ela o favorece

A abordagem padrão assume que os cancelamentos são distribuídos uniformemente pela fila. Chame de x sua profundidade fracionária: as ações à sua frente divididas pelo total no seu preço. O modelo uniforme define a chance de qualquer ação cancelada estar à sua frente como igual a x, escrita como p(x) = x. Se você está na metade de uma fila de 10.000 ações e vê 1.000 ações serem canceladas sem negócio, o modelo o adianta 500 posições.

Filas reais são assimétricas. Uma ordem que já está lá há algum tempo tende a pertencer a alguém disposto a esperar, enquanto uma ordem adicionada há pouco tempo é muito mais propensa a ser uma cotação passageira que desaparece em segundos. Os cancelamentos concentram-se no final da fila, perto de você e atrás de você. Das 1.000 ações canceladas, talvez 200 estivessem à sua frente, mas o modelo o creditou com 500. Repita isso o dia todo e a fila simulada avança mais rápido que a real. O erro ocorre em uma direção: mais execuções, em momentos melhores, do que as ordens reais conseguem capturar.

Como a fila é drenada

Os cancelamentos movem você de forma invisível. Os negócios movem você de forma visível, no volume dos prints.

QueryDistribuição dos prints da AAPL por tamanho de lote, 10 de junho de 2026
O SQL exato por trás de cada número
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

Negócios abaixo de um lote padrão foram 90% da contagem nesta sessão e 42.5% das ações. Blocos de mil ações ou mais foram 0.2% dos negócios e 19.9% do volume. As filas são drenadas em pequenas partes, então a diferença entre a posição 2.000 e a 3.500 representa centenas de negócios de espera. Um simulador que concede uma execução após dois grandes negócios ignorou a maior parte do tape.

A ordem que você não consegue ver

Os feeds de profundidade são truncados. Se você recebe dez níveis de preço e sua ordem está no décimo primeiro, ela está fora dos dados: não há informação sobre o volume à frente dela, nem sobre as ordens que entram atrás. Nesse ponto, você está inventando o número, não o estimando. A situação é comum, já que uma ordem que não persegue o mercado rapidamente se afasta do interior do book.

QueryMelhor bid e níveis de preço visitados, AAPL, buckets de 15 minutos
O SQL exato por trás de cada número
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

No bucket 10:00, a melhor oferta de compra teve média de US$ 290.29 e visitou 187 preços distintos em quinze minutos. Cada um desses preços é um nível separado em uma ação cotada em centavos, então uma visão de dez níveis cobre dez centavos de book. Uma ordem deixada em um preço durante um pregão como este pode passar longos períodos abaixo do nível mais profundo que seu proprietário consegue ver.

Onde a posição na fila vale mais

A posição na fila vale mais onde a melhoria de preço é impossível. Uma ação travada em um spread de um centavo não deixa espaço para pular a fila com um preço melhor: todos se acumulam no mesmo tick, e a ordem de chegada decide o resto. Onde o spread é de vários centavos, um trader pode passar à frente de toda a fila por um centavo, e a decisão de preço supera a fila.

QuerySpread cotado médio e tempo em spread de um centavo, meio-dia de 10 de junho de 2026
O SQL exato por trás de cada número
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

Ao longo de quatro horas do meio do pregão, o ativo mais estreito dos seis, KO, teve média de 1.18 centavos de spread e mostrou um spread de um centavo em 82.5% de suas atualizações. O mais amplo, MSFT, teve média de 8.46 centavos, com spread de um centavo em 1.1% das atualizações. Um modelo de fila calibrado para o primeiro ativo não diz nada útil sobre o segundo. Ordens que ficam entre as cotações, cobertas em midpoint peg orders, formam sua própria fila sob as mesmas regras.

Quatro diagnósticos para seu backtest

  1. Compare a taxa de execução simulada com sua taxa de execução real nos mesmos ativos e horários. Um simulador que executa 70% das ordens, enquanto na realidade você executa 40%, está descrevendo sua suposição, não o mercado.
  2. Divida as execuções simuladas em dois grupos: aquelas em que o nível de preço sobreviveu depois e aquelas que ocorreram apenas quando o nível foi completamente limpo. Um grupo com peso no segundo tipo significa que o simulador lhe entrega execuções exatamente quando o preço rompe seu nível.
  3. Estabeleça limites para a suposição. Rode novamente com todos os cancelamentos retirados do início da fila e, depois, com todos retirados do final. Essas duas execuções são as margens de erro honestas em torno de qualquer p(x) que você escolher.
  4. Meça com que frequência seu preço ficou fora da profundidade que seu feed fornece. Execuções ali foram inventadas. Look-ahead bias in backtesting descreve a mesma falha sob outro ângulo: um resultado baseado em informações que a estratégia nunca teve.

Quando parar de modelar e comprar os dados de ordens

Dados de market-by-order (MBO) carregam uma mensagem para cada ordem individual, desde o momento em que chega até o momento em que é executada ou cancelada, cada uma marcada com seu próprio identificador. Ao reproduzir esse feed, seu lugar na fila é uma contagem, não uma estimativa, desde que você assuma um atraso realista para sua própria ordem chegar à bolsa. Custa mais que um feed de profundidade e exige muito mais armazenamento.

O diagnóstico 3 é a regra de decisão. Se os limites superior e inferior deixam a estratégia lucrativa, uma suposição intermediária servirá. Se a estratégia lucra sob um limite e perde sob o outro, o modelo de fila é a própria estratégia, e comprar o feed ordem por ordem é mais barato do que defender um palpite.

Ambientes pro-rata mudam a questão

Alguns mercados de futuros e opções dividem uma ordem recebida entre as ordens existentes em um preço, proporcionalmente ao volume, em vez de por ordem de chegada. O tempo importa muito menos nesses casos, e o volume cotado torna-se a alavanca: dobrar seu volume aproximadamente dobra sua fatia de cada execução. O modo de falha muda com isso, em direção a cotar mais volume do que você deseja deter. Why options orders do not get filled cobre como isso parece do lado do varejo de um book de opções.

FAQ

O que é posição na fila no trading?

A posição na fila é sua classificação entre as ordens que aguardam no mesmo preço na mesma bolsa. Em um book de prioridade preço-tempo, as ordens à sua frente precisam ser executadas ou canceladas antes que a sua possa ser executada.

É possível calcular a posição na fila a partir de dados de Level 2?

Não exatamente. O Level 2 mostra o volume total por nível de preço sem identificar as ordens, então, quando o volume desaparece sem um negócio, você não consegue saber se essas ações estavam à sua frente ou atrás de você. Você pode estimar o número e estabelecer limites para a estimativa. O valor exato requer dados ordem por ordem.

Por que as taxas de execução em backtests costumam ser muito altas?

A suposição comum espalha os cancelamentos uniformemente pela fila, enquanto os cancelamentos reais se concentram no final. Um modelo uniforme adianta sua ordem simulada mais rápido do que a fila real se move, o que aparece como mais execuções, e melhores, do que o trading real entrega.

O que são dados MBO?

Dados de market-by-order fornecem mensagens para cada ordem individual, desde a chegada até a execução ou cancelamento. É o feed onde seu lugar na fila é contável em vez de modelado, o que importa mais para estratégias que vivem em um spread de um tick.

A posição na fila importa em ambientes pro-rata?

Menos. A alocação pro-rata divide uma ordem recebida entre as ordens existentes pelo volume, então chegar primeiro ajuda pouco e o volume cotado faz o trabalho. Verificar qual modelo de alocação uma bolsa usa vem antes de qualquer modelagem de fila.


Cada painel aqui contém o SQL que o produziu. Altere o ticker, mude a data e faça a mesma pergunta sobre os ativos que você opera no terminal Strasmore.