Strasmore Research

Tofauti za Timestamp katika data ya soko: SIP vs Exchange

Timestamp za data ya soko hutokana na saa nne tofauti. Jifunze jinsi ya kupanga biashara kwa kila saa na kuelewa ni ipi inayofaa kutumika kwa uchambuzi wako wa kifedha.

Timestamp za data ya soko ni saa zilizopigwa kwenye print ya biashara moja kadiri inavyosafiri kutoka kwenye matching engine iliyoitekeleza hadi kwenye skrini inayoionyesha. Biashara ya hisa ya Marekani hubeba tatu kati ya hizi kwenye rekodi ya umma, na kila moja hujibu swali tofauti. Panga print za siku moja kwa saa moja kisha kwa nyingine, na utashikilia tepu mbili tofauti kabisa.

Saa nne ambazo print moja hupitia

Print hupigwa muhuri mara kwa mara ikiwa njiani kuelekea kwako. Kwa mpangilio:

  1. Matching engine time. Muda ambao matching engine ya soko ilikutanisha oda mbili. Hakuna mtu nje ya soko anayesoma thamani hii moja kwa moja. Huu ndio ukweli wa msingi wa wakati biashara ilipotokea, na kila saa inayofuata ni makadirio yake.
  2. Participant time, pia inaitwa venue au exchange time. Muhuri ambao soko huandika linapochapisha print kwenye feed yake yenyewe, inayobebwa kwenye uwanja wa participant_timestamp. Kati ya kila kitu unachoweza kusoma, hii ndiyo iliyo karibu zaidi na matching engine.
  3. SIP time. Muhuri ambao securities information processor huandika wakati print inapofika kwenye consolidated tape, feed rasmi moja inayounganisha kila soko la hisa la Marekani. Hii ni uwanja wa sip_timestamp, na mpangilio rasmi wa tepu huifuata. Mgawanyiko kati ya feed hiyo na ya soko lenyewe umeelezwa katika SIP dhidi ya direct exchange feeds.
  4. Capture time. Muhuri ambao kadi yako ya mtandao huandika wakati pakiti inapotua. Haiwahi kuonekana kwenye rekodi ya muuzaji, kwa sababu inaelezea njia yako badala ya soko. Kazi ya Packet capture and replay hutegemea kabisa saa hii.

Print za nje ya soko (off exchange) hubeba muhuri wa tano, trf_timestamp, unaoashiria wakati kituo cha kuripoti biashara (trade reporting facility) kilipopokea ripoti hiyo.

Kwa nini timestamp za data ya soko hazikubaliani kati ya masoko

Pengo kati ya muhuri wa soko na muhuri wa consolidated ni muda ambao print ilitumia kusafiri na kwenye foleni ya processor. Si namba moja. Kila soko liko umbali tofauti kutoka kwa processor, kwenye vifaa tofauti, nyuma ya foleni tofauti. Paneli iliyo hapa chini inapima pengo hilo kwa kila soko lililochapisha AAPL wakati wa nusu saa maalum mnamo 10 Juni 2026.

UlizaMchepuko wa saa wa SIP kulingana na kituo, AAPL, 10 Juni 2026 (microseconds)
SQL halisi nyuma ya kila namba
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

Katika masoko hayo, pengo kubwa zaidi la wastani kati ya muhuri wa soko na muhuri wa consolidated lilikuwa 346.2 microseconds, katika NYSE Arca, Inc.. Soko la haraka zaidi katika dirisha hilo lilikuwa 13.7 microseconds. Safu ya p99 ndiyo inayostahili kuzingatiwa: kwa soko hilo hilo la polepole ilifikia 420.8 microseconds, mkia ambao wastani huuficha.

Ni timestamp ipi unayopaswa kutumia

Kanuni nne hufunika karibu kila kisa.

  • Participant time kwa kazi ya microstructure na tafiti za matukio. Kitu chochote kinachopima kilichotokea sokoni na kwa mpangilio upi ni cha saa ya soko. Ujenzi upya wa kitabu cha oda (order book), mada ya MBO dhidi ya MBP order book data, hauwezi kutumika kwenye saa nyingine yoyote.
  • SIP time kwa kitu chochote kinachopaswa kupatanishwa na tepu rasmi. Kuripoti kwa mdhibiti, mapitio ya best execution, ufunguzi na kufungwa rasmi, na takwimu yoyote ambayo mshirika wa biashara ataiangalia dhidi ya rekodi iliyounganishwa.
  • Capture time kwa ajili ya kupima njia yako mwenyewe pekee. Inakuambia muda ambao data ilichukua kufika kwenye mashine yako. Haikuambii chochote kuhusu wakati biashara ilipotokea, na mashine mbili hazikubaliani kamwe juu yake.
  • Usichanganye kamwe saa ndani ya dataset moja. Uunganishaji unaolinganisha quotes kwenye saa moja dhidi ya biashara kwenye nyingine hurejesha namba zinazoonekana kuwa za kweli lakini zinashindwa katika nyakati muhimu.

Upangaji ndipo dhana inapovunjika. Paneli iliyo hapa chini inachukua milliseconds kumi zenye shughuli nyingi zaidi za nusu saa hiyo, inaweka print kumi na mbili za kwanza za soko kwa mpangilio wa soko, kisha inapanga kumi na mbili zilezile tena kwa mpangilio wa consolidated tape. Jedwali limepangwa kulingana na umbali ambao kila print ilihama kati ya upangaji huo mbili.

UlizaMachapisho kumi na mawili yaleyale, yaliyopangwa kulingana na saa ya kituo na saa ya mkanda
SQL halisi nyuma ya kila namba
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

Pengo kubwa zaidi kati ya nafasi mbili za print ni 6. Print hiyo iliondoka sokoni kwake saa 10:44:17.160712 na kufika kwenye tepu 305.7 microseconds baadaye, saa 10:44:17.161018, ikihama kutoka nafasi ya 6 kwenye saa ya soko hadi nafasi ya 12 kwenye tepu. Hakuna mpangilio ulio mbaya. Yanajibu maswali tofauti. Utafiti wa mfuatano wa biashara unaoendeshwa kwenye saa ya tepu husoma mlipuko huu kwa mpangilio ambao hakuna soko lililowahi kuutoa, na mapitio ya best execution yanayoendeshwa kwenye saa ya soko hayakubaliani na rekodi rasmi.

Biashara iliyotekelezwa nje ya soko, kwa muuzaji wa jumla au katika dark pool, huripotiwa kwenye kituo cha kuripoti biashara badala ya kulinganishwa kwenye kitabu cha umma. Ripoti hiyo hubeba muda wa utekelezaji, na hufika kwenye tepu baadaye. Muda huo ni ucheleweshaji wa kuripoti badala ya muda wa kusafiri, na ni mkubwa zaidi kwa kiasi kikubwa.

UlizaMachapisho ya AAPL nje ya soko kulingana na ucheleweshaji wa kuripoti, 10 Juni 2026
SQL halisi nyuma ya kila namba
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

Kati ya print za AAPL za nje ya soko katika dirisha hilo, 24.8% hutua kwenye ndoo ya under 1 ms. Mkia huishia kwenye ndoo ya 1 s to 10 s, ukiwa na print 74. Print inayofika sekunde kumi baadaye bado hubeba muda wa saa ya soko ilipotekelezwa, huku ikiwa kwenye mtiririko wa tepu sekunde kumi nyuma yake. Panga kwa muda wa tepu na itaonekana katika dakika isiyo sahihi. Print zilizoripotiwa nje ya mpangilio wa kawaida hubeba misimbo ya hali ya mauzo (sale condition codes) inayosema hivyo, ambayo ni moja ya mambo ambayo trade condition codes zipo ili kuyaashiria.

Kwa nini watu wawili hujenga pau tofauti kutoka kwa biashara zilezile

Karibu kila tiketi ya "data si sahihi" huishia hapa. Pau ni ndoo ya print, na ndoo ambayo print huangukia inategemea ni muhuri upi unaotumia kuweka kwenye ndoo. Paneli iliyo hapa chini inahesabu print zinazobadilisha ndoo unapobadili kutoka saa ya soko kwenda saa ya tepu, katika urefu nne wa kawaida wa pau.

UlizaMachapisho yanayobadilisha pau unapobadilisha saa, kulingana na urefu wa pau
SQL halisi nyuma ya kila namba
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

Kwenye gridi ya 1 second, 8.966% ya print katika dirisha hilo huangukia kwenye pau tofauti chini ya saa hizo mbili, jumla ya print 8944. Panua pau hadi 5 minutes na takwimu inashuka hadi 0.024%. Mfumo ni wa kimitambo: print hubadilisha ndoo wakati wowote pengo lake la saa linapovuka mpaka, na pau fupi hubeba mipaka mingi zaidi. Wauzaji wawili wanaweza wote kuwa sahihi na bado wakachapisha ujazo tofauti kwa dakika ileile. Ujenzi wenyewe unaelezwa katika how OHLCV bars are built.

Uwanja wa nanosecond si usahihi wa nanosecond

Muhuri zote hufika kama namba kamili (integers) zenye azimio la nanosecond. Azimio ni kile ambacho uwanja unaweza kuelezea. Usahihi ni jinsi thamani inavyokaribia muda wa kweli, na hizo mbili huwekwa na mambo tofauti kabisa.

Ulinganishaji wa saa katika sekta nzima huongozwa na uvumilivu wa kikanuni badala ya fizikia. Kanuni ya ulinganishaji wa saa ya FINRA huweka saa za biashara za makampuni wanachama ndani ya milliseconds 50 za marejeleo ya NIST. Masoko na processor huendesha kwa kasi zaidi, kwa kutumia Precision Time Protocol (PTP, iliyosanifiwa kama IEEE 1588), ambayo husambaza saa ya marejeleo juu ya mtandao uleule unaobeba data na kuweka mashine katika ulinganishaji wa chini ya microsecond.

Mambo mawili hufuata. Ndani ya muhuri za shirika moja, kupanga kwa azimio la microsecond kuna maana. Katika mashirika, tofauti ya mamia machache ya nanoseconds kati ya muhuri mbili iko ndani ya upeo wa makosa, na kuichukulia kama mpangilio halisi ni kusoma kelele.

Maswali Yanayoulizwa Mara Kwa Mara

Kuna tofauti gani kati ya SIP timestamp na participant timestamp?

Participant timestamp huandikwa na soko linapochapisha biashara kwenye feed yake yenyewe. SIP timestamp huandikwa na consolidated tape processor wakati biashara hiyo inafika kwenye feed rasmi iliyounganishwa. Pengo kati yao ni muda wa kusafiri na foleni, uliopimwa kwa microseconds kwa print za ndani ya soko na mara nyingi kwa milliseconds au zaidi kwa print zilizoripotiwa kupitia kituo cha kuripoti biashara.

Ni timestamp ipi ya data ya soko ninayopaswa kutumia kwa backtesting?

Tumia participant timestamp kwa kitu chochote kinachounda kile ambacho mshiriki angeweza kuona au kufanya sokoni, na SIP timestamp kwa kitu chochote kinachopaswa kupatanishwa na rekodi rasmi iliyounganishwa. Chochote unachochagua, kitumie kwenye kila jedwali katika utafiti, ikiwa ni pamoja na quotes.

Kwa nini pau zangu za dakika moja hazilingani na za mtoa data wangu?

Kutolingana kwa saa ndilo jibu la kawaida. Print ambayo muhuri wake wa soko huanguka kabla ya mpaka wa dakika inaweza kubeba muhuri wa tepu baada yake, ambayo huweka biashara ileile katika pau tofauti chini ya mikataba hiyo miwili. Print za nje ya soko zilizoripotiwa kwa kuchelewa huongeza athari hiyo.

Je, timestamp za nanosecond ni sahihi hadi nanosecond?

Hapana. Uwanja hushikilia azimio la nanosecond, na usahihi huwekwa na jinsi saa ya mashine inayoandika inavyolinganishwa vizuri. Mifumo ya soko na processor inayotumia PTP hushikilia ulinganishaji wa chini ya microsecond, wakati saa za biashara za mawakala huwekwa kwa uvumilivu wa kikanuni wa milliseconds 50. Ulinganisho ulio sahihi zaidi kuliko uvumilivu wa saa isiyo sahihi hauna maana.


Kila paneli hapo juu inakuja na SQL iliyoizalisha, ili uweze kuona ni saa ipi kila namba ilitoka. Ili kupanga upya dirisha lako la print chini ya saa tofauti na kutazama tepu ikibadilika, uliza swali kwa Kiingereza rahisi kwenye terminal ya Strasmore.