Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-07-23

Microstructure বিশ্লেষণ: ২৯ জুন, ২০২৬

২৯ জুন, ২০২৬-এর ট্রেড এবং কোট টেপ, ভলিউম সংশোধন এবং FINRA ফাইলের বিস্তারিত বিশ্লেষণ দেখুন। বাজারের সূক্ষ্ম পরিবর্তনগুলো বুঝতে এই প্রতিবেদনটি পড়ুন।

এটি ২৯ জুন, ২০২৬-এর মার্কেট রিক্যাপ-এর একটি বিস্তারিত বিশ্লেষণ: প্রতিটি মিনিটের বার-এর নিচের প্রকৃত তথ্যসমূহ — একটি সাধারণ সোমবারের সেশনে 156.1 মিলিয়ন স্বতন্ত্র ট্রেড এবং 505.38 মিলিয়ন NBBO কোট আপডেট। প্রতিটি সংখ্যা একটি সংরক্ষিত কুয়েরি ফলাফল (সঠিক SQL দেখতে যেকোনো প্যানেল প্রসারিত করুন)। দিনের দুটি ফরেনসিক অনুসন্ধানের পূর্ণাঙ্গ বিবরণ এখানে দেওয়া হলো: একটি ভলিউম সংশোধন যা টেপ-এর নিজস্ব কোড ডিকশনারি অনুযায়ী প্রয়োজন, এবং একটি ভেন্ডর ফাইল যা নিঃশব্দে 'S' অক্ষরের পর থেমে গেছে।

ট্রেড টেপ, প্রিন্ট বাই প্রিন্ট

সেশনের অবস্থা যাচাই করা প্রথম কাজ, কোনো কিছু অনুমান করা যাবে না: এক্সচেঞ্জ ছুটির ক্যালেন্ডারে ২০২৬ সালের জুন ২৯ তারিখের জন্য 0টি সারি রয়েছে এবং SPY নিয়মিত সময়ের মধ্যে ঠিক 390টি মিনিট বার প্রিন্ট করেছে — যা নিউ ইয়র্ক সময় সকাল ৯:৩০ থেকে বিকেল ৪:০০ পর্যন্ত একটি পূর্ণাঙ্গ সেশন। বর্ধিত সময়ের (extended day) মধ্যে, কনসোলিডেটেড টেপে 156.1 মিলিয়ন স্বতন্ত্র ট্রেড রেকর্ড করা হয়েছে।

কুয়েরিএক দিনের ট্রেড: সেশন চেক এবং প্রতিটি প্রিন্টের সাইজ
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-06-29') AS holiday_rows,
    (
        SELECT countIf(window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-06-29 00:00:00' AND window_start < '2026-06-30 00:00:00'
    ) AS spy_bars
SELECT
    holiday_rows AS holiday_rows_jun29,
    spy_bars AS spy_regular_session_bars,
    round(count() / 1e6, 1) AS trades_m,
    round(100.0 * countIf(size < 100) / count(), 2) AS odd_lot_pct_of_trades,
    round(100.0 * toFloat64(sumIf(size, size < 100)) / toFloat64(sum(size)), 2) AS odd_lot_pct_of_shares,
    multiIf(
        countIf(size <= 19) >= 0.5 * count(), 19,
        countIf(size <= 20) >= 0.5 * count(), 20,
        countIf(size <= 21) >= 0.5 * count(), 21,
        countIf(size <= 22) >= 0.5 * count(), 22,
        countIf(size <= 23) >= 0.5 * count(), 23,
        0) AS median_print_shares,
    round(countIf(size = 1) / 1e6, 1) AS one_share_trades_m,
    round(100.0 * countIf(size != round(size)) / count(), 2) AS fractional_pct_of_trades
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

সব প্রিন্টের মধ্যে 72.61%টি ছিল অড লট — অর্থাৎ ১০০ শেয়ারের কম ট্রেড — তবুও এগুলো মাত্র 8.79%টি র র শেয়ার মুভ করেছে — যা নিচের ভলিউম-ফরেনসিক বিভাগে সংশোধন করা হবে। মিডিয়ান প্রিন্ট ছিল 21 শেয়ার, যা একটি সেলফ-ভেরিফাইং ব্র্যাকেট প্রবের মাধ্যমে পরিমাপ করা হয়েছে — যেখানে ১৯ থেকে ২৩ শেয়ারের মধ্যে কিউমুলেটিভ কাউন্ট করা হয় — যদি ব্র্যাকেটটি মিস করে তবে এটি ০ রিটার্ন করে এবং এর একটি নির্দিষ্ট সীমা রয়েছে। 17.9 মিলিয়ন প্রিন্ট ছিল ঠিক এক শেয়ারের জন্য এবং 4.73%টি ছিল ভগ্নাংশ আকারের — এই প্যাটার্নটি রিটেইল অ্যাপগুলোর মাধ্যমে এক এক চrzক করে টেপে আসা ট্রেডের সাথে সামঞ্জস্যপূর্ণ, যেখানে মার্কেট মেকাররা অন্য পাশ গ্রহণ করছে

ভলিউম ফরেনসিকস: ডিকশনারি থেকে "matched volume" নির্ণয় করা

প্রতিটি প্রিন্টের সাইজ ফিল্ড যোগ করলে ২৯ জুন তারিখে 24.79 বিলিয়ন শেয়ার লেনদেন হয়েছে বলে দেখা যায়। এই সংখ্যাটি ভুল এবং টেপ নিজেই তা নির্দেশ করে। প্রতিটি প্রিন্টে কন্ডিশন কোড থাকে। SIP — যা প্রতিটি ভেন্যুকে একটি স্ট্রিমে একত্রিত করে — একটি ডিকশনারি প্রকাশ করে। এই ডিকশনারিতে প্রতিটি কোড অনুযায়ী বলা থাকে যে প্রিন্টটি কনসোলিডেটেড ভলিউম আপডেট করবে কি না। কিছু মেসেজ হলো ইতিমধ্যে গণনা করা ভলিউমের অ্যাডমিনিস্ট্রেটিভ রি-ব্রডকাস্ট। "পরিচিত" কোডগুলোর একটি তালিকা হার্ডকোড করার পরিবর্তে, এই পোস্টটি ডিকশনারি থেকেই বাদ দেওয়ার সেটটি (exclusion set) নির্ণয় করে:

কুয়েরিএক্সক্লুশন সেট, যা টেপ কোড ডিকশনারি থেকে প্রাপ্ত (এক সারি)
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    count() AS excluded_codes,
    sum(id) AS excluded_id_checksum,
    arrayStringConcat(arraySort(groupArray(concat(toString(id), ' ', name))), ' · ') AS codes
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
  AND type = 'sale_condition'
  AND JSONExtractBool(update_rules, 'consolidated', 'updates_volume') = 0

কনসোলিডেটেড ফিডে 3টি সেল কন্ডিশনে updates_volume = false থাকে: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market)। এখানে একটি উদাহরণ দেওয়া হলো: ডেইলি রিক্যাপের একটি পূর্বের খসড়ায় ১৫ এবং ১৬ নম্বর কোডটি হার্ডকোড করা হয়েছিল — যা প্রতিটি ডেটা গাইডে উল্লিখিত অফিসিয়াল ওপেন/ক্লোজ মেসেজ — কিন্তু ৩৮ নম্বর কোডটি সম্পূর্ণ বাদ পড়ে গিয়েছিল। কোনো কোড তালিকার পরিবর্তে ডিকশনারিই হলো তথ্যের একমাত্র উৎস।

দুটি ব্লকের ব্যবহার এখানে উদ্দেশ্যমূলক: 156.1 মিলিয়ন-রো স্ক্যানের ভেতরে ডিকশনারির ওপর একটি স্কেলার সাবকোয়েরি চালালে আমাদের ৩০ সেকেন্ডের সময়সীমা অতিক্রম করে যায়। তাই উপরের ব্লকটি কোড সংখ্যা এবং একটি আইডি চেকসাম (69) এর মাধ্যমে সীমাবদ্ধ রেখে সেটটিকে একটি রো হিসেবে নির্ণয় করে এবং নিচের ব্লকটি সেই প্রাপ্ত লিটারেলগুলো প্রয়োগ করে। ডিকশনারি পরিবর্তিত হয়ে গেলে, চেকসামটি এই পোস্টটিকে পর্যালোচনার জন্য চিহ্নিত রাখবে; ফলে লিটারেলগুলো কখনোই নীরবে পুরনো হয়ে যাবে না।

কুয়েরিRaw বনাম SIP-কাউন্টেড ভলিউম, প্রাপ্ত এক্সক্লুশন সেট প্রয়োগ করে
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    round(toFloat64(sum(size)) / 1e9, 2) AS raw_shares_bn,
    round(toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))) / 1e9, 2) AS matched_shares_bn,
    round(toFloat64(sumIf(size, hasAny(conditions, [15, 16, 38]))) / 1e9, 2) AS excluded_shares_bn,
    countIf(hasAny(conditions, [15, 16, 38])) AS excluded_prints
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

সংশোধিত হিসাব: 24.79 বিলিয়ন শেয়ার রের (raw), 20.66 বিলিয়ন SIP-গণিতিত, 4.13 বিলিয়ন বাদ দেওয়া হয়েছে 91175টি অ্যাডমিনিস্ট্রেটিভ প্রিন্টের মাধ্যমে। একটি সুনির্দিষ্ট সংজ্ঞা: "matched volume" মানে হলো SIP-এর নিজস্ব কন্ডিশন রুলস অনুযায়ী কনসোলিডেটেড টোটালের জন্য গণনা করা ভলিউম — এর বেশি কিছু নয়। আমরা কোন ট্রেডগুলো অর্থনৈতিকভাবে গুরুত্বপূর্ণ তা বিচার করছি না; আমরা কেবল টেপের নিজস্ব অ্যাকাউন্টিং প্রয়োগ করছি।

বড় লেনদেনের বিশ্লেষণ

দিনের সবচেয়ে বড় লেনদেনগুলো (prints) কেবল সাধারণ তথ্য নয়, বরং এগুলো বাজারের অবস্থা বুঝতে সাহায্য করে:

কুয়েরিজুন ২৯-এর বৃহত্তম সিঙ্গেল প্রিন্ট (ডিকশনারি-বহির্ভূত কোড ছাড়া)
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    ticker,
    formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S') AS et_time,
    round(toFloat64(size) / 1e6, 2) AS shares_m,
    toFloat64(price) AS price,
    round(toFloat64(size) * toFloat64(price) / 1e6, 1) AS notional_usd_m,
    round(100 * (toFloat64(size) * toFloat64(price)) / max(toFloat64(size) * toFloat64(price)) OVER (), 1) AS pct_of_biggest_dollar_print,
    arrayStringConcat(arrayMap(c -> toString(c), conditions), ', ') AS condition_id
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
  AND size >= 10000000
  AND NOT hasAny(conditions, [15, 16, 38])
ORDER BY size DESC
LIMIT 10

উপরের সারিগুলো একটি উদাহরণ হিসেবে দেখুন। দিনের সবচেয়ে বড় লেনদেনটি হলো — 61.69 মিলিয়ন CAG (Conagra) শেয়ার, যার মূল্য প্রতি শেয়ার 13.98 ডলার, অর্থাৎ মোট প্রায় 862.5 মিলিয়ন ডলার। এটি 16:04:53 ET সময়ে 8, 41 কোড সম্বলিত লেনদেন হিসেবে নিবন্ধিত — যা মূলত বিকেল ৪:০০ টার পর প্রকাশিত NYSE ক্লোজিং অকশন (closing auction) এর ফলাফল। এটি ভলিউম বা লেনদেনের পরিমাণের হিসেবে মাত্র একবার গণনা করা হয়। একই 61.69 মিলিয়ন শেয়ার পরে কোড ১৫ (Market Center Official Close) হিসেবে পুনরায় দেখা যায়; এটি একটি পুনঃপ্রতিবেদন (re-report) যা ডিকশনারি অনুযায়ী বাদ দেওয়া হয় এবং উপরে উল্লিখিত 4.13 বিলিয়ন থেকে বাদ দেওয়া হয়েছে। কোড-১৫ যুক্ত সারিটি ইচ্ছাকৃতভাবে উপরের তালিকা থেকে বাদ দেওয়া হয়েছে, তাই এর জন্য আলাদা একটি ছোট প্যানেল রয়েছে:

কুয়েরিরিসিট: CAG-এর ক্লোজিং অকশন এবং এর কোড-15 রি-রিপোর্ট, পাশাপাশি
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_print_shares_m,
    round(toFloat64(maxIf(size, has(conditions, 15))) / 1e6, 2) AS official_close_reprint_shares_m,
    round(toFloat64(maxIf(size, has(conditions, 8))) - toFloat64(maxIf(size, has(conditions, 15))), 2) AS share_difference,
    formatDateTime(toTimeZone(argMaxIf(sip_timestamp, size, has(conditions, 15)), 'America/New_York'), '%H:%i:%S') AS reprint_et,
    argMaxIf(exchange, size, has(conditions, 15)) AS reprint_exchange_id,
    countIf(has(conditions, 15)) AS cag_code15_prints
FROM global_markets.stocks_trades
WHERE ticker = 'CAG'
  AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

CAG এর 6টি অফিসিয়াল-ক্লোজ মেসেজের মধ্যে সবচেয়ে বড়টি হলো 61.69 মিলিয়ন শেয়ার — যা অকশনের ঠিক 61.69 মিলিয়ন শেয়ার (পার্থক্য: 0) — এটি 16:04:53 ET সময়ে এক্সচেঞ্জ আইডি 10 থেকে নিবন্ধিত, যা স্টক ডিরেক্টরি অনুযায়ী NYSE: অর্থাৎ লিস্টিং মার্কেট তার নিজস্ব অকশনের তথ্য পুনরায় প্রকাশ করছে।

অন্যান্য CAGটি সারি সম্পূর্ণ ভিন্ন প্রকৃতির — কোড 12, 2 (12 Form T / extended hours, 2 Average Price Trade) এর অধীনে থাকা 15.17 মিলিয়ন শেয়ারের লেনদেন এবং কোড ১২ এর অধীনে থাকা আরও দুটি লেনদেন হলো অকশনের পরবর্তী লেনদেন (post-auction prints)। এগুলো FINRA-এর মাধ্যমে রিপোর্ট করা হয় এবং এগুলোর কন্ডিশন updates_volume = true হিসেবে থাকে। SIP এবং আমাদের মেলানো হিসাব উভয়ই এগুলোকে প্রকৃত লেনদেন হিসেবে গণ্য করে।

অন্যান্য ক্ষেত্রে, কোড ৯ দিয়ে Nasdaq ক্লোজিং ক্রস নির্দেশ করা হয় — NVDA এর 3389.5 মিলিয়ন ডলারের ক্রস হলো ডলারের হিসেবে এই তালিকার সবচেয়ে বড় লেনদেন — এবং SNAP প্রিন্টের (53, 41) কোডগুলোর মধ্যে একটি হলো ৫৩, যা একটি Qualified Contingent Trade।

সময়: দশ মিনিটই সারাদিনের মূল অংশ

মিনিট ভিত্তিক বিশ্লেষণে দেখা যায়, লেনদেনের সিংহভাগই সেশনের শুরুর এবং শেষের সময়ে ঘটে:

কুয়েরিট্রেড টেপের দশটি ব্যস্ততম মিনিট (মিলিয়ন প্রিন্ট)
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    formatDateTime(toTimeZone(toStartOfMinute(sip_timestamp), 'America/New_York'), '%H:%i') AS et_minute,
    round(count() / 1e6, 2) AS trades_m
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY et_minute
ORDER BY trades_m DESC
LIMIT 10

15:59 ET সময়ে প্রতি মিনিটে 3.98 million trades সম্পন্ন হয়েছে — যা প্রতি সেকেন্ডে ষাট হাজারেরও বেশি। বাকি দশটির মধ্যে কতগুলো ওপেন এবং ক্লোজ সময়ের কাছাকাছি থাকে, তা নিচের তালিকায় দেখা যাচ্ছে:

কুয়েরিদশটি ব্যস্ততম মিনিটের মধ্যে কতটি ওপেন এবং ক্লোজ সময়ের বাইরে
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    countIf(NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS entries_outside_open_close,
    countIf(et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00') AS entries_in_open_close,
    maxIf(et_minute, NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS outside_entry_minute,
    maxIf(trades_m, NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS outside_entry_trades_m
FROM (
    SELECT
        formatDateTime(toTimeZone(toStartOfMinute(sip_timestamp), 'America/New_York'), '%H:%i') AS et_minute,
        round(count() / 1e6, 2) AS trades_m
    FROM global_markets.stocks_trades
    WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
    GROUP BY et_minute
    ORDER BY trades_m DESC
    LIMIT 10
)

দশটির মধ্যে 9টি ওপেনিংয়ের প্রথম দশ মিনিট অথবা ক্লোজিংয়ের আগের শেষ দশ মিনিটের মধ্যে ঘটে। একমাত্র ব্যতিক্রম হলো 10:15 ET, যেখানে 0.88 million ট্রেড সম্পন্ন হয়েছে — এটি একটি ব্যতিক্রমী ঘটনা; এই ডেটা থেকে এর কারণ জানা সম্ভব নয় এবং আমরা কোনো ধারণা তৈরি করব না। একই সময় নিচে পুনরায় উল্লেখ করা হলো।

কোট স্ট্রিম: অর্ধেক বিলিয়ন আপডেট

National Best Bid and Offer — যা প্রতিটি এক্সচেঞ্জে সেরা ক্রয় ও বিক্রয় মূল্য নির্দেশ করে এবং যেকোনো পরিবর্তনের সাথে সাথে পুনরায় প্রকাশিত হয় — ২৯ জুন 505.38 মিলিয়ন বার আপডেট হয়েছে, যেখানে 156.1 মিলিয়ন ট্রেড সম্পন্ন হয়েছে।

কুয়েরিসম্পূর্ণ NBBO স্ট্রিম এক সারিতে — QQQ এবং NVDA নির্দিষ্ট করা হয়েছে
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH
    (
        SELECT (round(countIf(ticker = 'QQQ') / 1e6, 2), round(countIf(ticker = 'NVDA') / 1e6, 2),
                round(countIf(ticker = 'AAPL') / 1e6, 2), round(countIf(ticker = 'TSLA') / 1e6, 2))
        FROM global_markets.cache_stocks_quotes
        WHERE ticker IN ('QQQ', 'NVDA', 'AAPL', 'TSLA')
          AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
    ) AS pinned
SELECT
    round(count() / 1e6, 2) AS updates_m,
    pinned.1 AS qqq_updates_m,
    pinned.2 AS nvda_updates_m,
    round(pinned.1 - pinned.2, 2) AS qqq_minus_nvda_updates_m,
    round(pinned.2 - greatest(pinned.3, pinned.4), 2) AS nvda_minus_next_single_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

কোটিংয়ের ক্ষেত্রে ইনডেক্স প্রোডাক্টের আধিপত্য বেশি: শুধুমাত্র QQQ 5.23 মিলিয়ন আপডেট রেকর্ড করেছে, যেখানে আমাদের পরীক্ষা করা সবচেয়ে বেশি কোটেড একক স্টক NVDA-এর জন্য ছিল 1.8 মিলিয়ন — অর্থাৎ পরবর্তী একক স্টকের তুলনায় 0.67 মিলিয়ন আপডেট বেশি। প্রতিটি লিস্টিংয়ের জন্য সম্পূর্ণ পার-টিক্কার সেন্সাস ৩০ সেকেন্ডের সময়সীমার মধ্যে সম্ভব নয়, তাই নিচের লিডারবোর্ডটি একটি যাচাইকৃত সেট মাত্র, কোনো পূর্ণাঙ্গ র‍্যাঙ্কিং নয়:

কুয়েরিআটটি হাইলি-কোটেড টিকারের NBBO কোট আপডেট (মিলিয়ন)
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT ticker, round(count() / 1e6, 2) AS updates_m
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('QQQ', 'SPY', 'TQQQ', 'IWM', 'SQQQ', 'NVDA', 'AAPL', 'TSLA')
  AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY ticker
ORDER BY updates_m DESC

যাচাইকৃত সেটে 5.23 মিলিয়ন আপডেট নিয়ে QQQ শীর্ষে ছিল; তালিকার শীর্ষে রয়েছে ইনডেক্স ফান্ড এবং তাদের লিভারেজড সংস্করণসমূহ, সাধারণ পরিচিত স্টক নয়।

SPY-এর বিশ্লেষণ: ন্যানোসেকেন্ডের হিসাব এবং স্প্রেডের দ্বিমুখী চিত্র

কুয়েরিSPY মাইক্রোস্কোপে: ন্যানোসেকেন্ড গ্যাপ, দুই ধরণের স্প্রেড, কোট কোয়ালিটি
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH
    (
        SELECT (formatDateTime(toTimeZone(toStartOfSecond(sip_timestamp), 'America/New_York'), '%H:%i:%S'), count())
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
        GROUP BY toStartOfSecond(sip_timestamp)
        ORDER BY count() DESC, toStartOfSecond(sip_timestamp) ASC
        LIMIT 1
    ) AS busiest_sec,
    ordered AS (
        SELECT
            toFloat64(ask_price - bid_price) AS spread,
            bid_price,
            ask_price,
            toFloat64(sip_timestamp - lagInFrame(sip_timestamp) OVER (ORDER BY sip_timestamp, sequence_number)) AS gap_s,
            greatest(toFloat64(least(leadInFrame(sip_timestamp, 1, toDateTime64('2026-06-29 20:00:00', 9)) OVER (ORDER BY sip_timestamp, sequence_number ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING), toDateTime64('2026-06-29 20:00:00', 9)) - sip_timestamp), 0) AS dwell_s,
            rowNumberInAllBlocks() AS rn
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
    )
SELECT
    round(count() / 1e6, 2) AS spy_updates_m,
    busiest_sec.1 AS busiest_second_et,
    toUInt8(startsWith(busiest_sec.1, '10:15')) AS busiest_second_in_1015,
    busiest_sec.2 AS busiest_second_updates,
    round(minIf(gap_s, rn > 0 AND gap_s > 0) * 1e9) AS min_gap_between_updates_ns,
    round(quantileExactIf(0.5)(gap_s, rn > 0) * 1e6, 1) AS median_gap_us,
    countIf(rn > 0 AND gap_s = 0) AS identical_timestamp_pairs,
    round(sumIf(spread * dwell_s, bid_price > 0 AND ask_price >= bid_price) / sumIf(dwell_s, bid_price > 0 AND ask_price >= bid_price) * 100, 2) AS time_weighted_avg_spread_cents,
    round(avgIf(spread, bid_price > 0 AND ask_price >= bid_price) * 100, 2) AS per_update_avg_spread_cents,
    round((avgIf(spread, bid_price > 0 AND ask_price >= bid_price) - sumIf(spread * dwell_s, bid_price > 0 AND ask_price >= bid_price) / sumIf(dwell_s, bid_price > 0 AND ask_price >= bid_price)) * 100, 2) AS per_update_premium_cents,
    countIf(bid_price > 0 AND ask_price > 0 AND ask_price < bid_price) AS crossed_updates,
    countIf(bid_price <= 0 OR ask_price <= 0) AS zero_bid_or_ask_updates
FROM ordered

শুধুমাত্র নিয়মিত লেনদেনের সময়ের মধ্যেই SPY-এর কোটেশন 3.98 মিলিয়ন বার পরিবর্তিত হয়েছে। এর সবচেয়ে ব্যস্ত সেকেন্ডটি ছিল 10:15:43 ET, যা উপরে চিহ্নিত 10:15 মিনিটের মধ্যে ছিল — সেখানে 1461টি আপডেট ছিল। পরপর দুটি আপডেটের মধ্যে সর্বনিম্ন ব্যবধান ছিল 1375 ন্যানোসেকেন্ড, মধ্যম মান ছিল 245.6 মাইক্রোসেকেন্ড, এবং 75138টি পরপর জোড়া একই ন্যানোসেকেন্ড টাইমস্ট্যাম্প বহন করেছিল — এমনকি ন্যানোসেকেন্ড রেজোলিউশনও আধুনিক টেপকে পুরোপুরি সাজাতে পারে না।

এই ন্যানোসেকেন্ডগুলো bid-ask spread পরিমাপ করতে ব্যবহৃত হয়। প্রতিটি আপডেটকে সমানভাবে গণনা করলে, SPY-এর গড় স্প্রেড ছিল 2.72 সেন্ট; প্রতিটি কোটেশন কতক্ষণ স্থায়ী ছিল তার ভিত্তিতে ওজন দিলে তা হয় 2.34 সেন্ট। যান্ত্রিকভাবে প্রতি আপডেটের হিসেবে এই সংখ্যাটি 0.38 সেন্ট বেশি দেখায়: স্প্রেড যখন বেশি এবং পরিবর্তনশীল থাকে তখনই আপডেটগুলো ঘন হয়ে আসে, যেখানে একটি স্থির অর্ডার ঘড়ির সময়ের হিসেবে থাকে। যখনই আপনি স্প্রেড পরিসংখ্যান দেখবেন, তখন জিজ্ঞাসা করুন কোন ঘড়িটি এটি পরিমাপ করেছে। এই পরিসংখ্যানটি প্রকাশ করা হয়েছে, গোপন করা হয়নি: 1544টি নিয়মিত সময়ের আপডেট সাময়িকভাবে ক্রসড ছিল (bid-এর নিচে ask, যা বিভিন্ন ভেন্যু থেকে আসা কোটেশনের মিশ্রণ) এবং 0টিতে শূন্য bid বা ask ছিল; স্প্রেড পরিসংখ্যান এই উভয়টিকেই বাদ দেয় এবং যা বাদ দেওয়া হয়েছে তা গণনা করে।

স্প্রেড বা ব্যবধানের একটি নির্দিষ্ট সময় আছে

SPY-এর উদ্ধৃত স্প্রেডকে আধা ঘণ্টার ভিত্তিতে ভাগ করলে এর মাইক্রোস্ট্রাকচার বা ক্ষুদ্রতর গঠন একটি কার্ভ বা রেখাচিত্রের মতো দেখায়, যা যেকোনো ট্রেডার ব্যবহার করতে পারেন:

কুয়েরিSPY-এর মিডিয়ান কোটেড স্প্রেড আধা ঘণ্টা অন্তর, 4:00 am থেকে 8:00 pm ET
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    formatDateTime(toTimeZone(toStartOfInterval(sip_timestamp, INTERVAL 30 MINUTE), 'America/New_York'), '%H:%i') AS et_time,
    round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100, 1) AS median_spread_cents,
    count() AS quote_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 08:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY et_time
ORDER BY et_time

04:00 ET প্রিমার্কেট বা প্রাক-বাজারের বাকেটে এর মিডিয়ান বা মধ্যমা হলো 8 সেন্ট, 09:30 ওপেনিং বা বাজার খোলার বাকেটে হলো 3 সেন্ট, এবং 14:00 নাগাদ এটি হয় 2 সেন্ট — প্রিমার্কেট ওপেনের সময় একই শেয়ার কেনা-বেচা করতে দুপুর শুরুর দিকের অর্ডারের তুলনায় প্রায় চারগুণ বেশি স্প্রেড বা ব্যবধান খরচ হয়। স্প্রেড কোনো স্থির বিষয় নয়; এটি একটি নির্দিষ্ট সময়সূচী।

ফরেনসিক প্রমাণ: S অক্ষরে আটকে যাওয়া ফাইলটি

আমরা কোনো ভেন্ডর ফাইল থেকে সংখ্যা প্রকাশ করার আগে তার পূর্ণাঙ্গতা যাচাই করি: টিককার সংখ্যা গণনা করা, বর্ণানুক্রমিক ব্যাপ্তি পরীক্ষা করা এবং পার্শ্ববর্তী দিনগুলোর ফাইলের সাথে তুলনা করা। ২৯ জুন তারিখের FINRA off-exchange short-volume ফাইলটি এই যাচাইয়ের প্রয়োজনীয়তা প্রমাণ করে:

কুয়েরিকমপ্লিটনেস প্রোব: FINRA শর্ট-ভলিউম ফাইল কভারেজ, জুন 26-30
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT
    date,
    uniqExact(ticker) AS tickers,
    min(ticker) AS first_ticker,
    max(ticker) AS last_ticker,
    countIf(ticker = 'TSLA') AS tsla_rows,
    round(100 * sum(short_volume) / sum(total_volume), 2) AS short_pct_of_reported
FROM global_markets.stocks_short_volume
WHERE date BETWEEN '2026-06-26' AND '2026-06-30'
GROUP BY date
ORDER BY date

২৬ জুনের ফাইলে 15052 টি টিককার ছিল, যা ছিল A থেকে ZYME পর্যন্ত। ২৯ জুনের ফাইলে 5489 টি ছিল, যা ছিল A থেকে SSUS পর্যন্ত — এটি কেবল S অক্ষর দিয়ে শুরু হওয়া নামগুলোর মাঝপথে থেমে গেছে। সেই পয়েন্টের পরে বর্ণানুক্রমিকভাবে থাকা প্রতিটি টিককার অনুপস্থিত; এর মধ্যে TSLA অন্তর্ভুক্ত, যা ২৯ জুনের জন্য 0 সারি এবং ২৬ জুনের জন্য 1 সারি ছিল। ৩০ জুনের ফাইলটি আবার 15362 টি টিককারে ফিরে আসে। একটি পূর্ণাঙ্গতা যাচাই প্রক্রিয়া এই ধরণের দৈনিক রসিদ বা ডেটা যাচাইয়ের চেয়ে বেশি কিছু নয় — এটি একটি সঠিক পরিসংখ্যান এবং একটি ত্রুটিপূর্ণ তথ্যের মধ্যে পার্থক্য গড়ে দেয়।

এই তথ্যটি সামনে রেখে — এবং শুধুমাত্র এই তথ্যের ভিত্তিতেই — অনুপাতটি হলো: ২৯ জুন তারিখে reported off-exchange volume-এর 45.85% হলো marked-short volume, যেখানে ২৬ জুনে ছিল 46.89% এবং ৩০ জুন ছিল 48.82%। ২৯ জুনের এই সংখ্যাটি কেবল A থেকে S পর্যন্ত অংশটি কভার করে, তাই এটিকে একটি আংশিক পাঠ হিসেবে বিবেচনা করুন। পার্শ্ববর্তী প্রতিটি সেশনে শর্ট শেয়ারের পরিমাণ প্রায় অর্ধেক থাকে — এবং দৈনিক short volume কোনো short interest নয়।

ডেটা নোটস

সম্পূর্ণ ডেটা নোটস
  • ৫-থেকে-৬-টা বাজারquoted lull বা স্থবিরতা। SPY-এর কোট স্ট্রিম 17:00 ET অর্ধঘণ্টায় (233 আপডেট) প্রায় বন্ধ হয়ে যায় এবং 18:00 (40608)-এর মধ্যে পুনরায় শুরু হয় — এটি একটি ক্রস-টিক্কার ফিড/সেশন প্যাটার্ন, কোনো ডেটা মিসিং নয়।
  • ভগ্নাংশ শেয়ার বা Fractional shares সর্বত্র বিদ্যমান। 4.73% প্রিন্ট নন-ইন্টিজার সাইজ বহন করে; ভলিউম অবশ্যই দশমিক হিসেবে যোগ করতে হবে।
  • কোড ডিকশনারি বিভিন্ন টাইপের জন্য একই আইডি পুনরায় ব্যবহার করে। আইডি ১৫ হলো একটি সেল কন্ডিশন (Market Center Official Close) এবং একটি কোট কন্ডিশন (Closed); এখানে প্রতিটি ডিকশনারি কুয়েরি asset_class = 'stocks' AND type = 'sale_condition' ফিল্টার করে। শুধুমাত্র আইডি দিয়ে সার্চ করলে কোড ভুলভাবে চিহ্নিত হতে পারে।
  • কোয়ালিটি এক্সক্লুশনগুলো ইন-লাইন গণনা করা হয়। ক্রসড এবং জিরো-বিড-অর-Ask গণনাগুলো উপরের SPY মাইক্রোস্কোপ প্যানেলে থাকে; কোনো স্প্রেড স্ট্যাটিস্টিকস এর ড্রপগুলোকে লুকিয়ে রাখে না।
  • Whole-tape স্ক্যানগুলো শুধুমাত্র ব্যাচ-ভিত্তিক প্যানেল। এখানে মার্কেট-ওয়াইড ব্লকগুলো একটি কোল্ড ক্যাশে প্রায় ৩০ সেকেন্ড পর্যন্ত পরিমাপ করা হয় (একটি টাইম-আউট হওয়া ব্লককে একবার পুনরায় চেষ্টা করা হয়; একটি ওয়ার্মড পাস ক্যাপ অতিক্রম করে); এগুলো লেখক তৈরির সময় গেটেড রিড-অনলি পাথ দিয়ে একবার চলে, পাঠকদের জন্য লাইভ থাকে না এবং সংরক্ষিত ফলাফলই হলো রেকর্ড।

পদ্ধতি

  • টাইমস্ট্যাম্পগুলো UTC-এ সংরক্ষিত থাকে এবং র ডেটা UTC সীমার ভিত্তিতে ফিল্টার করা হয় (জুন ২৯ তারিখের নিয়মিত সময় হলো ১৩:৩০ থেকে ২০:০০ UTC); toTimeZone শুধুমাত্র SELECT লিস্টে ব্যবহৃত হয়।
  • সেশন টাইপটি হলিডে ক্যালেন্ডার এবং পর্যবেক্ষিত ৩৯০-বার নিয়মিত উইন্ডোর মাধ্যমে যাচাই করা হয় — এটি কখনোই অনুমান করা হয় না।
  • "SIP-counted (matched) volume" হলো সেই ভলিউম যা SIP-এর নিজস্ব কন্ডিশন রুলস কনসোলিডেটেড টোটালের জন্য গণনা করে; এক্সক্লুশন সেটটি ডিকশনারি থেকে নেওয়া হয় এবং চেকসাম দ্বারা সীমাবদ্ধ করা হয়, এটি কখনোই হার্ডকোড করা হয় না।
  • প্রতি-আপডেট স্প্রেড স্ট্যাটিস্টিকস প্রতিটি NBBO আপডেটকে সমান গুরুত্ব দেয়; টাইম-ওয়েটেড স্ট্যাটিস্টিকস প্রতিটি কোটকে তার স্থায়িত্ব অনুযায়ী গুরুত্ব দেয়। উভয় ক্ষেত্রেই তাদের এক্সক্লুশনগুলো প্রকাশ করা হয়।
  • ডেসিমাল প্রাইস/সাইজ কলামগুলো নেটিভলি যোগ করা হয় এবং যেকোনো রেশিও বা প্রাইস-টাইমস-সাইজ গাণিতিক হিসাবের আগে ৬৪-বিট ফ্লোটে রূপান্তরিত করা হয়।
  • টিক টেবিলগুলো কোনো রোলিং এক্সপায়ারি ছাড়াই সম্পূর্ণ ইতিহাস সংরক্ষণ করে; এই সংরক্ষিত এবং ভার্সন করা ফলাফলগুলোই স্থায়ী রেকর্ড হিসেবে কাজ করে। ৩ জুলাই, ২০২৬ তারিখ পর্যন্ত ওয়্যারহাউস স্টেট।

উপরের প্রতিটি প্যানেল একটি সংরক্ষিত অবজেক্ট — চার্ট, টেবিল এবং SQL একত্রে। যেকোনোটি ওপেন করুন, কুয়েরিটি কপি করুন এবং Strasmore টার্মিনালে এটি আরও বিস্তারিতভাবে দেখুন।