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

تحلیل ریزساختار بازار در 29 ژوئن 2026

بررسی دقیق نوار معاملات، اصلاح حجم بر اساس دیکشنری کدهای ثبت و تحلیل داده‌های نانوثانیه برای درک عمیق‌تر نوسانات بازار در این جلسه معاملاتی.

این گزارش مکمل و تحلیلی برای مرور بازار در 29 ژوئن 2026 است: داده‌های خام زیربنایی فراتر از نمودارهای دقیقه‌ای — شامل 156.1 میلیون معامله انفرادی و 505.38 میلیون به‌روزرسانی قیمت NBBO در یک جلسه عادی روز دوشنبه. تمامی اعداد حاصل از پرس‌وجوهای ذخیره‌شده هستند (برای مشاهده کد دقیق SQL، هر پنل را باز کنید). همچنین دو یافته دقیق از داده‌های امروز به طور کامل بررسی شده‌اند: یک اصلاح حجم که طبق دیکشنری کدهای ثبت معاملات الزامی است، و یک فایل تامین‌کننده که بی‌سر و صدا در حرف S متوقف می‌شود.

نوار معاملات، ثبت به ثبت

ابتدا وضعیت جلسه بررسی می‌شود و هرگز نباید از آن صرف‌نظر کرد: تقویم تعطیلات بورس شامل 0 سطر برای 29 ژوئن 2026 است و SPY دقیقاً 390 کندل یک دقیقه‌ای را در بازه زمانی عادی ثبت کرد — یک جلسه کامل، از ساعت 9:30 صبح تا 4:00 بعد از ظهر به وقت نیویورک. در طول زمان معاملات فراتر از ساعت رسمی، نوار تجمیعی 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% از تمام ثبت‌ها مربوط به حجم‌های غیرمعمول (odd lots) بود — معاملات با تعداد کمتر از 100 سهم — اما این معاملات تنها 8.79% از سهام خام را جابه‌جا کردند — مجموع اصلاح‌نشده‌ای که در بخش جرم‌شناسی حجم در ادامه کاهش می‌یابد. میانه ثبت‌ها 21 سهم بود که با یک پروب براکت خود-تأییدکننده اندازه‌گیری شد — شمارش‌های تجمعی در بازه 19 تا 23 سهم — که اگر براکت خطا داشته باشد، مقدار 0 را برمی‌گرداند و به گونه‌ای محدود شده است که خطا، مقدار قبلی را حفظ کند. 17.9 میلیون ثبت دقیقاً برای یک سهم بود و 4.73% حجم‌های کسری داشتند — الگویی که با اپلیکیشن‌های خرده‌فروشی که تکه‌تکه به بازار وارد می‌شوند، در کنار بازارگردان‌ها که سمت مقابل را می‌پذیرند، همخوانی دارد.

تحلیل حجم معاملات: استخراج «حجم تطبیق‌شده» از دیکشنری

مجموع فیلد اندازه (size) در تمامی معاملات نشان می‌دهد که در 29 ژوئن، مجموعاً 24.79 میلیارد سهم معامله شده است. این رقم نادرست است و خودِ نوار معاملات (tape) نیز بر این موضوع صحه می‌گذارد. هر معامله شامل کدهای وضعیت (condition codes) است و SIP — یعنی پردازشگر اطلاعات اوراق بهادار که تمامی بازارها را در یک جریان واحد تجمیع می‌کند — دیکشنری‌ای را منتشر می‌کند که در آن، کد به کد، مشخص شده است که آیا یک معامله حجم تجمیعی را به‌روزرسانی می‌کند یا خیر. برخی پیام‌ها، بازنشر اداریِ همان حجم‌هایی هستند که قبلاً یک بار شمارش شده‌اند. این نوشتار به جای استفاده از لیست ثابت از کدهای «شناخته‌شده»، مجموعه موارد استثنا را مستقیماً از خودِ دیکشنری استخراج می‌کند:

پرس‌وجومجموعه موارد استثنا، استخراج‌شده از دیکشنری کد Tape (در یک ردیف)
کد دقیق 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). درس آموخته‌شده از این فرآیند چنین است: در نسخه اولیه گزارش روزانه، کدهای 15 و 16 — که دو پیام رسمی بازگشایی و بسته‌شدن بازار هستند و در تمامی راهنماهای داده ذکر شده‌اند — به صورت دستی وارد شده بودند، اما کد 38 کاملاً نادیده گرفته شده بود. منبع حقیقت، دیکشنری است، نه لیست کدهای به‌خاطر سپرده‌شده.

استفاده از دو بلوک کد عمدی است: اجرای یک زیرپرس‌وجو (subquery) اسکالر روی دیکشنری در حین اسکن 156.1 میلیون ردیف، از محدودیت 30 ثانیه‌ای ما فراتر می‌رود. بنابراین، بلوک بالا مجموعه را در قالب یک ردیف استخراج می‌کند — که با محدودیت تعداد کدها و یک چک‌سام (checksum) شناسه (69) کنترل می‌شود — و بلوک پایین، مقادیر استخراج‌شده را اعمال می‌کند. اگر دیکشنری دچار تغییر شود، محدودیت چک‌سام باعث می‌شود این نوشتار نیاز به بازبینی پیدا کند؛ بدین ترتیب مقادیر استخراج‌شده هرگز بدون اطلاع از تاریخ مصرف گذشته نمی‌مانند.

پرس‌وجوحجم خام در مقابل حجم محاسبه‌شده توسط 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 میلیارد سهم خام، 20.66 میلیارد سهم شمارش‌شده توسط SIP، و 4.13 میلیارد سهم حذف‌شده در قالب 91175 معامله اداری. یک تعریف دقیق: «حجم تطبیق‌شده» به معنای حجمی است که قوانین وضعیتِ خودِ SIP برای مجموع تجمیعی محاسبه می‌کنند — و نه هیچ چیز دیگر. ما در حال قضاوت درباره اهمیت اقتصادی معاملات نیستیم؛ ما صرفاً قوانین حسابداری خودِ نوار معاملات را اعمال می‌کنیم.

The largest prints, decoded

The day's biggest prints are where condition codes stop being trivia:

پرس‌وجوبزرگ‌ترین معاملات تک‌مرحله‌ای در ۲۹ ژوئن (بدون کدهای استثنا در دیکشنری)
کد دقیق 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

Read the top rows as a worked example. The day's largest print — 61.69 million CAG (Conagra) shares at $13.98, roughly $862.5 million, stamped 16:04:53 ET under codes 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — is the NYSE closing auction result published after 4:00 pm. It counts toward volume exactly once. The same 61.69 million shares then re-appear under code 15, Market Center Official Close: a re-report the dictionary excludes, part of the 4.13 billion stripped above. That code-15 row is stripped from the table above by design, so its receipt gets its own cheap one-row panel:

پرس‌وجوگزارش تطبیقی: حراج پایانی CAG و گزارش مجدد با کد-۱۵
کد دقیق 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'

The largest of the 6 official-close messages on CAG carries 61.69 million shares — the auction's 61.69 million exactly (difference: 0) — stamped 16:04:53 ET from exchange id 10, NYSE in the stocks directory: the listing market re-stating its own auction.

The other CAG rows are a different animal — the 15.17 million-share print under codes 12, 2 (12 Form T / extended hours, 2 Average Price Trade) and two more under code 12 are post-auction prints reported through FINRA whose conditions carry updates_volume = true. The SIP counts them as real prints, and so does our matched figure.

Elsewhere, code 9 marks the Nasdaq closing crosses — NVDA's $3389.5 million cross is the table's biggest print in dollars — and the codes on the SNAP print (53, 41) include 53, a Qualified Contingent Trade.

زمان‌سنج: ده دقیقه مالک روز است

در مقیاس دقیقه‌ای، حجم معاملات تقریباً به‌طور کامل در لبه‌های جلسات معاملاتی متمرکز شده است:

پرس‌وجوده دقیقه پرکاربرد در Tape معاملات (میلیون‌ها تراکنش)
کد دقیق 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 میلیون معامله رسید — یعنی بیش از شصت هزار معامله در هر ثانیه. اینکه آیا سایر موارد در لیست ده تایی بر اساس بازگشایی و بسته‌شدن بازار متمرکز هستند یا خیر، خود یک معیار تک‌سطری است:

پرس‌وجوتعداد دقایق پرکاربرد خارج از باز و بسته شدن بازار
کد دقیق 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 میلیون معامله — یک ناهنجاری واقعی در اواسط صبح است؛ علت آن از این داده‌ها مشخص نیست و ما فرضیه‌ای برای آن نمی‌سازیم. همین زمان‌سنج در ادامه بازگشت می‌کند.

جریان قیمت‌ها: نیم میلیارد به‌روزرسانی

شاخص National Best Bid and Offer — که بهترین قیمت خرید و فروش در تمامی بورس‌ها است و با هر تغییر مجدداً منتشر می‌شود — در تاریخ 29 ژوئن، در برابر 156.1 میلیون معامله، 505.38 میلیون بار به‌روزرسانی شد.

پرس‌وجوکل جریان 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 میلیون به‌روزرسانی بیشتر از رتبه دوم را ثبت کرد. آمار کامل تمامی نمادها در محدودیت زمانی 30 ثانیه‌ای نمی‌گنجد، بنابراین جدول زیر یک مجموعه بررسی‌شده است و نه یک رتبه‌بندی جامع:

پرس‌وجوبه‌روزرسانی‌های قیمت 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

QQQ با 5.23 میلیون به‌روزرسانی، صدر لیست بررسی‌شده را به خود اختصاص داد؛ بخش اصلی این لیست متعلق به صندوق‌های شاخصی و نسخه‌های اهرمی آن‌ها است، نه سهام شناخته‌شده عمومی.

بررسی دقیق SPY: ثبت نانوثانیه‌ها و دو جنبه‌ی spread

پرس‌وجوبررسی دقیق 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 نقش اساسی دارند. با شمارش برابر تمام به‌روزرسانی‌ها، میانگین spread برای SPY برابر با 2.72 سنت بود؛ اما با وزن‌دهی به هر قیمت بر اساس مدت زمان پایداری آن، این رقم به 2.34 سنت رسید. رقم به‌ازای هر به‌روزرسانی، از نظر مکانیکی 0.38 سنت عریض‌تر است: به‌روزرسانی‌ها دقیقاً در لحظاتی تجمع می‌یابند که spread عریض و در حال تغییر است، در حالی که یک سفارش استاتیک بر اساس زمان واقعی محاسبه می‌شود. هرگاه آماری از spread مشاهده کردید، بررسی کنید که کدام ساعت آن را اندازه‌گیری کرده است. این آمار شفاف است و پنهان نیست: 1544 به‌روزرسانی در ساعات عادی دچار تقاطع لحظه‌ای شدند (زمانی که قیمت ask پایین‌تر از bid قرار گرفت، که ناشی از درهم‌تنیدگی قیمت‌ها از مراکز مختلف است) و 0 دارای bid یا ask صفر بودند؛ آمارهای spread هر دو حالت را مستثنی کرده و آنچه را که مستثنی شده‌اند، محاسبه می‌کنند.

شکاف قیمتی زمان‌بندی شده است

دسته‌بندی شکاف قیمتی (spread) نقل‌شده برای SPY در بازه‌های نیم‌ساعته، ریزساختار بازار را به منحنی‌ای تبدیل می‌کند که هر معامله‌گری می‌تواند از آن استفاده کند:

پرس‌وجومیانه اسپرد قیمت‌گذاری SPY به تفکیک نیم‌ساعت، از ۴:۰۰ am تا ۸:۰۰ 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

میانه شکاف قیمتی در بازه پیش‌بازار (premarket) ساعت 04:00، معادل 8 سنت، در بازه بازگشایی ساعت 09:30، معادل 3 سنت، و تا ساعت 14:00، معادل 2 سنت است؛ یعنی معامله یک سهم واحد در زمان بازگشایی پیش‌بازار، تقریباً چهار برابر بیشتر از هزینه سفارش در اوایل بعدازظهر است. شکاف قیمتی یک مقدار ثابت نیست، بلکه یک برنامه زمانی است.

نمونه جرم‌شناسی: فایلی که در حرف S متوقف شد

هر فایل روزانه از سوی فروشندگان، پیش از انتشار هر عدد، تحت بررسی کامل بودن قرار می‌گیرد: شمارش نمادها، بررسی محدوده الفبایی و مقایسه با داده‌های روزهای قبل. فایل حجم معاملات Short خارج از بورس (off-exchange) مربوط به 29 ژوئن از FINRA، نمونه‌ای برای درک این موضوع است:

پرس‌وجوبررسی کامل بودن: پوشش فایل short-volume در FINRA، ۲۶ تا ۳۰ ژوئن
کد دقیق 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

فایل 26 ژوئن شامل 15052 نماد، از A تا ZYME است. فایل 29 ژوئن شامل 5489 نماد، از A تا SSUS است؛ این فایل صرفاً در میانه نام‌های شروع شده با حرف S متوقف شده است. تمام نمادهایی که از نظر الفبایی بعد از آن نقطه قرار دارند — از جمله TSLA، با 0 سطر برای 29 ژوئن در مقابل 1 در 26 ژوئن — مفقود هستند؛ تا 30 ژوئن، تعداد نمادها به 15362 بازمی‌گردد. بررسی کامل بودن، چیزی فراتر از این رسیدِ یک‌سطری برای هر روز نیست؛ تفاوت بین انتشار یک آمار و انتشار یک اثر باقیمانده (artifact) همین است.

با در نظر گرفتن این توضیح — و تنها با آن — نسبت به این صورت است: حجم Marked-short برابر با 45.85% از حجم گزارش‌شده خارج از بورس در 29 ژوئن است، در حالی که این رقم در 26 ژوئن 46.89% و در 30 ژوئن 48.82% بود. رقم 29 ژوئن تنها بخش A تا S را پوشش می‌دهد، بنابراین آن را به عنوان یک داده ناقص در نظر بگیرید. سهم Short نزدیک به نیم، سطح معمولی است که در تمامی جلسات مجاور مشاهده می‌شود — و حجم Short روزانه با Short interest متفاوت است.

یادداشت‌های داده‌ها

یادداشت‌های کامل داده‌ها
  • کندی نرخ نقل‌قول در ساعت 5 تا 6 عصر. جریان نقل‌قول SPY در نیم‌ساعت 17:00 ET (به‌روزرسانی‌های 233) تقریباً متوقف می‌شود و تا ساعت 18:00 (40608) دوباره فعال می‌شود؛ این یک الگوی نشست/فید در تمامی نمادها است و به معنای از دست رفتن داده نیست.
  • سهام کسری در همه جا وجود دارد. 4.73% از معاملات دارای حجم‌های غیرصحیح هستند؛ حجم باید به صورت اعشاری جمع‌آوری شود.
  • دیکشنری کدها از شناسه‌ها برای انواع مختلف استفاده مجدد می‌کند. شناسه 15 هم یک وضعیت فروش (Market Center Official Close) است و هم یک وضعیت نقل‌قول (Closed)؛ هر پرس‌وجوی دیکشنری در اینجا فیلتر می‌کند: asset_class = 'stocks' و type = 'sale_condition'. جستجوی ساده بر اساس شناسه باعث برچسب‌گذاری اشتباه کدها می‌شود.
  • استثنائات کیفیت نقل‌قول در متن شمارش می‌شوند. تعداد معاملات متقاطع (crossed) و قیمت‌های خرید یا فروش صفر در پنل SPY microscope در بالا قرار دارند؛ هیچ آمار spread کاهش‌های آن را پنهان نمی‌کند.
  • اسکن‌های کل نوار معاملات (Whole-tape) فقط پنل‌های دسته‌ای هستند. بلوک‌های سراسری بازار در اینجا، در یک حافظه موقت سرد، هر کدام را تا حدود 30 ثانیه اندازه‌گیری کردند (یک بلوک منقضی‌شده یک بار مجدداً تلاش می‌شود؛ مرحله گرم‌شده از سقف عبور می‌کند)؛ این اسکن‌ها یک بار در زمان نگارش از طریق مسیر محدود و فقط خواندنی اجرا می‌شوند و برای خوانندگان زنده نیستند؛ نتایج ذخیره‌شده، رکورد نهایی هستند.

روش‌شناسی

  • زمان‌بندی‌ها در قالب UTC ذخیره و با محدوده‌های خام UTC فیلتر می‌شوند (ساعات معاملاتی عادی در 29 ژوئن از 13:30 تا 20:00 UTC است)؛ تابع toTimeZone فقط در لیست‌های SELECT ظاهر می‌شود.
  • نوع جلسه معاملاتی بر اساس تقویم تعطیلات و بازه 390 کندلیِ مشاهده‌شده تایید می‌شود و هرگز بر اساس فرض تعیین نمی‌شود.
  • «حجم محاسبه‌شده توسط SIP (تطبیق‌یافته)» حجمی است که قوانین شرطی خودِ SIP در مجموع کل لحاظ می‌کنند؛ مجموعه موارد استثنا از طریق دیکشنری استخراج شده و با محدودیت checksum تعیین می‌شود و هرگز به صورت ثابت (hardcoded) تعریف نمی‌شود.
  • آمار spread در هر به‌روزرسانی، به هر به‌روزرسانی NBBO وزن یکسان می‌دهد؛ آمار وزن‌دهی‌شده بر اساس زمان، به هر قیمت (quote) بر اساس مدت زمان پایداری آن وزن می‌دهد. هر دو روش، موارد استثنای خود را اعلام می‌کنند.
  • ستون‌های اعشاری قیمت/حجم به صورت بومی جمع شده و پیش از هرگونه محاسبات نسبت یا قیمت در حجم، به float با دقت 64 بیت تبدیل می‌شوند.
  • جداول Tick تاریخچه کامل را بدون انقضای متحرک حفظ می‌کنند؛ این نتایج ذخیره‌شده و نسخه‌بندی‌شده، سوابق دائمی هستند. وضعیت انبار داده تا 3 جولای 2026.

هر پنل در بالا یک شیء ذخیره‌شده است که شامل نمودار، جدول و SQL است. هر کدام را باز کنید، کوئری را کپی کنید و آن را در ترمینال Strasmore ادامه دهید.