Strasmore Research
Investigasi Matt ConnorOleh Matt Connor

Timestamp Market Data: SIP vs Clock Bursa

Trade saham AS melewati empat clock. Lihat bagaimana pengurutan timestamp yang berbeda mengubah tape, serta clock yang tepat untuk tiap kebutuhan analisis.

Timestamp market data adalah waktu yang dicatat pada satu trade print saat print tersebut bergerak dari matching engine yang mengeksekusinya ke layar yang menampilkannya. Trade saham AS memiliki tiga timestamp dalam catatan publik, dan masing-masing menjawab pertanyaan yang berbeda. Jika print pada hari yang sama diurutkan berdasarkan satu timestamp lalu berdasarkan timestamp lainnya, hasilnya adalah dua tape yang benar-benar berbeda.

Empat timestamp yang dilewati satu print

Satu print menerima beberapa timestamp dalam perjalanannya kepada Anda. Urutannya:

  1. Waktu matching engine. Saat matching engine suatu venue mencocokkan dua order. Tidak ada pihak di luar venue yang dapat membaca nilai ini secara langsung. Inilah acuan sebenarnya untuk waktu terjadinya trade, sedangkan semua timestamp setelahnya merupakan pendekatannya.
  2. Waktu participant, yang juga disebut waktu venue atau exchange. Timestamp yang ditulis venue ketika menerbitkan print di feed miliknya, dan tercantum dalam field participant_timestamp. Dari semua informasi yang benar-benar dapat Anda baca, timestamp ini paling dekat dengan matching engine.
  3. Waktu SIP. Timestamp yang ditulis securities information processor ketika print mencapai consolidated tape, yaitu feed resmi tunggal yang menggabungkan seluruh venue ekuitas AS. Ini adalah field sip_timestamp, dan urutan tape resmi mengikutinya. Perbedaan antara feed tersebut dan feed milik venue sendiri dibahas dalam SIP versus direct exchange feeds.
  4. Waktu capture. Timestamp yang ditulis network card Anda sendiri ketika paket tiba. Timestamp ini tidak pernah muncul dalam catatan vendor karena menggambarkan jalur Anda, bukan pasar. Pekerjaan Packet capture and replay sepenuhnya menggunakan timestamp ini.

Print di luar bursa memiliki timestamp kelima, trf_timestamp, yang menandai saat trade reporting facility menerima laporan tersebut.

Mengapa timestamp market data berbeda antarvenue

Selisih antara timestamp venue dan timestamp consolidated adalah waktu yang dihabiskan print dalam perjalanan dan antrean processor. Selisih ini bukan satu angka yang seragam. Setiap venue berada pada jarak yang berbeda dari processor, menggunakan hardware yang berbeda, dan berada di belakang antrean yang berbeda. Panel di bawah mengukur selisih tersebut untuk setiap venue yang mencetak trade AAPL selama setengah jam yang ditetapkan pada 10 Juni 2026.

QueryLag penerimaan SIP berdasarkan venue, AAPL, 10 Juni 2026 (mikrodetik)
SQL tepat di balik setiap angka
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

Di antara venue tersebut, median selisih terlebar antara timestamp venue dan timestamp consolidated adalah 346.2 mikrodetik, pada NYSE Arca, Inc.. Venue dengan selisih terkecil pada periode yang sama mencatat 13.7 mikrodetik. Kolom p99 adalah bagian yang paling penting untuk diperhatikan: pada venue paling lambat tersebut, nilainya mencapai 420.8 mikrodetik. Angka ini menunjukkan tail yang tidak terlihat dari median.

Timestamp mana yang sebaiknya digunakan

Empat aturan mencakup hampir semua kasus.

  • Waktu participant untuk pekerjaan microstructure dan event study. Semua analisis yang mengukur apa yang terjadi di suatu venue dan urutannya harus menggunakan clock venue. Rekonstruksi order book, yang menjadi topik MBO versus MBP order book data, tidak dapat digunakan dengan clock lain.
  • Waktu SIP untuk segala hal yang harus direkonsiliasikan dengan tape resmi. Ini mencakup regulatory reporting, tinjauan best execution, pembukaan dan penutupan resmi, serta angka apa pun yang akan diperiksa counterparty terhadap catatan consolidated.
  • Waktu capture hanya untuk mengukur jalur Anda sendiri. Timestamp ini menunjukkan berapa lama data mencapai mesin Anda. Timestamp ini tidak menunjukkan kapan trade terjadi, dan dua mesin tidak akan pernah menghasilkan nilai yang sama.
  • Jangan pernah mencampur clock dalam satu dataset. Join yang mencocokkan quotes berdasarkan satu clock dengan trades berdasarkan clock lain dapat menghasilkan angka yang tampak masuk akal, tetapi gagal tepat pada momen yang paling penting.

Perbedaan tersebut terlihat saat data diurutkan. Panel di bawah mengambil sepuluh milidetik tersibuk dari setengah jam tersebut, mempertahankan dua belas print pertama dari exchange dalam urutan venue, lalu mengurutkan kembali dua belas print yang sama berdasarkan urutan consolidated tape. Tabel diurutkan berdasarkan seberapa jauh posisi setiap print berpindah di antara kedua peringkat tersebut.

QueryDua belas print yang sama, diurutkan berdasarkan jam venue dan jam tape
SQL tepat di balik setiap angka
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

Selisih terbesar antara dua peringkat sebuah print adalah 6. Print tersebut meninggalkan venue pada 10:44:17.160712 dan mencapai tape 305.7 mikrodetik kemudian, pada 10:44:17.161018. Posisinya berubah dari 6 berdasarkan clock venue menjadi 12 berdasarkan tape. Tidak ada urutan yang salah. Keduanya menjawab pertanyaan yang berbeda. Studi urutan trade yang menggunakan clock tape akan membaca lonjakan ini dalam urutan yang tidak pernah dihasilkan oleh venue mana pun. Sebaliknya, tinjauan best execution yang menggunakan clock venue akan berbeda dari catatan resmi.

Trade yang dieksekusi di luar bursa, melalui wholesaler atau dark pool, dilaporkan kepada trade reporting facility, bukan dicocokkan pada order book publik. Laporan tersebut membawa waktu eksekusi dan tiba di tape setelahnya. Interval ini merupakan keterlambatan pelaporan, bukan waktu perjalanan, dan besarnya beberapa tingkat lebih tinggi.

QueryPrint AAPL di luar bursa berdasarkan keterlambatan pelaporan, 10 Juni 2026
SQL tepat di balik setiap angka
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

Dari print AAPL di luar bursa pada periode tersebut, 24.8% masuk ke bucket under 1 ms. Tail-nya memanjang hingga bucket 1 s to 10 s, yang berisi 74 print. Print yang tiba terlambat sepuluh detik tetap membawa waktu venue saat trade tersebut benar-benar dieksekusi, tetapi berada sepuluh detik lebih hilir dalam aliran tape. Jika diurutkan berdasarkan waktu tape, print itu tampak berada pada menit yang salah. Print yang dilaporkan di luar urutan normal membawa sale condition codes yang menunjukkan hal tersebut. Inilah salah satu fungsi trade condition codes.

Mengapa dua pihak membentuk bar yang berbeda dari trade yang sama

Hampir semua tiket dengan keluhan “data-nya salah” berakhir di sini. Bar adalah bucket berisi print, dan bucket tempat sebuah print ditempatkan bergantung pada timestamp yang digunakan. Panel di bawah menghitung print yang berpindah bucket ketika pengelompokan diubah dari clock venue ke clock tape, untuk empat durasi bar yang umum.

QueryPrint yang mengubah bar saat jam diubah, berdasarkan panjang bar
SQL tepat di balik setiap angka
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

Pada grid 1 second, sebanyak 8.966% print dalam periode tersebut masuk ke bar yang berbeda berdasarkan kedua clock, dengan total 8944 print. Ketika durasi bar diperpanjang menjadi 5 minutes, angkanya turun menjadi 0.024%. Polanya bersifat mekanis: print berpindah bucket setiap kali selisih antara kedua clock melewati batas bucket. Bar yang lebih pendek memiliki lebih banyak batas. Dua vendor dapat sama-sama benar, tetapi tetap menerbitkan volume yang berbeda untuk menit yang sama. Proses pembentukannya dijelaskan dalam cara membentuk bar OHLCV.

Field nanodetik bukan berarti akurasi nanodetik

Kedua timestamp hadir sebagai bilangan bulat dengan resolusi nanodetik. Resolusi menunjukkan nilai yang dapat dinyatakan oleh sebuah field. Akurasi menunjukkan seberapa dekat nilai tersebut dengan waktu sebenarnya. Keduanya ditentukan oleh hal yang sepenuhnya berbeda.

Sinkronisasi clock di industri ini diatur oleh toleransi regulasi, bukan oleh batasan fisika. Aturan sinkronisasi clock FINRA mewajibkan business clock perusahaan anggota berada dalam toleransi 50 milidetik dari referensi NIST. Bursa dan processor menggunakan toleransi yang jauh lebih ketat melalui Precision Time Protocol (PTP, yang distandardisasi sebagai IEEE 1588). Protokol ini mendistribusikan reference clock melalui jaringan yang sama dengan jaringan pembawa data, dan menjaga sinkronisasi mesin pada tingkat submikrodetik.

Ada dua implikasi. Di dalam timestamp milik satu organisasi, pengurutan pada resolusi mikrodetik bermakna. Namun, antarorganisasi, perbedaan beberapa ratus nanodetik antara dua timestamp masih berada dalam error bar. Menganggapnya sebagai urutan yang benar-benar terjadi berarti membaca noise.

FAQ

Apa perbedaan antara timestamp SIP dan timestamp participant?

Timestamp participant ditulis oleh venue ketika venue menerbitkan trade pada feed miliknya. Timestamp SIP ditulis oleh consolidated tape processor ketika trade tersebut mencapai feed gabungan resmi. Selisih antara keduanya adalah waktu perjalanan dan antrean. Untuk print di bursa, selisih ini diukur dalam mikrodetik. Untuk print yang dilaporkan melalui trade reporting facility, selisihnya sering kali mencapai milidetik atau lebih.

Timestamp market data mana yang sebaiknya digunakan untuk backtesting?

Gunakan timestamp participant untuk model yang merepresentasikan apa yang dapat dilihat atau dilakukan participant di suatu venue. Gunakan timestamp SIP untuk hal yang harus direkonsiliasikan dengan catatan consolidated resmi. Apa pun pilihan Anda, gunakan timestamp tersebut pada setiap tabel dalam studi, termasuk quotes.

Mengapa bar satu menit saya tidak sama dengan bar dari data provider?

Biasanya penyebabnya adalah perbedaan clock. Print yang timestamp venue-nya jatuh sesaat sebelum batas menit dapat memiliki timestamp tape sesaat setelah batas tersebut. Akibatnya, trade yang sama masuk ke bar yang berbeda berdasarkan kedua konvensi. Print di luar bursa yang terlambat dilaporkan dapat memperbesar perbedaan tersebut.

Apakah timestamp nanodetik akurat hingga nanodetik?

Tidak. Field tersebut memiliki resolusi nanodetik, sedangkan akurasinya ditentukan oleh seberapa baik clock mesin yang menulisnya disinkronkan. Sistem bursa dan processor yang menggunakan PTP mempertahankan sinkronisasi pada tingkat submikrodetik. Sementara itu, business clock broker berada dalam toleransi regulasi 50 milidetik. Perbandingan yang lebih presisi daripada toleransi clock yang kurang akurat tidak bermakna.


Setiap panel di atas disertai SQL yang menghasilkannya. Dengan demikian, Anda dapat melihat secara tepat clock yang menjadi sumber setiap angka. Untuk mengurutkan kembali window print Anda berdasarkan clock lain dan mengamati perubahan tape, ajukan pertanyaan tersebut dalam bahasa sehari-hari di terminal Strasmore.