Strasmore Research

Marcas de tiempo: relojes SIP vs. bolsas

Los datos de mercado usan cuatro relojes. Vea cómo cada uno cambia el orden de las mismas operaciones y cuál conviene usar según el análisis.

Las marcas de tiempo de los datos de mercado son los relojes que se asignan a una operación individual mientras viaja desde el motor de cruce que la ejecutó hasta la pantalla que la muestra. Una operación de acciones estadounidenses lleva tres de ellas en el registro público, y cada una responde una pregunta distinta. Ordene las operaciones del mismo día primero según un reloj y después según otro, y tendrá dos cintas de mercado realmente diferentes.

Los cuatro relojes por los que pasa una operación

Una operación recibe varias marcas de tiempo en su recorrido hasta usted. En orden:

  1. Hora del motor de cruce. El instante en que el motor de cruce de un centro de negociación ejecutó dos órdenes. Nadie fuera del centro puede leer directamente este valor. Es la referencia exacta de cuándo ocurrió la operación, y todos los relojes posteriores son una aproximación.
  2. Hora del participante, también llamada hora del centro o de la bolsa. La marca que el centro escribe cuando publica la operación en su propio feed, en el campo participant_timestamp. De todos los valores que puede leer, este es el más cercano al motor de cruce.
  3. Hora del SIP. La marca que escribe el procesador de información de valores cuando la operación llega a la cinta consolidada, el único feed oficial que integra todos los centros de negociación de acciones estadounidenses. Este es el campo sip_timestamp, y la secuencia de la cinta oficial sigue esta marca. La diferencia entre ese feed y el propio del centro se explica en SIP frente a feeds directos de las bolsas.
  4. Hora de captura. La marca que escribe la tarjeta de red cuando el paquete llega. Nunca aparece en el registro de un proveedor, porque describe su recorrido y no el mercado. Los trabajos de captura y reproducción de paquetes utilizan exclusivamente este reloj.

Las operaciones fuera de bolsa llevan una quinta marca, trf_timestamp, que indica cuándo una entidad de reporte de operaciones recibió el informe.

Por qué las marcas de tiempo de los datos de mercado difieren entre centros

La diferencia entre la marca del centro y la marca consolidada es el tiempo que una operación pasó en tránsito y en la cola del procesador. No es un único valor. Cada centro está a una distancia diferente del procesador, utiliza hardware distinto y se encuentra detrás de una cola diferente. El panel siguiente mide esa diferencia para cada centro que registró operaciones de AAPL durante una media hora fija el 10 de junio de 2026.

ConsultaRetraso de recepción del SIP por mercado, AAPL, 10 de junio de 2026 (microsegundos)
El SQL exacto detrás de cada cifra
WITH venues AS
(
    SELECT
        toUInt32(id)                             AS exchange_id,
        any(coalesce(nullIf(acronym, ''), name)) AS venue_name
    FROM global_markets.stocks_exchanges
    WHERE asset_class = 'stocks'
    GROUP BY exchange_id
)
SELECT
    if(v.venue_name = '', concat('Venue ', toString(t.exchange)), v.venue_name) AS venue,
    count()                                                                     AS print_count,
    round(quantileDeterministic(0.5)(
        toFloat64(toUnixTimestamp64Nano(t.sip_timestamp)
                - toUnixTimestamp64Nano(t.participant_timestamp)) / 1000,
        toUInt64(t.sequence_number)), 1)                                        AS median_lag_us,
    round(quantileDeterministic(0.99)(
        toFloat64(toUnixTimestamp64Nano(t.sip_timestamp)
                - toUnixTimestamp64Nano(t.participant_timestamp)) / 1000,
        toUInt64(t.sequence_number)), 1)                                        AS p99_lag_us
FROM global_markets.stocks_trades AS t
LEFT JOIN venues AS v ON v.exchange_id = toUInt32(t.exchange)
WHERE t.ticker = 'AAPL'
  AND t.sip_timestamp >= '2026-06-10 14:30:00'
  AND t.sip_timestamp <  '2026-06-10 15:00:00'
  AND ifNull(toUnixTimestamp64Nano(t.trf_timestamp), 0) = 0
GROUP BY venue
HAVING count() >= 200
ORDER BY median_lag_us DESC
LIMIT 15
Run this yourself

Entre esos centros, la mayor diferencia mediana entre la marca del centro y la marca consolidada fue de 346.2 microsegundos, en NYSE Arca, Inc.. El centro con la menor diferencia en la misma ventana registró 13.7 microsegundos. La columna p99 es la que merece más atención: en ese mismo centro más lento alcanzó 420.8 microsegundos, un extremo que la mediana oculta.

Qué marca de tiempo debe usar

Cuatro reglas cubren casi todos los casos.

  • Hora del participante para trabajos de microestructura y estudios de eventos. Todo análisis que mida qué ocurrió en un centro y en qué orden debe utilizar el reloj del centro. La reconstrucción del libro de órdenes, tema de datos de libros de órdenes MBO frente a MBP, no funciona con ningún otro.
  • Hora del SIP para todo lo que deba conciliarse con la cinta oficial. Esto incluye reportes regulatorios, revisiones de best execution, la apertura y el cierre oficiales, y cualquier cifra que una contraparte vaya a comprobar contra el registro consolidado.
  • Hora de captura únicamente para medir su propio recorrido. Indica cuánto tardaron los datos en llegar a su máquina. No indica cuándo ocurrió la operación, y dos máquinas nunca coincidirán en este valor.
  • Nunca mezcle relojes dentro del mismo dataset. Un join que empareja cotizaciones con un reloj y operaciones con otro produce cifras que parecen plausibles, pero fallan precisamente en los momentos importantes.

Las mismas operaciones, ordenadas de dos maneras

El ordenamiento es donde la abstracción deja de serlo. El panel siguiente toma los diez milisegundos de mayor actividad de esa media hora, conserva las primeras doce operaciones en bolsa en el orden del centro y después vuelve a ordenar esas mismas doce según el orden de la cinta consolidada. La tabla está ordenada por la magnitud del desplazamiento de cada operación entre ambas posiciones.

ConsultaLas mismas doce operaciones, ordenadas por reloj del mercado y por reloj de cinta
El SQL exacto detrás de cada cifra
WITH
    burst AS
    (
        SELECT intDiv(toUnixTimestamp64Nano(participant_timestamp), 10000000) AS slice_10ms
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL'
          AND sip_timestamp >= '2026-06-10 14:30:00'
          AND sip_timestamp <  '2026-06-10 15:00:00'
          AND ifNull(toUnixTimestamp64Nano(trf_timestamp), 0) = 0
        GROUP BY slice_10ms
        ORDER BY count() DESC, slice_10ms ASC
        LIMIT 1
    ),
    sample AS
    (
        SELECT
            participant_timestamp,
            sip_timestamp,
            toUInt64(sequence_number) AS seq,
            toUnixTimestamp64Nano(sip_timestamp)
              - toUnixTimestamp64Nano(participant_timestamp) AS lag_ns
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL'
          AND sip_timestamp >= '2026-06-10 14:30:00'
          AND sip_timestamp <  '2026-06-10 15:00:00'
          AND ifNull(toUnixTimestamp64Nano(trf_timestamp), 0) = 0
          AND intDiv(toUnixTimestamp64Nano(participant_timestamp), 10000000)
              IN (SELECT slice_10ms FROM burst)
        ORDER BY participant_timestamp ASC, seq ASC
        LIMIT 12
    ),
    ranked AS
    (
        SELECT
            participant_timestamp,
            sip_timestamp,
            lag_ns,
            row_number() OVER (ORDER BY participant_timestamp ASC, seq ASC) AS participant_rank,
            row_number() OVER (ORDER BY sip_timestamp ASC, seq ASC)         AS sip_rank
        FROM sample
    )
SELECT
    concat('P', leftPad(toString(participant_rank), 2, '0')) AS print_label,
    concat(formatDateTime(toTimeZone(participant_timestamp, 'America/New_York'), '%H:%i:%S'), '.',
           leftPad(toString(intDiv(toUnixTimestamp64Nano(participant_timestamp) % 1000000000, 1000)), 6, '0')) AS venue_clock_et,
    concat(formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S'), '.',
           leftPad(toString(intDiv(toUnixTimestamp64Nano(sip_timestamp) % 1000000000, 1000)), 6, '0'))         AS tape_clock_et,
    participant_rank,
    sip_rank,
    abs(toInt32(sip_rank) - toInt32(participant_rank)) AS places_moved,
    round(lag_ns / 1000, 1)                            AS sip_lag_delta_us
FROM ranked
ORDER BY places_moved DESC, participant_rank ASC
Run this yourself

La mayor diferencia entre las dos posiciones de una operación es 6. Esa operación salió de su centro a las 10:44:17.160712 y llegó a la cinta 305.7 microsegundos después, a las 10:44:17.161018, al pasar de la posición 6 según el reloj del centro a la posición 12 en la cinta. Ninguno de los dos órdenes es incorrecto. Responden preguntas distintas. Un estudio de la secuencia de operaciones basado en el reloj de la cinta lee este flujo en un orden que ningún centro produjo, mientras que una revisión de best execution basada en el reloj del centro no coincide con el registro oficial.

Las operaciones fuera de bolsa llegan mucho después del evento

Una operación ejecutada fuera de una bolsa, con un mayorista o en un dark pool, se reporta a una entidad de reporte de operaciones en lugar de cruzarse en un libro público. El reporte incluye la hora de ejecución y llega después a la cinta. Ese intervalo es un retraso de reporte, no un tiempo de tránsito, y es mucho mayor.

ConsultaOperaciones de AAPL fuera de bolsa por retraso de reporte, 10 de junio de 2026
El SQL exacto detrás de cada cifra
WITH off_exchange AS
(
    SELECT
        (toUnixTimestamp64Nano(sip_timestamp)
       - toUnixTimestamp64Nano(participant_timestamp)) / 1000000.0 AS delay_ms
    FROM global_markets.stocks_trades
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-06-10 14:30:00'
      AND sip_timestamp <  '2026-06-10 15:00:00'
      AND ifNull(toUnixTimestamp64Nano(trf_timestamp), 0) > 0
)
SELECT
    multiIf(delay_ms <     1, 'under 1 ms',
            delay_ms <    10, '1 to 10 ms',
            delay_ms <   100, '10 to 100 ms',
            delay_ms <  1000, '100 ms to 1 s',
            delay_ms < 10000, '1 s to 10 s',
                              'over 10 s')                       AS reporting_delay,
    count()                                                      AS print_count,
    round(100 * count() / (SELECT count() FROM off_exchange), 2) AS share_pct
FROM off_exchange
GROUP BY reporting_delay
ORDER BY min(delay_ms) ASC
Run this yourself

De las operaciones de AAPL fuera de bolsa en esa ventana, 24.8% quedan en el intervalo under 1 ms. La cola llega hasta el intervalo 1 s to 10 s, con 74 operaciones. Una operación que llega con diez segundos de retraso conserva la hora del centro en la que realmente se ejecutó, aunque aparece en el flujo de la cinta diez segundos después. Si se ordena por hora de la cinta, parece pertenecer al minuto equivocado. Las operaciones reportadas fuera de la secuencia normal llevan códigos de condición de venta que lo indican. Esa es una de las funciones de los códigos de condición de las operaciones.

Por qué dos personas construyen barras diferentes con las mismas operaciones

Casi todos los casos de «los datos son incorrectos» terminan aquí. Una barra es un grupo de operaciones, y el grupo al que pertenece cada operación depende de la marca usada para agruparla. El panel siguiente cuenta las operaciones que cambian de grupo al pasar del reloj del centro al reloj de la cinta, para cuatro duraciones habituales de barras.

ConsultaOperaciones que cambian de barra al cambiar de reloj, por duración de barra
El SQL exacto detrás de cada cifra
WITH
    prints AS
    (
        SELECT
            toUnixTimestamp64Nano(participant_timestamp) AS venue_ns,
            toUnixTimestamp64Nano(sip_timestamp)         AS tape_ns
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL'
          AND sip_timestamp >= '2026-06-10 14:30:00'
          AND sip_timestamp <  '2026-06-10 15:00:00'
    ),
    grids AS
    (
        SELECT arrayJoin([1, 10, 60, 300]) AS bar_seconds
    )
SELECT
    multiIf(bar_seconds =  1, '1 second',
            bar_seconds = 10, '10 seconds',
            bar_seconds = 60, '1 minute',
                              '5 minutes') AS bar_length,
    countIf(intDiv(venue_ns, toInt64(bar_seconds) * 1000000000)
         != intDiv(tape_ns,  toInt64(bar_seconds) * 1000000000)) AS moved_print_count,
    round(100 * countIf(intDiv(venue_ns, toInt64(bar_seconds) * 1000000000)
                     != intDiv(tape_ns,  toInt64(bar_seconds) * 1000000000)) / count(), 3) AS moved_pct
FROM prints
CROSS JOIN grids
GROUP BY bar_seconds
ORDER BY bar_seconds ASC
Run this yourself

En una cuadrícula de 1 second, 8.966% de las operaciones de esa ventana caen en una barra diferente según el reloj utilizado, 8944 operaciones en total. Al ampliar la barra a 5 minutes, la cifra baja a 0.024%. El patrón es mecánico: una operación cambia de grupo cuando la diferencia entre sus relojes cruza un límite, y las barras más cortas tienen más límites. Dos proveedores pueden ser correctos y aun así publicar volúmenes diferentes para el mismo minuto. La construcción se explica paso a paso en cómo se construyen las barras OHLCV.

Un campo de nanosegundos no implica precisión de nanosegundos

Ambas marcas llegan como enteros con resolución de nanosegundos. La resolución indica qué puede expresar un campo. La precisión indica qué tan cerca está el valor de la hora real, y ambas dependen de factores completamente distintos.

La alineación de los relojes del sector se rige por una tolerancia regulatoria, no por la física. La norma de sincronización de relojes de FINRA exige que los relojes operativos de las firmas miembro estén dentro de un margen de 50 milisegundos respecto de la referencia del NIST. Las bolsas y los procesadores operan con una precisión mucho mayor mediante el Precision Time Protocol (PTP, estandarizado como IEEE 1588), que distribuye un reloj de referencia por la misma red que transporta los datos y mantiene las máquinas alineadas en menos de un microsegundo.

De aquí se desprenden dos conclusiones. Dentro de las marcas de una misma organización, el orden a resolución de microsegundos es significativo. Entre organizaciones, una diferencia de unos cientos de nanosegundos entre dos marcas se encuentra dentro del margen de error. Tratarla como un orden real equivale a interpretar ruido.

Preguntas frecuentes

¿Cuál es la diferencia entre la marca de tiempo del SIP y la del participante?

La marca del participante la escribe el centro cuando publica una operación en su propio feed. La marca del SIP la escribe el procesador de la cinta consolidada cuando esa operación llega al feed oficial combinado. La diferencia entre ambas es el tiempo de tránsito y de espera en cola. Se mide en microsegundos para las operaciones en bolsa y con frecuencia en milisegundos o más para las operaciones reportadas a través de una entidad de reporte de operaciones.

¿Qué marca de tiempo de los datos de mercado debo usar para hacer backtesting?

Use la marca del participante para todo modelo que represente lo que un participante podría haber visto o ejecutado en un centro, y la marca del SIP para todo lo que deba conciliarse con el registro consolidado oficial. Elija la que elija, aplíquela a todas las tablas del estudio, incluidas las cotizaciones.

¿Por qué mis barras de un minuto no coinciden con las de mi proveedor de datos?

La causa habitual es una discrepancia entre relojes. Una operación cuya marca del centro cae justo antes del límite de un minuto puede tener una marca de la cinta justo después. Eso coloca la misma operación en barras distintas según la convención utilizada. Las operaciones fuera de bolsa reportadas tarde amplían el efecto.

¿Las marcas de tiempo de nanosegundos tienen precisión de nanosegundos?

No. El campo tiene resolución de nanosegundos, pero la precisión depende de qué tan sincronizado esté el reloj de la máquina que escribe la marca. Los sistemas de bolsas y procesadores que utilizan PTP mantienen una alineación inferior a un microsegundo, mientras que los relojes operativos de los brokers están sujetos a una tolerancia regulatoria de 50 milisegundos. Las comparaciones más precisas que la tolerancia del reloj menos preciso no son significativas.


Cada panel anterior incluye el SQL que lo generó, para que pueda ver exactamente de qué reloj provino cada cifra. Para volver a ordenar su propia ventana de operaciones con otro reloj y observar cómo cambia la cinta, formule la pregunta en lenguaje sencillo en la terminal de Strasmore.

#market data#timestamps#sip#latency#data quality