Por que market makers perdem dinheiro? Seleção adversa
Entenda como a seleção adversa reduz o ganho do spread, como curvas de markout medem o efeito e como risco de inventário e posição na fila pesam.
Market makers perdem dinheiro com seleção adversa: o trader que executa contra uma oferta muitas vezes é justamente quem já sabe que essa oferta está desatualizada. Cada execução começa com um pequeno crédito, aproximadamente metade do spread, e os segundos seguintes determinam quanto desse crédito permanece. A ferramenta de medição é o markout, uma variação de preço com sinal em um horizonte fixo após a execução. Os painéis abaixo constroem curvas reais de markout a partir de prints de negócios e de cotações. Nosso texto complementar sobre como os market makers ganham dinheiro aborda o lado da receita do mesmo balanço.
O que é seleção adversa nas negociações?
Um market maker divulga dois preços ao mesmo tempo: um bid para comprar e uma oferta para vender, cada um válido para uma quantidade definida. A diferença entre eles é o spread entre bid e ask, e o negócio é uma questão de aritmética. Comprar no bid, vender na oferta, repetir dezenas de milhares de vezes por dia e, em média, obter algo próximo do spread em cada ida e volta.
Essa aritmética pressupõe que os dois lados chegam de forma equilibrada. Não chegam. Uma cotação passiva é uma opção em aberto que qualquer pessoa pode exercer no momento que escolher, e os traders mais atentos selecionam os melhores momentos. Um fundo que executa uma ordem-mãe grande continua comprando enquanto a oferta permanece barata. Um sistema que já viu um ativo correlacionado se mover toma o lado que ainda não foi reajustado.
Seleção adversa é o nome dado à assimetria nessa composição: as execuções recebidas pelo market maker são concentradas nos traders que mais queriam executá-las. O sintoma é a diferença entre o spread que o market maker cota e o spread que consegue manter.
O que é markout na atividade de market making?
O markout responde a uma pergunta feita após cada execução: onde estava o preço um número fixo de segundos depois, medido a partir do lado em que eu estava? Suponha que um market maker venda 100 ações a US$ 50,02 enquanto o midpoint esteja em US$ 50,00. Essa execução começa com um crédito de dois centavos por ação, ou 20 mils nas unidades da mesa, sendo que um mil corresponde a um décimo de centavo. Se o midpoint subir para US$ 50,04 60 segundos depois, o markout de 60 segundos será de menos 20 mils. O crédito inicial desapareceu, junto com mais 20 mils.
Calcule a média disso em todas as execuções de uma janela e trace o resultado contra o horizonte. O resultado é uma curva de markout. O painel abaixo constrói uma para AAPL em uma janela de três horas no meio do dia, na quinta-feira, 14 de maio de 2026. Cada print recebe sinal em relação ao midpoint do segundo em que ocorreu: um print acima do midpoint conta como compra do taker, o que coloca o market maker no lado vendedor.
O SQL exato por trás de cada número
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
concat('+', toString(e.secs), 's') AS horizon,
round(1000 * avg(e.taker_side * (e.px - e.mid_at_fill)), 2) AS edge_at_fill_mils,
round(1000 * avg(e.taker_side * (e.px - f.mid)), 2) AS edge_after_mils
FROM (
SELECT toUInt32(ts + secs) AS future_ts, secs, px, mid_at_fill, taker_side
FROM (SELECT *, arrayJoin([1, 5, 15, 30, 60, 300]) AS secs FROM fills)
) AS e
INNER JOIN qs AS f ON f.ts = e.future_ts
GROUP BY e.secs
ORDER BY e.secsA primeira série é o crédito no instante da execução, a distância entre o print e o midpoint, com média de 19.66 mils por ação. A segunda série mostra quanto essas mesmas execuções valem depois que o midpoint teve tempo para se mover: 20.5 mils um segundo depois e 9.81 mils cinco minutos depois. A distância entre as duas séries em qualquer horizonte é o markout, que sai do spread cotado pelo market maker.
Uma curva que cai rapidamente e depois se estabiliza descreve um market maker que paga pelo reajuste imediato e preserva o restante. Uma curva que continua inclinada na mesma direção em todos os horizontes descreve execuções que ocorrem do lado errado de um preço que continua avançando. A primeira forma é um custo da operação. A segunda indica que a cotação precisa mudar.
Quais execuções correspondem a fluxo tóxico?
A palavra tóxico tem aqui uma função técnica. O fluxo é tóxico quando sua curva de markout se inclina contra o market maker que executou a ordem, em todos os horizontes, em uma amostra ampla. As mesas classificam as execuções por todos os rótulos disponíveis: tamanho do print, venue, tipo de ordem e identificador da contraparte. O tamanho é o rótulo carregado pelo tape público.
O SQL exato por trás de cada número
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
multiIf(s.shares < 100, 'under 100 shares',
s.shares < 500, '100 to 499',
s.shares < 1000, '500 to 999',
'1,000 or more') AS size_bucket,
count() AS fills_count,
round(1000 * avg(s.taker_side * (s.px - s.mid_at_fill)), 2) AS edge_at_fill_mils,
round(1000 * avg(s.taker_side * (s.px - f.mid)), 2) AS edge_after_60s_mils
FROM (SELECT *, toUInt32(ts + 60) AS future_ts FROM fills) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY size_bucket
ORDER BY min(s.shares)Execuções de menos de 100 ações começam com um crédito de 19.47 mils por ação e valem 15.22 mils um minuto depois. Prints de 1.000 ações ou mais começam com 36.26 mils e valem 21.34 mils no mesmo horizonte. Mesmo ativo, mesmas três horas, economia diferente por ação. As maiores ordens frequentemente evitam totalmente a fila pública, que é justamente o objetivo de uma operação em bloco.
Risco de estoque: a posição que não pode ser protegida a tempo
O horizonte do markout também é um relógio. Um market maker que compra 5.000 ações no bid fica com 5.000 ações e, até proteger ou vender a posição, fica exposto ao que o preço fizer em seguida. A proteção raramente é instantânea: uma posição em uma ação pode ser compensada com um ETF correlacionado ou uma posição em opções, e cada uma dessas alternativas tem seu próprio spread a cruzar. O risco de estoque é o tamanho do movimento que cabe nessa janela e é medido da mesma forma para qualquer ativo. Até que distância o preço costuma se deslocar no minuto seguinte e na hora seguinte?
O SQL exato por trás de cada número
WITH
bars AS (
SELECT ticker, window_start,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
toFloat64(close) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA')
AND window_start >= '2026-05-01 00:00:00'
AND window_start < '2026-06-01 00:00:00'
AND transactions >= 50
AND close > 0
),
starts AS (
SELECT ticker, et_date, px, mins,
window_start + toIntervalMinute(mins) AS future_start
FROM (SELECT *, arrayJoin([1, 2, 5, 15, 30, 60]) AS mins FROM bars)
)
SELECT
concat(toString(s.mins), ' min') AS hold_horizon,
round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'SPY'), 1) AS spy_drift_bps,
round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'NVDA'), 1) AS nvda_drift_bps
FROM starts AS s
INNER JOIN bars AS f
ON f.ticker = s.ticker AND f.et_date = s.et_date AND f.window_start = s.future_start
GROUP BY s.mins
HAVING countIf(s.ticker = 'SPY') > 0 AND countIf(s.ticker = 'NVDA') > 0
ORDER BY s.minsAo longo de maio de 2026, o movimento absoluto médio do SPY em um minuto foi de 1.9 pontos-base, sendo que um ponto-base corresponde a um centésimo de 1%. O NVDA registrou 5.5 no mesmo minuto. Ao estender o relógio para uma hora, os dois números passam a ser 14.1 e 40.4. Um market maker que consegue zerar a posição em um minuto convive com o primeiro par. Um market maker que mantém a posição por uma hora convive com o segundo par, e o crédito recebido na execução é idêntico nos dois casos.
Por que os market makers perdem dinheiro no fim da fila
As bolsas combinam ordens passivas no mesmo preço pela ordem de chegada: primeiro o preço, depois o tempo. Uma ordem no fim de uma fila de 40.000 ações no bid espera que as 40.000 ações à sua frente sejam executadas, e estimar a posição na fila é uma disciplina própria.
A parte difícil é definir o que significa esvaziar a fila. Uma fila se esvazia de duas formas. Os vendedores continuam executando contra o bid até esgotar o nível, ou o preço cai através desse nível e o deixa para trás. Uma ordem próxima da frente participa dos dois caminhos. Uma ordem no fim da fila é executada principalmente pelo segundo caminho, no momento em que o nível está prestes a se tornar o preço antigo. Dois market makers podem negociar o mesmo ativo ao mesmo preço e manter quantidades diferentes desse preço. O lugar na fila nunca aparece no spread cotado, pois os dois market makers cotaram o mesmo preço. Ele aparece na curva de markout.
Por que ampliar a cotação não é uma solução gratuita
A resposta óbvia a uma curva de markout ruim é cotar mais longe. Uma cotação mais ampla gera mais por execução e resulta em menos execuções. As duas partes dessa troca aparecem nos prints do mesmo dia, classificados pela distância de cada print em relação ao midpoint.
O SQL exato por trás de cada número
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
multiIf(s.cents <= 0.5, '0.5 cents or less',
s.cents <= 1.0, '0.5 to 1 cent',
s.cents <= 2.0, '1 to 2 cents',
'over 2 cents') AS distance_from_mid,
round(100 * sum(s.shares) / sum(sum(s.shares)) OVER (), 2) AS share_of_volume_pct,
round(1000 * avg(s.taker_side * (s.px - f.mid)), 2) AS edge_after_60s_mils
FROM (
SELECT *, toUInt32(ts + 60) AS future_ts, abs(px - mid_at_fill) * 100 AS cents
FROM fills
) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY distance_from_mid
ORDER BY min(s.cents)Prints a até meio centavo do midpoint representaram 27.58 por cento das ações na janela e valiam 0.95 mils por ação um minuto depois. Prints a mais de dois centavos do midpoint representaram 33.19 por cento das ações, a 46.86 mils. Uma cotação mais distante do midpoint é alcançada por uma parcela menor do volume do dia.
A taxa de execução é o primeiro custo de recuar. Os rebates das bolsas são o segundo, pois muitas venues pagam ao market maker por ação executada, e essa receita varia com o número de ações, não com a largura da cotação. As faixas de volume que definem o rebate são contabilizadas mensalmente, de modo que um mês fraco altera o valor de cada execução no mês seguinte. Abrir mão do lugar na fila é o último custo: ele é pago na saída e novamente no fim da fila na entrada. Todo market maker ocupa algum ponto dessa curva, e aqueles que medem seus próprios markouts com maior precisão podem permanecer mais próximos do touch e ainda preservar o crédito. Essa medição é a vantagem que os maiores market makers defendem.
Perguntas frequentes
Os market makers perdem dinheiro em operações individuais?
Com frequência. Uma carteira de market making é composta por pequenos ganhos e pequenas perdas, e as execuções perdedoras se concentram nos momentos imediatamente anteriores a um movimento de preço. O negócio depende da média de milhões de execuções.
O que é markout em trading?
Markout é a variação do preço de mercado em um horizonte fixo após uma execução, com sinal definido do ponto de vista de um dos lados. Um número positivo significa que esse lado ganhou. As mesas de ações cotam markouts em mils por ação, e as mesas de opções, em ticks por contrato.
O que significa fluxo de ordens tóxico?
É o fluxo de ordens cuja curva de markout se inclina persistentemente contra o market maker que o executa. Isso significa que o preço continua se afastando após cada execução. O rótulo é uma propriedade estatística de um fluxo de ordens e não representa um julgamento sobre nenhum trader específico.
Por que os market makers ampliam os spreads em vez de retirar as cotações?
Uma cotação mais ampla mantém o market maker no mercado a um preço que compensa uma curva de markout pior. Retirar a cotação não gera receita e faz perder a posição na fila. As mesas fazem as duas coisas, e a escolha depende de quanto tempo se espera que a cotação permaneça desatualizada.
Como a seleção adversa é medida?
Com markouts. Atribua sinal a cada execução de acordo com o lado em que o market maker estava e calcule a média da variação do midpoint em horizontes fixos depois da execução. A diferença entre o crédito na execução e o valor em cada horizonte é o custo da seleção adversa, nas mesmas unidades do spread.
Como estes números foram construídos
Cada painel de AAPL usa dois registros públicos: o tape de negócios e o tape de cotações. Cada print entre 14:00 e 17:00 UTC em 14 de maio de 2026 é associado ao midpoint médio do melhor bid e da melhor oferta nacionais no segundo em que ocorreu e depois recebe sinal. Um print acima desse midpoint conta como compra do taker, colocando o market maker no lado vendedor. Prints exatamente no midpoint não recebem lado e são descartados, assim como qualquer print mais de 2% distante do midpoint. Registros de cotações em que o bid encontra ou cruza a oferta são excluídos, pois um mercado travado ou cruzado não tem midpoint utilizável.
A associação no nível do segundo aproxima a cotação vigente no microssegundo da execução e suaviza as atualizações mais rápidas. Os preços nos horizontes vêm dos mesmos midpoints no nível do segundo. O painel de estoque usa barras de um minuto e mantém apenas barras com pelo menos 50 prints, concentrando a amostra nos horários de maior atividade do dia.
Cada painel aqui traz o SQL que o produziu, de modo que a matemática do markout pode ser examinada linha a linha. Para reconstruir a curva para outro ativo ou outro dia, solicite isso em inglês simples no terminal da Strasmore.