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:
- 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.
- 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. - 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. - 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.
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 15Katika 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.
Print zilezile, zilizopangwa kwa njia mbili
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.
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 ASCPengo 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.
Print za nje ya soko hufika mbali baada ya tukio
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.
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) ASCKati 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.
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 ASCKwenye 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.