Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Trade Markout: qué es y cómo mide la ejecución

Qué es un trade markout, cómo interpretar su signo y qué revela una curva real medida de 1 segundo a 5 minutos sobre la calidad de ejecución.

Un trade markout es el cambio del precio mid durante un horizonte fijo después de una ejecución, medido desde el momento en que se registró esa ejecución. Un valor positivo significa que el mercado se movió a tu favor después de operar. Uno negativo significa que se movió en tu contra, lo que las mesas llaman selección adversa. El horizonte elegido, ya sea un segundo o cinco minutos, determina qué pregunta responde el dato.

¿Qué es un trade markout?

Empieza con el precio mid: el punto medio entre la mejor oferta de compra y la mejor oferta de venta, el punto medio de la NBBO. Un markout toma ese mid en un horizonte elegido después de la ejecución, le resta un precio de referencia y asigna el signo según el lado de la operación.

**markout en el horizonte h = lado * (mid en t+h - precio de referencia)**, donde lado es más uno si compraste y menos uno si vendiste.

La convención de signos es donde suele estar la confusión. Una compra seguida de una caída del mid tiene un markout negativo: compraste, el precio bajó y quien te vendió obtuvo el mejor resultado en esa operación. Esa es la selección adversa expresada como un número. Una venta seguida de una caída del mid tiene un markout positivo, porque el signo cambia según el lado. Cada ejecución tiene dos lados, y el markout de un lado es el del otro con el signo invertido.

Los tres precios de referencia

El precio de referencia que restas determina qué mide el markout.

  • El precio de ejecución. El markout se convierte en dinero: cuánto vale la posición en t+h frente a lo que pagaste. El spread pagado o cobrado queda incluido.
  • El mid en el momento de la ejecución. Esto elimina el spread y aísla el movimiento del mercado después de operar. Es la lectura más limpia de la selección adversa.
  • La cotización del lado en el que operaste. Medir frente al touch que tomaste o al touch que publicaste permite evaluar la ejecución frente al precio que realmente estaba disponible.

El análisis de calidad de ejecución usa principalmente el segundo para medir la selección adversa y el primero para medir ganancias y pérdidas. Ambos aparecen en el primer panel, sobre el mismo conjunto de ejecuciones.

La curva de markout y lo que significa su forma

Calcula la misma estadística en muchos horizontes y obtendrás una curva. Su forma aporta más información que cualquier cifra individual.

  • Una curva que cae con fuerza durante el primer segundo y permanece abajo describe un flujo que fue tomado por operadores informados: el precio se mueve contra la ejecución casi de inmediato.
  • Una curva que sigue cayendo durante minutos describe un flujo que contenía información real sobre la dirección futura del precio.
  • Una curva plana cerca de cero describe un flujo benigno. Cinco minutos después, el mid se parece al de la ejecución.
  • Una curva que empieza negativa y vuelve a subir hacia cero es la forma que busca un market maker pasivo que cobra rebates. La caída inicial refleja el spread y el impacto inmediato; la recuperación muestra que el mercado vuelve a su nivel anterior.

Elegir el horizonte también implica decidir qué estás midiendo. Por debajo de un segundo, el markout refleja principalmente la latencia y la posición en la cola. Si lo extiendes a un minuto, refleja la información de corto plazo contenida en el flujo. Después de cinco minutos, la deriva normal del mercado empieza a dominar el efecto de la ejecución.

Una curva de markout real, ejecución por ejecución

El panel siguiente toma cada print de INTC durante la sesión regular del 10 de junio de 2026, clasifica cada uno como iniciado por compra o iniciado por venta frente a la última cotización del segundo anterior y calcula el promedio del markout con signo en 5 horizontes. Se muestran dos series sobre ejecuciones idénticas: una medida desde el mid en la ejecución y otra desde el precio de ejecución.

ConsultaCurva de markout de INTC, 10 de junio de 2026, medida desde dos bases de referencia
El SQL exacto detrás de cada cifra
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec        AS sec,
            t.fill_price AS fill_price,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    multiIf(f.horizon_s < 60,
            concat(toString(f.horizon_s), ' sec'),
            concat(toString(intDiv(f.horizon_s, 60)), ' min'))              AS horizon,
    round(avg(f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3)       AS mid_basis_bps,
    round(avg(f.side * (fut.mid - f.fill_price) / f.fill_price) * 10000, 3) AS fill_basis_bps,
    count()                                                                 AS fill_count
FROM
(
    SELECT
        sec,
        fill_price,
        ref_mid,
        side,
        horizon_s,
        sec + horizon_s AS future_sec
    FROM signed_fills
    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
ORDER BY f.horizon_s
Run this yourself

En 900593 ejecuciones clasificadas, la serie basada en el mid registra 3.068 puntos básicos en 1 sec y 2.977 puntos básicos en 5 min. Un punto básico equivale a una centésima parte de un 1% del precio, por lo que una ejecución apenas mueve la cifra de redondeo, mientras que un millón de acciones representa dinero real.

La serie basada en el precio de ejecución comienza en -0.488 puntos básicos. La distancia entre ambas series en el horizonte más corto es el semispread efectivo: cuánto se alejó el print del mid. Un taker lo paga al entrar y un maker lo cobra. Todo lo que ocurre después del primer horizonte corresponde al movimiento del mercado.

El tamaño de la ejecución y la forma de la curva

La selección adversa no se distribuye de manera uniforme entre las ejecuciones. Si divides la misma sesión por tamaño de print, las ejecuciones pequeñas y los bloques de mil acciones o más aparecen en los mismos ejes.

ConsultaLa misma curva, dividida por tamaño de ejecución: ejecuciones pequeñas frente a bloques
El SQL exacto detrás de cada cifra
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec        AS sec,
            t.fill_size  AS fill_size,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price,
                size             AS fill_size
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    multiIf(f.horizon_s < 60,
            concat(toString(f.horizon_s), ' sec'),
            concat(toString(intDiv(f.horizon_s, 60)), ' min'))                                   AS horizon,
    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size < 1000) * 10000, 3)       AS small_fill_bps,
    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size >= 1000) * 10000, 3)      AS block_fill_bps,
    countIf(f.fill_size >= 1000)                                                                 AS block_fill_count
FROM
(
    SELECT
        sec,
        fill_size,
        ref_mid,
        side,
        horizon_s,
        sec + horizon_s AS future_sec
    FROM signed_fills
    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
HAVING countIf(f.fill_size < 1000) > 0
   AND countIf(f.fill_size >= 1000) > 0
ORDER BY f.horizon_s
Run this yourself

En el horizonte de 5 min, los prints de menos de mil acciones promedian 2.983 puntos básicos, mientras que los 11588 prints de mil acciones o más promedian 2.495. Dos cotizaciones que ejecuten el mismo volumen total frente a esos dos grupos no terminan el día en el mismo nivel.

Cómo se convierten los markouts en las cifras de spread de los reportes de ejecución

El markout es el término que falta en la descomposición estándar del spread. El spread efectivo es lo que realmente pagó un taker: el doble de la distancia con signo entre el mid y el print. Divídelo en dos. Una parte es el spread realizado, lo que conserva un maker una vez que el mercado se ha movido. La otra es la selección adversa, que equivale al markout basado en el mid multiplicado por dos. La identidad es exacta: spread efectivo = spread realizado + selección adversa.

ConsultaSpread efectivo dividido en spread realizado y selección adversa, por media hora
El SQL exacto detrás de cada cifra
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec + 60   AS future_sec,
            t.et_time    AS et_time,
            t.fill_price AS fill_price,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price,
                formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), toIntervalMinute(30)), '%H:%i') AS et_time
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    f.et_time                                                                  AS et_time,
    round(avg(2 * f.side * (f.fill_price - f.ref_mid) / f.ref_mid) * 10000, 3) AS effective_spread_bps,
    round(avg(2 * f.side * (f.fill_price - fut.mid) / f.ref_mid) * 10000, 3)   AS realized_spread_bps,
    round(avg(2 * f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3)      AS adverse_selection_bps,
    count()                                                                    AS fill_count
FROM signed_fills AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.et_time
ORDER BY f.et_time
Run this yourself

En la media hora que comienza a las 09:30, hora del Este, el spread efectivo promedia 10.651 puntos básicos. De ese total, 8.313 corresponde al componente de selección adversa en un horizonte de sesenta segundos y 2.338 es lo que retiene un maker. El panel cubre 13 intervalos de media hora.

Esos componentes son las cifras que se resumen por venue en los reportes de ejecución Rule 605 y 606, y constituyen la base aritmética de las afirmaciones de price improvement asociadas con la regla del subpenny y el price improvement. Un rebate es un crédito fijo por acción. La selección adversa es un costo variable por acción en las ejecuciones que realmente recibe una cotización. Comparar uno con el otro a lo largo de una curva medida, en lugar de hacerlo frente a una tabla de tarifas destacada, es la comprobación detrás de las comisiones y rebates maker-taker, y complementa los mecanismos descritos en por qué los market makers pierden dinero.

Cómo se calcularon estas cifras

Todos los paneles utilizan cotizaciones y prints de INTC correspondientes a la sesión regular del 10 de junio de 2026, de 09:30 a 16:00, hora del Este. Las cotizaciones se consolidan en un mid por segundo: el último registrado dentro de ese segundo. Un print se clasifica como iniciado por compra cuando se ejecutó por encima del mid del segundo anterior y como iniciado por venta cuando se ejecutó por debajo. Esa es la regla estándar basada en cotizaciones. Los prints exactamente en ese mid se excluyen en lugar de asignarles un lado, por lo que las ejecuciones en el punto medio quedan fuera de la muestra. Usar el mid del segundo anterior como referencia evita utilizar información futura. Los horizontes son segundos completos contados desde el segundo del print, y una ejecución entra en un horizonte solo cuando existe una cotización en el segundo objetivo.

Preguntas frecuentes

¿Qué es un markout en trading?

Un markout es el cambio con signo del precio mid durante un horizonte fijo después de una ejecución. Un valor positivo significa que el mercado se movió en la dirección de tu operación después de que se ejecutó. Uno negativo significa que se movió en la dirección contraria, que es la definición de selección adversa.

¿Un markout negativo siempre indica una mala ejecución?

No. Un markout negativo a un segundo en una orden ejecutable refleja principalmente el spread que pagó esa orden, que es el costo de ejecutarse de inmediato. Lo más importante es si la curva sigue cayendo en horizontes más largos o si se aplana.

¿Cuál es la diferencia entre un markout y el slippage?

El slippage compara una ejecución con un precio de decisión o un precio de llegada, por lo que evalúa toda la trayectoria de una orden. Un markout compara una ejecución con el mid en un horizonte posterior, por lo que evalúa lo que ocurrió después. Uno mide la orden principal y el otro mide la ejecución individual.

¿Qué horizonte debe usar un markout?

Depende del objetivo de la ejecución. Los horizontes inferiores a un segundo evalúan la ejecución sensible a la latencia, mientras que un minuto es el valor predeterminado habitual para medir la selección adversa en nombres líquidos. Publicar el horizonte junto con la cifra es lo que permite comparar dos markouts.

¿Cómo se relaciona un markout con el spread efectivo?

El spread efectivo se divide en spread realizado y un componente de selección adversa. Ese componente equivale al markout basado en el mid multiplicado por dos. Si cambias el horizonte, también cambia la división entre ambos componentes. Por eso, una estadística de spread publicada está incompleta si no incluye el horizonte.


Cada panel incluye el SQL que lo generó. Ábrelo, cambia el ticker o la fecha y la misma curva de markout se reconstruirá desde cero en la terminal de Strasmore.