मार्केट डेटा टाइमस्टैम्प: SIP बनाम एक्सचेंज क्लॉक
मार्केट डेटा टाइमस्टैम्प चार अलग-अलग क्लॉक से आते हैं। यह लेख बताता है कि प्रत्येक क्लॉक के आधार पर ट्रेड को सॉर्ट करने से टेप कैसे बदलता है और किस कार्य के लिए कौन सी क्लॉक उपयुक्त है।
मार्केट डेटा टाइमस्टैम्प वे क्लॉक हैं जो किसी ट्रेड प्रिंट पर तब अंकित की जाती हैं जब वह उसे निष्पादित करने वाले मैचिंग इंजन से उस स्क्रीन तक पहुँचता है जहाँ वह दिखाई देता है। अमेरिकी इक्विटी ट्रेड के सार्वजनिक रिकॉर्ड में ऐसे तीन टाइमस्टैम्प होते हैं, और प्रत्येक एक अलग प्रश्न का उत्तर देता है। यदि आप उसी दिन के प्रिंट्स को एक क्लॉक के आधार पर और फिर दूसरी क्लॉक के आधार पर क्रमबद्ध (sort) करते हैं, तो आपके पास दो पूरी तरह से अलग टेप होंगे।
एक प्रिंट द्वारा पार की जाने वाली चार क्लॉक
एक प्रिंट आप तक पहुँचने के रास्ते में बार-बार स्टैम्प किया जाता है। क्रम इस प्रकार है:
- मैचिंग इंजन टाइम: वह क्षण जब किसी वेन्यू के मैचिंग इंजन ने दो ऑर्डर्स को क्रॉस किया। वेन्यू के बाहर कोई भी व्यक्ति इस मान को सीधे नहीं पढ़ता है। यह इस बात का वास्तविक सत्य है कि ट्रेड कब हुआ, और इसके बाद की हर क्लॉक इसका एक अनुमान मात्र है।
- पार्टिसिपेंट टाइम, जिसे वेन्यू या एक्सचेंज टाइम भी कहा जाता है: वह स्टैम्प जिसे वेन्यू तब लिखता है जब वह प्रिंट को अपने स्वयं के फीड पर प्रकाशित करता है, जिसे
participant_timestampफील्ड में रखा जाता है। आप जो कुछ भी वास्तव में पढ़ सकते हैं, उनमें से यह मैचिंग इंजन के सबसे करीब होता है। - SIP टाइम: वह स्टैम्प जिसे सिक्योरिटीज इंफॉर्मेशन प्रोसेसर तब लिखता है जब प्रिंट कंसोलिडेटेड टेप तक पहुँचता है, जो कि एकमात्र आधिकारिक फीड है जो सभी अमेरिकी इक्विटी वेन्यूज को जोड़ती है। यह
sip_timestampफील्ड है, और आधिकारिक टेप अनुक्रम इसी का अनुसरण करता है। उस फीड और वेन्यू के अपने फीड के बीच के अंतर को SIP बनाम डायरेक्ट एक्सचेंज फीड्स में कवर किया गया है। - कैप्चर टाइम: वह स्टैम्प जिसे आपका अपना नेटवर्क कार्ड तब लिखता है जब पैकेट लैंड करता है। यह कभी भी वेंडर के रिकॉर्ड में दिखाई नहीं देता, क्योंकि यह बाजार के बजाय आपके पथ का वर्णन करता है। पैकेट कैप्चर और रीप्ले का कार्य पूरी तरह से इसी क्लॉक पर चलता है।
ऑफ-एक्सचेंज प्रिंट्स में पांचवां स्टैम्प, trf_timestamp होता है, जो यह चिह्नित करता है कि ट्रेड रिपोर्टिंग फैसिलिटी ने रिपोर्ट कब स्वीकार की।
बाजार डेटा टाइमस्टैम्प वेन्यूज के बीच अलग क्यों होते हैं
वेन्यू के स्टैम्प और कंसोलिडेटेड स्टैम्प के बीच का अंतर वह समय है जो एक प्रिंट ट्रांजिट और प्रोसेसर की कतार में बिताता है। यह कोई एक संख्या नहीं है। प्रत्येक वेन्यू प्रोसेसर से अलग दूरी पर स्थित होता है, अलग हार्डवेयर पर होता है, और अलग कतार के पीछे होता है। नीचे दिया गया पैनल 10 जून 2026 को एक निश्चित आधे घंटे के दौरान AAPL को प्रिंट करने वाले प्रत्येक वेन्यू के लिए उस अंतर को मापता है।
हर आंकड़े के पीछे का पूरा SQL
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उन वेन्यूज में, वेन्यू स्टैम्प और कंसोलिडेटेड स्टैम्प के बीच सबसे बड़ा मीडियन अंतर 346.2 माइक्रोसेकंड था, जो NYSE Arca, Inc. पर था। उसी विंडो में सबसे सटीक वेन्यू 13.7 माइक्रोसेकंड पर चला। p99 कॉलम वह है जिसे ध्यान से देखना चाहिए: उसी सबसे धीमे वेन्यू के लिए यह 420.8 माइक्रोसेकंड तक पहुँच गया, जो उस टेल (tail) को दर्शाता है जिसे मीडियन छिपा देता है।
आपको किस टाइमस्टैम्प का उपयोग करना चाहिए
चार नियम लगभग हर मामले को कवर करते हैं।
- माइक्रोस्ट्रक्चर कार्य और इवेंट स्टडीज के लिए पार्टिसिपेंट टाइम: वेन्यू पर क्या हुआ और किस क्रम में हुआ, यह मापने वाली कोई भी चीज़ वेन्यू क्लॉक पर होनी चाहिए। ऑर्डर बुक रिकंस्ट्रक्शन, जो MBO बनाम MBP ऑर्डर बुक डेटा का विषय है, किसी अन्य क्लॉक पर अनुपयोगी है।
- आधिकारिक टेप के साथ मिलान करने वाली किसी भी चीज़ के लिए SIP टाइम: नियामक रिपोर्टिंग, बेस्ट एग्जीक्यूशन रिव्यू, आधिकारिक ओपन और क्लोज, और कोई भी आंकड़ा जिसे काउंटरपार्टी कंसोलिडेटेड रिकॉर्ड के खिलाफ जांचेगी।
- केवल अपने स्वयं के पथ को मापने के लिए कैप्चर टाइम: यह आपको बताता है कि डेटा को आपकी मशीन तक पहुँचने में कितना समय लगा। यह आपको ट्रेड के समय के बारे में कुछ नहीं बताता, और दो मशीनें इस पर कभी सहमत नहीं होतीं।
- एक डेटासेट के भीतर कभी भी क्लॉक को न मिलाएं: एक जॉइन जो एक क्लॉक पर कोट्स का मिलान दूसरी क्लॉक पर ट्रेडों के साथ करता है, ऐसे परिणाम देता है जो सही दिखते हैं लेकिन ठीक उन क्षणों में विफल हो जाते हैं जो मायने रखते हैं।
वही प्रिंट्स, दो तरह से क्रमबद्ध
क्रमबद्ध करना (sorting) वह जगह है जहाँ एब्स्ट्रैक्शन टूट जाता है। नीचे दिया गया पैनल उस आधे घंटे के सबसे व्यस्त दस मिलीसेकंड को लेता है, वेन्यू ऑर्डर में पहले बारह ऑन-एक्सचेंज प्रिंट्स को रखता है, फिर उन्हीं बारह को कंसोलिडेटेड टेप ऑर्डर में रैंक करता है। तालिका को इस आधार पर क्रमबद्ध किया गया है कि प्रत्येक प्रिंट दोनों रैंकिंग के बीच कितना आगे बढ़ा।
हर आंकड़े के पीछे का पूरा SQL
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एक प्रिंट की दो रैंकों के बीच का सबसे बड़ा अंतर 6 है। वह प्रिंट 10:44:17.160712 पर अपने वेन्यू से निकला और 305.7 माइक्रोसेकंड बाद, 10:44:17.161018 पर टेप तक पहुँचा, जो वेन्यू क्लॉक पर स्थिति 6 से टेप पर स्थिति 12 पर चला गया। कोई भी क्रम गलत नहीं है। वे अलग-अलग सवालों के जवाब देते हैं। टेप क्लॉक पर चलाई गई ट्रेड सीक्वेंस स्टडी इस बर्स्ट को उस क्रम में पढ़ती है जो किसी वेन्यू ने कभी उत्पन्न नहीं किया, और वेन्यू क्लॉक पर चलाया गया बेस्ट एग्जीक्यूशन रिव्यू आधिकारिक रिकॉर्ड से असहमत होता है।
ऑफ-एक्सचेंज प्रिंट्स घटना के काफी पीछे लैंड करते हैं
एक्सचेंज से दूर, किसी होलसेलर के पास या डार्क पूल में निष्पादित ट्रेड की रिपोर्ट सार्वजनिक बुक पर मिलान करने के बजाय ट्रेड रिपोर्टिंग फैसिलिटी को दी जाती है। रिपोर्ट में निष्पादन का समय होता है, और यह बाद में टेप पर पहुँचती है। वह अंतराल यात्रा के समय के बजाय रिपोर्टिंग में देरी है, और यह परिमाण के कई गुना बड़ा है।
हर आंकड़े के पीछे का पूरा SQL
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उस विंडो में ऑफ-एक्सचेंज AAPL प्रिंट्स में से, 24.8%, under 1 ms बकेट में लैंड करते हैं। टेल 1 s to 10 s बकेट तक जाती है, जिसमें 74 प्रिंट्स हैं। दस सेकंड देरी से आने वाला प्रिंट भी वही वेन्यू क्लॉक समय रखता है जिस पर वह वास्तव में निष्पादित हुआ था, जबकि वह टेप के स्ट्रीम में उससे दस सेकंड पीछे बैठा होता है। टेप समय के अनुसार क्रमबद्ध करें तो यह गलत मिनट में दिखाई देता है। सामान्य अनुक्रम के बाहर रिपोर्ट किए गए प्रिंट्स में सेल कंडीशन कोड होते हैं जो ऐसा बताते हैं, जो उन चीजों में से एक है जिन्हें ट्रेड कंडीशन कोड फ्लैग करने के लिए मौजूद हैं।
दो लोग एक ही ट्रेड से अलग-अलग बार (bars) क्यों बनाते हैं
लगभग हर "डेटा गलत है" वाली शिकायत यहीं आती है। एक बार प्रिंट्स की एक बाल्टी है, और एक प्रिंट किस बाल्टी में गिरता है, यह इस पर निर्भर करता है कि आप किस स्टैम्प के आधार पर बकेटिंग कर रहे हैं। नीचे दिया गया पैनल उन प्रिंट्स की गणना करता है जो वेन्यू क्लॉक से टेप क्लॉक पर स्विच करने पर बकेट बदलते हैं, चार सामान्य बार लंबाई के आधार पर।
हर आंकड़े के पीछे का पूरा SQL
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 ASC1 second ग्रिड पर, उस विंडो में 8.966% प्रिंट्स दो क्लॉक के तहत एक अलग बार में गिरते हैं, कुल मिलाकर 8944 प्रिंट्स। बार को 5 minutes तक खींचें तो आंकड़ा घटकर 0.024% हो जाता है। पैटर्न यांत्रिक है: एक प्रिंट तब बकेट बदलता है जब उसका क्लॉक गैप किसी सीमा (boundary) को पार करता है, और छोटे बार में अधिक सीमाएं होती हैं। दो वेंडर दोनों सही हो सकते हैं और फिर भी एक ही मिनट के लिए अलग-अलग वॉल्यूम प्रकाशित कर सकते हैं। निर्माण प्रक्रिया को OHLCV बार कैसे बनाए जाते हैं में समझाया गया है।
नैनोसेकंड फील्ड का मतलब नैनोसेकंड सटीकता नहीं है
दोनों स्टैम्प नैनोसेकंड रिज़ॉल्यूशन वाले पूर्णांकों (integers) के रूप में आते हैं। रिज़ॉल्यूशन वह है जिसे एक फील्ड व्यक्त कर सकता है। सटीकता यह है कि मान वास्तविक समय के कितने करीब है, और ये दोनों पूरी तरह से अलग चीजों द्वारा निर्धारित होते हैं।
उद्योग भर में क्लॉक संरेखण (alignment) भौतिकी के बजाय नियामक सहनशीलता (regulatory tolerance) द्वारा शासित होता है। FINRA का क्लॉक सिंक्रोनाइज़ेशन नियम सदस्य फर्मों की व्यावसायिक क्लॉक को NIST संदर्भ के 50 मिलीसेकंड के भीतर रखने का निर्देश देता है। एक्सचेंज और प्रोसेसर बहुत अधिक सटीक होते हैं, जो प्रिसिजन टाइम प्रोटोकॉल (PTP, जिसे IEEE 1588 के रूप में मानकीकृत किया गया है) का उपयोग करते हैं, जो उसी नेटवर्क पर एक संदर्भ क्लॉक वितरित करता है जो डेटा ले जाता है और मशीनों को सब-माइक्रोसेकंड संरेखण में रखता है।
दो बातें स्पष्ट हैं। एक संगठन के स्टैम्प के भीतर, माइक्रोसेकंड रिज़ॉल्यूशन पर क्रमबद्ध करना सार्थक है। संगठनों के बीच, दो स्टैम्प के बीच कुछ सौ नैनोसेकंड का अंतर एरर बार के भीतर होता है, और इसे वास्तविक क्रम के रूप में मानना केवल शोर (noise) को पढ़ना है।
अक्सर पूछे जाने वाले प्रश्न
SIP टाइमस्टैम्प और पार्टिसिपेंट टाइमस्टैम्प के बीच क्या अंतर है?
पार्टिसिपेंट टाइमस्टैम्प वेन्यू द्वारा तब लिखा जाता है जब वह अपने स्वयं के फीड पर ट्रेड प्रकाशित करता है। SIP टाइमस्टैम्प कंसोलिडेटेड टेप प्रोसेसर द्वारा तब लिखा जाता है जब वह ट्रेड आधिकारिक संयुक्त फीड तक पहुँचता है। उनके बीच का अंतर ट्रांजिट और कतार का समय है, जिसे ऑन-एक्सचेंज प्रिंट्स के लिए माइक्रोसेकंड में और ट्रेड रिपोर्टिंग फैसिलिटी के माध्यम से रिपोर्ट किए गए प्रिंट्स के लिए अक्सर मिलीसेकंड या उससे अधिक में मापा जाता है।
बैकटेस्टिंग के लिए मुझे किस मार्केट डेटा टाइमस्टैम्प का उपयोग करना चाहिए?
किसी भी ऐसी चीज़ के लिए पार्टिसिपेंट टाइमस्टैम्प का उपयोग करें जो यह मॉडल करती है कि एक पार्टिसिपेंट ने वेन्यू पर क्या देखा या किया होगा, और उस चीज़ के लिए SIP टाइमस्टैम्प का उपयोग करें जिसे आधिकारिक कंसोलिडेटेड रिकॉर्ड के साथ मेल खाना चाहिए। आप जो भी चुनें, उसे अध्ययन की प्रत्येक तालिका पर लागू करें, जिसमें कोट्स भी शामिल हैं।
मेरे एक मिनट के बार मेरे डेटा प्रदाता के बार से मेल क्यों नहीं खाते?
क्लॉक का बेमेल होना इसका सामान्य उत्तर है। एक प्रिंट जिसका वेन्यू स्टैम्प मिनट की सीमा से ठीक पहले आता है, उसका टेप स्टैम्प उसके ठीक बाद आ सकता है, जो उसी ट्रेड को दो कन्वेंशन के तहत अलग-अलग बार में रखता है। देर से रिपोर्ट किए गए ऑफ-एक्सचेंज प्रिंट्स इस प्रभाव को और बढ़ा देते हैं।
क्या नैनोसेकंड टाइमस्टैम्प नैनोसेकंड तक सटीक होते हैं?
नहीं। फील्ड में नैनोसेकंड रिज़ॉल्यूशन होता है, और सटीकता इस बात से निर्धारित होती है कि लिखने वाली मशीन की क्लॉक कितनी अच्छी तरह सिंक्रोनाइज़्ड है। PTP का उपयोग करने वाले एक्सचेंज और प्रोसेसर सिस्टम सब-माइक्रोसेकंड संरेखण बनाए रखते हैं, जबकि ब्रोकर की व्यावसायिक क्लॉक 50 मिलीसेकंड की नियामक सहनशीलता तक सीमित होती हैं। ढीली क्लॉक की सहनशीलता से अधिक सूक्ष्म तुलना सार्थक नहीं है।
ऊपर दिया गया प्रत्येक पैनल उस SQL के साथ आता है जिसने इसे तैयार किया है, ताकि आप देख सकें कि प्रत्येक संख्या किस क्लॉक से आई है। अपनी प्रिंट्स की विंडो को किसी अलग क्लॉक के तहत फिर से क्रमबद्ध करने और टेप को बदलते हुए देखने के लिए, Strasmore टर्मिनल पर सादे अंग्रेजी में प्रश्न पूछें।