Strasmore Research
Analizy Matt ConnorAutor: Matt Connor

Znaczniki czasu danych rynkowych SIP a zegary giełdowe

Analiza różnic między znacznikami czasu SIP oraz zegarami giełdowymi. Sprawdź, jak sortowanie transakcji według różnych zegarów wpływa na obraz rynku i który z nich wybrać.

Znaczniki czasu danych rynkowych to zegary przypisane do pojedynczego zapisu transakcji (trade print) w momencie jego przesyłania z silnika dopasowującego, który ją wykonał, do ekranu, na którym jest wyświetlana. W publicznym rejestrze transakcji na amerykańskim rynku akcji każdemu zapisowi towarzyszą trzy takie znaczniki, a każdy z nich odpowiada na inne pytanie. Jeśli posortujesz zapisy z tego samego dnia według jednego zegara, a następnie według drugiego, otrzymasz dwie zasadniczo różne taśmy transakcyjne.

Cztery zegary, przez które przechodzi pojedynczy zapis

Zapis jest wielokrotnie stemplowany w drodze do odbiorcy. Kolejno:

  1. Czas silnika dopasowującego (Matching engine time). Moment, w którym silnik dopasowujący danej platformy połączył dwa zlecenia. Nikt spoza platformy nie odczytuje tej wartości bezpośrednio. Jest to prawda obiektywna co do momentu zawarcia transakcji, a każdy kolejny zegar jest jedynie jej przybliżeniem.
  2. Czas uczestnika (Participant time), zwany również czasem platformy lub giełdy. Znacznik, który platforma nadaje w momencie publikacji zapisu we własnym kanale danych, zawarty w polu participant_timestamp. Spośród wszystkich dostępnych do odczytu danych, ten jest najbliższy czasowi silnika dopasowującego.
  3. Czas SIP (SIP time). Znacznik nadawany przez procesor informacji o papierach wartościowych (securities information processor), gdy zapis dociera do skonsolidowanej taśmy (consolidated tape) – jedynego oficjalnego kanału łączącego wszystkie amerykańskie platformy obrotu akcjami. Jest to pole sip_timestamp, według którego ustalana jest oficjalna kolejność na taśmie. Różnice między tym kanałem a bezpośrednimi kanałami giełdowymi omówiono w SIP a bezpośrednie kanały giełdowe.
  4. Czas przechwycenia (Capture time). Znacznik nadawany przez własną kartę sieciową w momencie dotarcia pakietu danych. Nigdy nie pojawia się w rejestrach dostawców, ponieważ opisuje ścieżkę użytkownika, a nie rynek. Prace nad przechwytywaniem i odtwarzaniem pakietów opierają się w całości na tym zegarze.

Zapisy transakcji pozagiełdowych posiadają piąty znacznik, trf_timestamp, oznaczający moment, w którym placówka raportująca transakcje (trade reporting facility) przyjęła zgłoszenie.

Dlaczego znaczniki czasu danych rynkowych różnią się między platformami

Różnica między znacznikiem platformy a znacznikiem skonsolidowanym to czas, jaki zapis spędził w tranzycie oraz w kolejce procesora. Nie jest to jedna stała wartość. Każda platforma znajduje się w innej odległości od procesora, korzysta z innego sprzętu i znajduje się za inną kolejką. Poniższy panel mierzy tę różnicę dla każdej platformy, która zarejestrowała transakcje na akcjach AAPL w ciągu ustalonego półgodzinnego okna 10 czerwca 2026 roku.

ZapytanieOpóźnienie odbioru SIP według miejsca obrotu, AAPL, 10 czerwca 2026 (mikrosekundy)
Dokładny kod SQL dla każdej liczby
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

Wśród tych platform największa mediana różnicy między znacznikiem platformy a znacznikiem skonsolidowanym wyniosła 346.2 mikrosekund w NYSE Arca, Inc.. Najszybsza platforma w tym samym oknie osiągnęła wynik 13.7 mikrosekund. Kolumna p99 jest tą, na którą warto zwrócić uwagę: dla tej samej najwolniejszej platformy wartość ta wyniosła 420.8 mikrosekund, co pokazuje "ogon" rozkładu ukryty przez medianę.

Którego znacznika czasu użyć

Cztery zasady obejmują niemal każdy przypadek.

  • Czas uczestnika do analiz mikrostruktury i badań zdarzeń. Wszystko, co mierzy przebieg zdarzeń na danej platformie i ich kolejność, powinno być analizowane według zegara platformy. Rekonstrukcja arkusza zleceń, będąca tematem danych arkusza zleceń MBO a MBP, jest bezużyteczna przy użyciu jakiegokolwiek innego zegara.
  • Czas SIP do wszystkiego, co musi być zgodne z oficjalną taśmą. Raportowanie regulacyjne, przeglądy najlepszej egzekucji (best execution), oficjalne otwarcie i zamknięcie sesji oraz wszelkie dane, które kontrahent będzie weryfikował względem skonsolidowanego rejestru.
  • Czas przechwycenia tylko do pomiaru własnej ścieżki sieciowej. Informuje on o tym, jak długo dane docierały do urządzenia. Nie mówi nic o momencie zawarcia transakcji, a dwa różne urządzenia nigdy nie będą miały w tym zakresie identycznych wskazań.
  • Nigdy nie należy mieszać zegarów w jednym zbiorze danych. Łączenie kwotowań z jednego zegara z transakcjami z drugiego daje wyniki, które wyglądają na wiarygodne, ale zawodzą w kluczowych momentach.

Te same zapisy, posortowane na dwa sposoby

Sortowanie to moment, w którym abstrakcja przestaje działać. Poniższy panel obejmuje najbardziej intensywne dziesięć milisekund z tego półgodzinnego okna, zachowując pierwsze dwanaście zapisów giełdowych w kolejności platformy, a następnie szeregując te same dwanaście zapisów według kolejności na skonsolidowanej taśmie. Tabela jest posortowana według stopnia przesunięcia każdego zapisu między dwoma rankingami.

ZapytanieDwanaście transakcji uszeregowanych według czasu zegarowego miejsca obrotu oraz czasu taśmy
Dokładny kod SQL dla każdej liczby
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

Największa różnica między dwiema pozycjami zapisu wynosi 6. Zapis ten opuścił platformę o 10:44:17.160712 i dotarł do taśmy 305.7 mikrosekund później, o 10:44:17.161018, przesuwając się z pozycji 6 według zegara platformy na pozycję 12 na taśmie. Żadna z tych kolejności nie jest błędna. Odpowiadają one na inne pytania. Badanie sekwencji transakcji przeprowadzone według zegara taśmy odczytuje ten impuls w kolejności, której nie wygenerowała żadna platforma, a przegląd najlepszej egzekucji przeprowadzony według zegara platformy jest sprzeczny z oficjalnym rejestrem.

Zapisy pozagiełdowe docierają z dużym opóźnieniem

Transakcja zawarta poza giełdą, u hurtownika lub w dark poolu, jest raportowana do placówki raportującej transakcje, zamiast być dopasowywaną w publicznym arkuszu. Raport zawiera czas egzekucji, a do taśmy dociera z opóźnieniem. Ten interwał to opóźnienie raportowania, a nie czas przesyłu, i jest on o rzędy wielkości większy.

ZapytanieTransakcje pozagiełdowe AAPL według opóźnienia raportowania, 10 czerwca 2026
Dokładny kod SQL dla każdej liczby
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

Spośród pozagiełdowych zapisów AAPL w tym oknie, 24.8% trafia do przedziału under 1 ms. Ogon rozkładu sięga przedziału 1 s to 10 s, zawierającego 74 zapisów. Zapis, który dociera z dziesięciosekundowym opóźnieniem, nadal posiada czas zegara platformy, w którym faktycznie doszło do egzekucji, podczas gdy w strumieniu taśmy znajduje się dziesięć sekund za nim. Sortowanie według czasu taśmy sprawia, że zapis pojawia się w niewłaściwej minucie. Zapisy raportowane poza normalną sekwencją posiadają kody warunków sprzedaży, które o tym informują – jest to jedna z rzeczy, które mają na celu oznaczyć kody warunków transakcji.

Dlaczego dwie osoby tworzą różne wykresy słupkowe z tych samych transakcji

Prawie każde zgłoszenie typu "dane są błędne" wynika z tego problemu. Wykres słupkowy to zbiór zapisów, a to, do którego zbioru trafi dany zapis, zależy od znacznika, według którego dokonuje się grupowania. Poniższy panel zlicza zapisy, które zmieniają przedział czasowy po przełączeniu z zegara platformy na zegar taśmy, dla czterech popularnych interwałów czasowych.

ZapytanieTransakcje zmieniające interwał przy zmianie zegara, według długości interwału
Dokładny kod SQL dla każdej liczby
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

Na siatce 1 second, 8.966% zapisów w tym oknie trafia do innego słupka przy użyciu dwóch różnych zegarów, co daje łącznie 8944 zapisów. Po wydłużeniu interwału do 5 minutes liczba ta spada do 0.024%. Mechanizm jest stały: zapis zmienia przedział, gdy różnica między zegarami przekracza granicę przedziału, a krótsze interwały mają więcej takich granic. Dwaj dostawcy mogą mieć rację, a mimo to publikować różny wolumen dla tej samej minuty. Sama konstrukcja wykresów została omówiona w jak budowane są wykresy OHLCV.

Pole nanosekundowe nie oznacza dokładności nanosekundowej

Oba znaczniki docierają jako liczby całkowite z rozdzielczością nanosekundową. Rozdzielczość to zdolność pola do wyrażenia wartości. Dokładność to stopień, w jakim wartość jest zbliżona do czasu rzeczywistego, a obie te cechy wynikają z zupełnie innych czynników.

Synchronizacja zegarów w branży jest regulowana tolerancją prawną, a nie fizyką. Zasada synchronizacji zegarów FINRA wymaga, aby zegary biznesowe firm członkowskich mieściły się w granicach 50 milisekund od wzorca NIST. Giełdy i procesory działają znacznie precyzyjniej, wykorzystując protokół PTP (Precision Time Protocol, standaryzowany jako IEEE 1588), który rozprowadza zegar wzorcowy przez tę samą sieć, która przesyła dane, i utrzymuje urządzenia w synchronizacji z dokładnością poniżej mikrosekundy.

Wynikają z tego dwie kwestie. W obrębie znaczników jednej organizacji, kolejność z rozdzielczością mikrosekundową jest znacząca. W relacjach między organizacjami różnica kilkuset nanosekund między dwoma znacznikami mieści się w granicach błędu, a traktowanie jej jako rzeczywistej kolejności jest odczytywaniem szumu.

FAQ

Jaka jest różnica między znacznikiem czasu SIP a znacznikiem czasu uczestnika?

Znacznik czasu uczestnika jest nadawany przez platformę w momencie publikacji transakcji we własnym kanale danych. Znacznik czasu SIP jest nadawany przez procesor skonsolidowanej taśmy, gdy transakcja dociera do oficjalnego kanału zbiorczego. Różnica między nimi to czas tranzytu i kolejkowania, mierzony w mikrosekundach dla zapisów giełdowych i często w milisekundach lub dłużej dla zapisów raportowanych przez placówki raportujące transakcje.

Którego znacznika czasu danych rynkowych powinienem użyć do backtestingu?

Użyj znacznika czasu uczestnika do wszystkiego, co modeluje to, co uczestnik mógł widzieć lub zrobić na danej platformie, oraz znacznika czasu SIP do wszystkiego, co musi być zgodne z oficjalnym skonsolidowanym rejestrem. Niezależnie od wyboru, należy stosować go do każdej tabeli w badaniu, w tym do kwotowań.

Dlaczego moje wykresy minutowe nie zgadzają się z danymi dostawcy?

Najczęstszą przyczyną jest niedopasowanie zegarów. Zapis, którego znacznik platformy wypada tuż przed granicą minuty, może mieć znacznik taśmy tuż po niej, co umieszcza tę samą transakcję w różnych słupkach zgodnie z dwiema konwencjami. Późno raportowane transakcje pozagiełdowe potęgują ten efekt.

Czy znaczniki czasu z dokładnością do nanosekund są dokładne co do nanosekundy?

Nie. Pole przechowuje rozdzielczość nanosekundową, a dokładność zależy od tego, jak dobrze zsynchronizowany jest zegar urządzenia zapisującego. Systemy giełdowe i procesory korzystające z PTP utrzymują synchronizację poniżej mikrosekundy, podczas gdy zegary biznesowe brokerów podlegają regulacyjnej tolerancji 50 milisekund. Porównania dokładniejsze niż tolerancja mniej precyzyjnego zegara nie mają znaczenia.


Każdy powyższy panel jest dostarczany wraz z kodem SQL, który go wygenerował, dzięki czemu można sprawdzić, z którego zegara pochodzi każda liczba. Aby posortować własne okno zapisów według innego zegara i obserwować zmiany na taśmie, należy zadać pytanie prostym językiem na terminalu Strasmore.