Por qué los market makers pierden: selección adversa
La selección adversa explica pérdidas de los market makers. Aprende a medirla con curvas de markout y conoce el riesgo de inventario y el costo de la posición en la cola.
Los market makers pierden dinero por selección adversa: el trader que toma una oferta suele ser quien ya sabe que esa oferta está desactualizada. Cada ejecución comienza con un pequeño crédito, aproximadamente la mitad del spread, y los segundos siguientes determinan cuánto de ese crédito sobrevive. La herramienta de medición es el markout, un cambio de precio con signo en un horizonte fijo después de una ejecución. Los paneles siguientes construyen curvas de markout reales a partir de prints de operaciones y cotizaciones. Nuestro artículo complementario sobre cómo ganan dinero los market makers cubre el lado de los ingresos de la misma contabilidad.
¿Qué es la selección adversa en trading?
Un market maker publica dos precios al mismo tiempo: un bid para comprar y una oferta para vender, cada uno válido para un tamaño determinado. La diferencia entre ambos es el spread bid ask, y el negocio es aritmético. Comprar en el bid, vender en la oferta y repetirlo decenas de miles de veces al día permite capturar, en promedio, un importe cercano al spread en cada ida y vuelta.
Ese cálculo supone que ambos lados llegan de forma equilibrada. No ocurre así. Una cotización pasiva es una opción permanente que cualquiera puede ejercer en el momento que elija, y los traders más atentos seleccionan los mejores momentos. Un fondo que ejecuta una orden principal grande sigue comprando mientras la oferta permanece barata. Un sistema que ya ha observado el movimiento de un instrumento correlacionado toma el lado que todavía no se ha ajustado.
La selección adversa es el nombre de ese sesgo: las ejecuciones que recibe un market maker están inclinadas hacia los traders que más las querían. El síntoma es la diferencia entre el spread que cotiza un market maker y el spread que consigue conservar.
¿Qué es un markout en market making?
Un markout responde una pregunta después de cada ejecución: ¿dónde estaba el precio un número fijo de segundos más tarde, medido desde el lado en el que estaba? Supongamos que un market maker vende 100 acciones a $50.02 mientras el midpoint está en $50.00. Esa ejecución comienza con un crédito de dos centavos por acción, 20 mils en las unidades del desk, donde un mil es una décima de centavo. Si el midpoint sube a $50.04 sesenta segundos después, el markout a 60 segundos es de menos 20 mils. El crédito inicial desaparece, junto con otros 20 mils adicionales.
Si se calcula el promedio de todas las ejecuciones de una ventana y se grafica contra el horizonte, el resultado es una curva de markout. El panel siguiente construye una para AAPL durante una ventana de tres horas al mediodía del jueves 14 de mayo de 2026. Cada print recibe un signo según el midpoint del segundo en que se ejecutó: un print por encima del midpoint cuenta como una compra del taker, lo que coloca al market maker en el lado vendedor.
El SQL exacto detrás de cada cifra
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.secsLa primera serie es el crédito en el instante de la ejecución, es decir, la distancia entre el print y el midpoint, con un promedio de 19.66 mils por acción. La segunda serie muestra cuánto valen esas mismas ejecuciones después de que el midpoint haya tenido tiempo de moverse: 20.5 mils un segundo después y 9.81 mils cinco minutos después. La distancia entre ambas series en cualquier horizonte es el markout, y se descuenta del spread que cotizó el market maker.
Una curva que cae rápidamente y luego se aplana describe a un market maker que absorbe el ajuste inmediato del precio y conserva el resto. Una curva que mantiene la misma pendiente en todos los horizontes describe ejecuciones que quedan del lado incorrecto de un precio que sigue avanzando. La primera forma es un costo de operar. La segunda indica que la cotización debe cambiar.
¿Qué ejecuciones corresponden a flujo tóxico?
La palabra «tóxico» cumple aquí una función técnica. El flujo es tóxico cuando su curva de markout se mueve en contra del market maker que ejecutó la orden, en todos los horizontes y sobre una muestra amplia. Los desks clasifican las ejecuciones según todas las etiquetas disponibles: tamaño del print, venue, tipo de orden e identificador de la contraparte. El tamaño es la etiqueta que aparece en el tape público.
El SQL exacto detrás de cada cifra
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)Las ejecuciones de menos de 100 acciones comienzan con 19.47 mils por acción de crédito y valen 15.22 mils un minuto después. Los prints de 1,000 acciones o más comienzan con 36.26 mils y valen 21.34 mils en el mismo horizonte. Mismo instrumento, mismas tres horas y distinta economía por acción. Las órdenes más grandes suelen evitar por completo la cola pública, que es precisamente el objetivo de un block trade.
Riesgo de inventario: la posición que no puede cubrirse a tiempo
El horizonte de un markout también es un reloj. Un market maker que compra 5,000 acciones en el bid mantiene esas 5,000 acciones y, hasta cubrir o vender la posición, queda expuesto a lo que haga el precio a continuación. La cobertura rara vez es instantánea: una posición individual puede compensarse con un ETF correlacionado o con una posición en opciones, y cada una de esas operaciones implica cruzar su propio spread. El riesgo de inventario es el tamaño del movimiento que cabe dentro de esa ventana, y se mide de la misma forma para cualquier nombre. ¿Cuánto suele desplazarse el precio durante el minuto siguiente y durante la hora siguiente?
El SQL exacto detrás de cada cifra
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.minsDurante mayo de 2026, el movimiento absoluto promedio de SPY en un minuto fue de 1.9 puntos básicos, donde un punto básico es una centésima de un por ciento. En NVDA fue de 5.5 durante el mismo minuto. Al ampliar el reloj a una hora, las dos cifras pasan a ser 14.1 y 40.4. Un market maker que puede quedar plano en un minuto opera con el primer par. Uno que mantiene la posición durante una hora opera con el segundo par, y el crédito cobrado en la ejecución es idéntico en ambos casos.
Por qué los market makers pierden dinero al final de la cola
Las bolsas emparejan las órdenes pasivas al mismo precio según el orden en que llegaron: primero el precio y después el tiempo. Una orden al final de una cola de 40,000 acciones en el bid espera a que se ejecuten las 40,000 acciones que tiene delante, y estimar la posición en la cola es una disciplina propia.
La parte complicada es definir qué significa que la cola se vacíe. Una cola se vacía de dos formas. Los vendedores siguen golpeando el bid hasta agotar ese nivel, o el precio baja a través del nivel y lo deja atrás. Una orden cerca del frente participa en ambas rutas. Una orden al final se ejecuta principalmente por la segunda ruta, justo cuando el nivel está a punto de convertirse en el precio anterior. Dos market makers pueden operar el mismo instrumento al mismo precio y conservar importes distintos. El lugar en la cola nunca aparece en el spread cotizado, porque ambos market makers publicaron el mismo precio. Aparece en la curva de markout.
Por qué ampliar la cotización no es una solución gratuita
La respuesta obvia ante una curva de markout negativa es cotizar con un spread más amplio. Una cotización más amplia gana más por ejecución y obtiene menos ejecuciones. Ambas partes de esa decisión aparecen en los prints del mismo día, clasificados según la distancia de cada print respecto del midpoint.
El SQL exacto detrás de cada cifra
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)Los prints situados a menos de medio centavo del midpoint representaron 27.58 por ciento de las acciones de la ventana y valieron 0.95 mils por acción un minuto después. Los prints situados a más de dos centavos representaron 33.19 por ciento de las acciones y valieron 46.86 mils. Una cotización más alejada del midpoint es alcanzada por una proporción menor del volumen del día.
La tasa de ejecución es el primer costo de alejarse. Los rebates de las bolsas son el segundo, porque muchos venues pagan al market maker por cada acción ejecutada y ese ingreso depende del número de acciones, no de la amplitud de la cotización. Los niveles de volumen que determinan la tasa del rebate se calculan mensualmente, por lo que un mes tranquilo cambia el precio de cada ejecución en el siguiente. Renunciar al lugar en la cola es el último costo: se paga al salir y se vuelve a pagar al quedar al final de la fila al regresar. Todos los market makers ocupan algún punto de esta curva, y quienes miden sus propios markouts con mayor precisión pueden mantenerse más cerca del touch y conservar el crédito. Esa medición es la ventaja que defienden los market makers más grandes.
Preguntas frecuentes
¿Los market makers pierden dinero en operaciones individuales?
Con frecuencia. Un libro de market making es una distribución de pequeñas ganancias y pequeñas pérdidas, y las ejecuciones perdedoras se concentran en los momentos justo anteriores a un movimiento del precio. El negocio depende del promedio de millones de ejecuciones.
¿Qué es un markout en trading?
Un markout es el cambio del precio de mercado en un horizonte fijo después de una ejecución, con signo desde el punto de vista de un lado, donde un número positivo significa que ese lado ganó. Los desks de acciones cotizan los markouts en mils por acción y los desks de opciones, en ticks por contrato.
¿Qué significa flujo de órdenes tóxico?
Describe un flujo de órdenes cuya curva de markout se mueve persistentemente en contra del market maker que lo ejecuta. Es decir, el precio sigue alejándose después de cada ejecución. La etiqueta es una propiedad estadística de un flujo de órdenes y no implica una valoración sobre ningún trader individual.
¿Por qué los market makers amplían los spreads en lugar de retirar sus cotizaciones?
Una cotización más amplia mantiene al market maker en el mercado a un precio que compensa una curva de markout peor. Retirar la cotización no genera ingresos y además implica renunciar a la posición en la cola. Los desks hacen ambas cosas, y la decisión depende de cuánto tiempo se espera que la cotización permanezca desactualizada.
¿Cómo se mide la selección adversa?
Con markouts. Se asigna un signo a cada ejecución según el lado en el que estaba el market maker y luego se calcula el promedio del cambio del midpoint en horizontes fijos posteriores. La diferencia entre el crédito en la ejecución y el valor en cada horizonte es el costo de selección adversa, expresado en las mismas unidades que el spread.
Cómo se construyeron estas cifras
Cada panel de AAPL utiliza dos registros públicos: el tape de operaciones y el tape de cotizaciones. Cada print entre las 14:00 y las 17:00 UTC del 14 de mayo de 2026 se empareja con el midpoint promedio del mejor bid y oferta nacionales del segundo en que se ejecutó y luego recibe un signo. Un print por encima de ese midpoint cuenta como una compra del taker, lo que coloca al market maker en el lado vendedor. Los prints exactamente en el midpoint no tienen lado y se eliminan, al igual que cualquier print situado a más de 2 por ciento del midpoint. Se excluyen los registros de cotización en los que el bid iguala o cruza la oferta, porque un mercado bloqueado o cruzado no tiene un midpoint utilizable.
El emparejamiento en el nivel de los segundos aproxima la cotización vigente en el microsegundo de la ejecución y suaviza las actualizaciones más rápidas. Los precios de cada horizonte provienen de los mismos midpoints calculados por segundo. El panel de inventario utiliza barras de un minuto y conserva únicamente las barras con al menos 50 prints, lo que concentra la muestra en las horas de mayor actividad del día.
Cada panel incluye el SQL que lo generó, por lo que las matemáticas del markout pueden revisarse línea por línea. Para reconstruir la curva con otro nombre o en otro día, solicítalo en inglés sencillo en la terminal de Strasmore.