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

Phân tích vi cấu trúc ngày 29 tháng 6 năm 2026

Khám phá chi tiết dữ liệu tape, hiệu chỉnh volume theo từ điển và các tệp dữ liệu FINRA bị cắt ngắn trong phiên giao dịch ngày 29 tháng 6 năm 2026.

Đây là tài liệu bổ trợ chi tiết cho bản tóm tắt thị trường ngày 29 tháng 6 năm 2026: dữ liệu thô đằng sau các thanh nến một phút — 156.1 triệu giao dịch riêng lẻ505.38 triệu cập nhật báo giá NBBO chỉ trong một phiên thứ Hai bình thường. Mọi con số đều là kết quả truy vấn được lưu trữ (bạn có thể mở rộng bất kỳ bảng nào để xem mã SQL chính xác), và hai phát hiện phân tích trong ngày sẽ được trình bày đầy đủ: một lỗi hiệu chỉnh khối lượng theo quy tắc từ từ điển mã của tape, và một tệp dữ liệu từ nhà cung cấp kết thúc đột ngột tại chữ S.

Nhật ký giao dịch, chi tiết từng lệnh

Trước hết cần kiểm tra phiên giao dịch thay vì mặc định: lịch nghỉ lễ của sàn giao dịch có 0 dòng cho ngày 29 tháng 6 năm 2026, và SPY đã ghi nhận chính xác 390 nến phút trong khung giờ giao dịch chính thức — trọn vẹn một phiên, từ 9:30 sáng đến 4:00 chiều theo giờ New York. Trong suốt thời gian giao dịch kéo dài, băng điện tử hợp nhất đã ghi nhận 156.1 triệu lệnh giao dịch riêng lẻ.

Truy vấnGiao dịch trong ngày: phiên khớp lệnh và quy mô mỗi lệnh
Câu lệnh SQL chính xác đằng sau mỗi con số
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% tổng số lệnh là các lô lẻ (odd lots) — tức là các giao dịch dưới 100 cổ phiếu — nhưng chúng chỉ chiếm 8.79% tổng số cổ phiếu thô — con số chưa điều chỉnh mà phần phân tích khối lượng bên dưới sẽ lược bỏ. Mức trung vị của các lệnh là 21 cổ phiếu, được đo bằng phương pháp kiểm tra ngoặc tự xác thực — đếm lũy kế từ 19 đến 23 cổ phiếu — kết quả sẽ trả về 0 nếu nằm ngoài khoảng, và được giới hạn để nếu không khớp thì giữ nguyên giá trị cuối cùng. 17.9 triệu lệnh chỉ có đúng một cổ phiếu và 4.73% lệnh có kích thước phân số — một mô hình nhất quán với việc các ứng dụng bán lẻ thực hiện giao dịch lên băng điện tử theo từng phần nhỏ, với các market maker đứng ở phía đối ứng.

Phân tích khối lượng: xác định "matched volume" từ dictionary

Cộng tất cả các trường size (quy mô) trong mọi print (giao dịch) cho thấy ngày 29 tháng 6 có 24.79 tỷ cổ phiếu được giao dịch. Con số đó không chính xác, và chính dữ liệu tape đã chỉ ra điều này. Mỗi print đều đi kèm các mã điều kiện (condition codes), và SIP — Securities Information Processor, hệ thống hợp nhất mọi sàn giao dịch thành một luồng dữ liệu duy nhất — xuất bản một dictionary (từ điển) nêu rõ từng mã một, liệu print đó có cập nhật khối lượng hợp nhất hay không. Một số tin nhắn chỉ là các bản phát lại hành chính của khối lượng đã được tính một lần trước đó. Thay vì lập trình cứng một danh sách các mã "đã biết", bài viết này xác định tập hợp loại trừ từ chính dictionary:

Truy vấnBộ loại trừ, trích xuất từ từ điển mã tape (một dòng)
Câu lệnh SQL chính xác đằng sau mỗi con số
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 điều kiện bán mang giá trị updates_volume = false trên feed hợp nhất: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Đây là bài học rút ra: một bản thảo trước đó của báo cáo tóm tắt hàng ngày đã lập trình cứng mã 15 và 16 — hai thông báo mở/đóng chính thức mà mọi hướng dẫn dữ liệu đều đề cập — và bỏ sót hoàn toàn mã 38. Dictionary, chứ không phải một danh sách mã được ghi nhớ, mới là nguồn dữ liệu chuẩn (source of truth).

Việc chia làm hai khối là có chủ đích: một truy vấn con (scalar subquery) trên dictionary bên trong một lượt quét 156.1 triệu dòng sẽ vượt quá giới hạn 30 giây của chúng tôi. Do đó, khối phía trên xác định tập hợp dưới dạng một dòng duy nhất — được giới hạn kiểm tra bởi số lượng mã và một id checksum (69) — và khối phía dưới áp dụng các giá trị literal đã được xác định. Nếu dictionary có thay đổi, checksum sẽ giúp bài viết này được xem xét lại; các giá trị literal sẽ không bao giờ bị lỗi thời một cách âm thầm.

Truy vấnVolume thực tế so với SIP: áp dụng bộ loại trừ đã trích xuất
Câu lệnh SQL chính xác đằng sau mỗi con số
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'

Số liệu kế toán đã được điều chỉnh: 24.79 tỷ cổ phiếu thô, 20.66 tỷ cổ phiếu tính theo SIP, 4.13 tỷ cổ phiếu bị loại trừ qua 91175 print hành chính. Một định nghĩa, được phát biểu chính xác: "matched volume" nghĩa là khối lượng mà các quy tắc điều kiện của chính SIP tính vào tổng hợp nhất — không hơn không kém. Chúng tôi không đánh giá giao dịch nào có ý nghĩa về mặt kinh tế; chúng tôi đang áp dụng phương pháp kế toán của chính tape.

Giải mã các lệnh giao dịch lớn nhất

Các lệnh giao dịch lớn nhất trong ngày là nơi các mã điều kiện không còn là thông tin phụ:

Truy vấnCác lệnh lớn nhất ngày 29/6 (đã loại bỏ các mã trong từ điển)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Hãy xem các hàng đầu tiên như một ví dụ minh họa. Lệnh lớn nhất trong ngày — 61.69 triệu cổ phiếu CAG (Conagra) tại mức giá $13.98, tương đương khoảng $862.5 triệu, được ghi nhận lúc 16:04:53 ET với các mã 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — là kết quả đấu giá đóng cửa của NYSE được công bố sau 4:00 pm. Lệnh này chỉ được tính vào khối lượng giao dịch đúng một lần. Sau đó, cùng lượng 61.69 triệu cổ phiếu đó lại xuất hiện dưới mã 15, Market Center Official Close: đây là một báo cáo lại mà từ điển loại trừ, nằm trong phần 4.13 tỷ đã được lược bỏ ở trên. Hàng mã 15 đó được chủ ý loại khỏi bảng trên, vì vậy dữ liệu của nó được trình bày trong một bảng riêng biệt gồm một hàng:

Truy vấnĐối chiếu: phiên khớp lệnh đóng cửa của CAG và báo cáo lại mã-15
Câu lệnh SQL chính xác đằng sau mỗi con số
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'

Lệnh lớn nhất trong số 6 thông báo đóng cửa chính thức của CAG có 61.69 triệu cổ phiếu — chính xác là 61.69 triệu cổ phiếu của phiên đấu giá (chênh lệch: 0) — được ghi nhận lúc 16:04:53 ET từ mã sàn giao dịch 10, NYSE trong danh mục cổ phiếu: đây là sàn niêm yết đang báo cáo lại kết quả đấu giá của chính mình.

CAG hàng còn lại thuộc loại khác — lệnh giao dịch 15.17 triệu cổ phiếu dưới các mã 12, 2 (12 Form T / extended hours, 2 Average Price Trade) và hai lệnh khác dưới mã 12 là các lệnh sau đấu giá được báo cáo qua FINRA với các điều kiện có updates_volume = true. SIP tính chúng là các lệnh giao dịch thực tế, và con số khớp lệnh của chúng tôi cũng vậy.

Ở các phần khác, mã 9 đánh dấu các lệnh khớp lệnh đóng cửa của Nasdaq — lệnh khớp lệnh trị giá $3389.5 triệu của NVDA là lệnh có giá trị USD lớn nhất trong bảng — và các mã trên lệnh SNAP (53, 41) bao gồm mã 53, một Qualified Contingent Trade.

Đồng hồ: mười phút chiếm lĩnh cả ngày giao dịch

Nếu xét theo độ phân giải từng phút, dòng lệnh giao dịch tập trung gần như hoàn toàn vào các thời điểm mở và đóng cửa phiên:

Truy vấnMười phút giao dịch sôi động nhất (hàng triệu lệnh)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Phút thứ 15:59 ET ghi nhận 3.98 triệu giao dịch — hơn sáu mươi nghìn giao dịch mỗi giây. Việc các mã khác trong top mười có tập trung quanh thời điểm mở cửa và đóng cửa hay không cũng chỉ là một phép đo đơn dòng:

Truy vấnSố phút sôi động nhất nằm ngoài khung giờ mở và đóng cửa
Câu lệnh SQL chính xác đằng sau mỗi con số
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 trong số mười mã nằm trong mười phút đầu phiên hoặc mười phút cuối trước khi đóng cửa. Ngoại lệ duy nhất — 10:15 ET, với lượng giao dịch đột biến đạt 0.88 triệu lệnh — là một sự bất thường thực sự vào giữa buổi sáng; nguyên nhân của nó không thể xác định được từ dữ liệu này, và chúng tôi sẽ không tự đưa ra giả thuyết. Thời điểm tương tự sẽ xuất hiện ở phần dưới.

Luồng báo giá: nửa tỷ lượt cập nhật

National Best Bid and Offer — mức giá mua và bán tốt nhất trên mọi sàn giao dịch, được cập nhật lại mỗi khi có thay đổi — đã ghi nhận 505.38 triệu lần cập nhật vào ngày 29 tháng 6, so với 156.1 triệu giao dịch.

Truy vấnToàn bộ luồng NBBO trong một dòng — QQQ và NVDA
Câu lệnh SQL chính xác đằng sau mỗi con số
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'

Các sản phẩm chỉ số chiếm ưu thế về số lượng báo giá: chỉ riêng QQQ đã ghi nhận 5.23 triệu lượt cập nhật so với 1.8 triệu của NVDA, cổ phiếu đơn lẻ được báo giá nhiều nhất trong danh sách chúng tôi kiểm tra — nhiều hơn 0.67 triệu lượt cập nhật so với mã cổ phiếu đứng kế tiếp. Do không thể thống kê toàn bộ mọi mã niêm yết trong giới hạn 30 giây, bảng xếp hạng dưới đây là một tập hợp dữ liệu đã được kiểm chứng, không phải là bảng xếp hạng đầy đủ:

Truy vấnCập nhật NBBO cho tám ticker có tần suất cao (hàng triệu)
Câu lệnh SQL chính xác đằng sau mỗi con số
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 dẫn đầu danh sách kiểm chứng với 5.23 triệu lượt cập nhật; nhóm đứng đầu bảng là các quỹ chỉ số và các quỹ đòn bẩy tương ứng, không phải là các cổ phiếu phổ biến.

Phân tích SPY: dữ liệu tính bằng nanosecond và hai cách tính spread

Truy vấnChi tiết SPY: khoảng cách nanosecond, spread hai chiều, chất lượng quote
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Chỉ riêng trong giờ giao dịch bình thường, báo giá của SPY đã thay đổi 3.98 triệu lần. Giây bận rộn nhất — 10:15:43 ET, nằm trong phút 10:15 đã nêu trên — ghi nhận 1461 cập nhật. Khoảng cách nhỏ nhất giữa các cập nhật liên tiếp là 1375 nanoseconds, giá trị trung vị là 245.6 microseconds, và có 75138 cặp liên tiếp có cùng dấu thời gian nanosecond — ngay cả độ phân giải nanosecond cũng không thể sắp xếp hoàn toàn dữ liệu thị trường hiện đại.

Những nanosecond đó đóng vai trò quan trọng trong việc đo lường bid-ask spread. Nếu tính mọi cập nhật như nhau, spread trung bình của SPY là 2.72 cents; nếu tính trọng số mỗi báo giá theo thời gian duy trì, kết quả là 2.34 cents. Con số tính trên mỗi cập nhật cho thấy mức chênh lệch cơ học rộng hơn 0.38 cents: các cập nhật tập trung chính xác vào những thời điểm spread đang rộng và biến động, trong khi một lệnh chờ (resting order) được tính theo thời gian thực. Bất cứ khi nào bạn thấy thống kê về spread, hãy xem xét xem loại đồng hồ nào đã đo lường nó. Các số liệu thống kê được công bố rõ ràng: 1544 cập nhật trong giờ giao dịch bình thường bị khớp lệnh ngược (ask thấp hơn bid, do sự đan xen các báo giá từ các sàn khác nhau) và 0 có bid hoặc ask bằng không; các thống kê spread loại bỏ cả hai trường hợp này và tính toán dựa trên những gì còn lại.

Spread biến động theo thời gian

Khi phân loại spread niêm yết của SPY theo từng nửa giờ, cấu trúc vi mô sẽ tạo thành một biểu đồ mà bất kỳ nhà giao dịch nào cũng có thể sử dụng:

Truy vấnMedian spread của SPY theo mỗi nửa giờ, 4:00 am đến 8:00 pm ET
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Mức trung vị là 8 cents trong khung giờ premarket 04:00, 3 cents trong khung giờ mở cửa 09:30, và 2 cents vào lúc 14:00 — việc giao dịch cùng một cổ phiếu tại thời điểm mở cửa premarket sẽ tốn chi phí cao gấp khoảng bốn lần so với một lệnh vào đầu buổi chiều. Spread không phải là một hằng số; nó là một lịch trình.

Bằng chứng thực tế: tệp dữ liệu bị dừng lại ở chữ S

Mọi tệp dữ liệu hàng ngày từ nhà cung cấp đều phải qua bước kiểm tra tính đầy đủ trước khi chúng tôi công bố số liệu: đếm số lượng ticker, kiểm tra phạm vi bảng chữ cái và so sánh với các tệp lân cận. Tệp khối lượng bán khống ngoài sàn (off-exchange short-volume) của FINRA ngày 29 tháng 6 là minh chứng cho lý do này:

Truy vấnKiểm tra độ đầy đủ: phạm vi file short-volume của FINRA, 26-30/6
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Tệp ngày 26 tháng 6 bao gồm 15052 ticker, từ A đến ZYME. Tệp ngày 29 tháng 6 chỉ bao gồm 5489, từ A đến SSUS — dữ liệu bị dừng lại giữa chừng ở các tên bắt đầu bằng chữ S. Mọi ticker theo thứ tự bảng chữ cái sau điểm đó — bao gồm cả TSLA, với 0 dòng cho ngày 29 tháng 6 so với 1 vào ngày 26 tháng 6 — đều bị thiếu; đến ngày 30 tháng 6, tệp đã trở lại mức 15362 ticker. Một bước kiểm tra tính đầy đủ không gì phức tạp hơn một bản đối soát mỗi ngày như thế này — đó là sự khác biệt giữa việc công bố một số liệu thống kê và công bố một dữ liệu lỗi.

Với thông tin minh bạch đó — và chỉ với thông tin này — đây là tỷ lệ: khối lượng bán khống có đánh dấu (marked-short volume) chiếm 45.85% khối lượng giao dịch ngoài sàn được báo cáo vào ngày 29 tháng 6, so với 46.89% vào ngày 26 tháng 6 và 48.82% vào ngày 30 tháng 6. Số liệu ngày 29 tháng 6 chỉ bao gồm phần dữ liệu từ chữ A đến chữ S, vì vậy hãy coi đây là một kết quả chưa đầy đủ. Tỷ lệ bán khống gần một nửa là mức thông thường mà mọi phiên giao dịch lân cận đều hiển thị — và khối lượng bán khống hàng ngày không phải là short interest.

Ghi chú dữ liệu

Ghi chú dữ liệu đầy đủ
  • Giai đoạn tạm lắng báo giá từ 5 đến 6 giờ chiều. Luồng báo giá của SPY gần như dừng lại trong nửa giờ 17:00 ET (233) và hoạt động trở lại vào lúc 18:00 (40608) — đây là mô hình phiên/luồng dữ liệu chung giữa các ticker, không phải mất dữ liệu.
  • Cổ phiếu phân đoạn xuất hiện ở khắp mọi nơi. 4.73% các lệnh khớp có quy mô không nguyên; khối lượng phải được tính tổng dưới dạng số thập phân.
  • Từ điển mã sử dụng lại các id cho nhiều loại khác nhau. Id 15 vừa là điều kiện bán (Market Center Official Close) vừa là điều kiện báo giá (Closed); mọi truy vấn từ điển ở đây đều lọc theo asset_class = 'stocks' AND type = 'sale_condition'. Việc tra cứu chỉ bằng id sẽ dẫn đến dán nhãn sai mã.
  • Các trường hợp loại trừ chất lượng báo giá được tính trực tiếp. Số lượng lệnh khớp chéo (crossed) và lệnh không có giá bid/ask bằng không nằm trong bảng phân tích chi tiết SPY ở trên; không có thống kê spread nào che giấu các trường hợp sụt giảm này.
  • Quét toàn bộ băng dữ liệu (whole-tape scans) chỉ là các bảng dữ liệu theo lô. Các khối dữ liệu toàn thị trường ở đây được đo lường tối đa khoảng 30 giây mỗi khối trên bộ nhớ đệm lạnh (một khối hết thời gian chờ sẽ được thử lại một lần; lượt quét bộ nhớ đệm ấm sẽ vượt qua giới hạn này); chúng chỉ chạy một lần tại thời điểm tác giả soạn thảo thông qua đường dẫn chỉ đọc có kiểm soát, không chạy trực tiếp cho người đọc, và kết quả được lưu trữ chính là bản ghi chính thức.

Phương pháp luận

  • Dấu thời gian được lưu trữ theo UTC và được lọc bằng các giới hạn UTC thô (giờ giao dịch thông thường vào ngày 29 tháng 6 là từ 13:30 đến 20:00 UTC); hàm toTimeZone chỉ xuất hiện trong danh sách SELECT.
  • Loại phiên giao dịch được xác minh dựa trên lịch ngày lễ và khung thời gian giao dịch thông thường 390-bar thực tế — không bao giờ được giả định.
  • "Khối lượng tính theo SIP (khớp)" là khối lượng mà các quy tắc điều kiện của SIP tính vào tổng hợp nhất; tập hợp loại trừ được trích xuất từ từ điển, được giới hạn bằng checksum, không bao giờ được mã hóa cứng.
  • Thống kê spread theo mỗi lần cập nhật tính trọng số bằng nhau cho mỗi cập nhật NBBO; thống kê tính theo thời gian tính trọng số dựa trên thời gian tồn tại của mỗi báo giá. Cả hai đều công khai các trường hợp loại trừ.
  • Các cột giá/quy mô dạng thập phân được cộng trực tiếp và chuyển đổi sang kiểu float 64-bit trước khi thực hiện bất kỳ phép tính tỷ lệ hoặc giá nhân quy mô nào.
  • Các bảng tick lưu giữ toàn bộ lịch sử và không có thời hạn hết hạn xoay vòng; các kết quả được lưu trữ và đánh phiên bản này là hồ sơ bền vững bất kể các yếu tố khác. Trạng thái kho dữ liệu tính đến ngày 3 tháng 7 năm 2026.

Mỗi bảng điều khiển ở trên là một đối tượng được lưu trữ — bao gồm biểu đồ, bảng và SQL. Bạn có thể mở bất kỳ bảng nào, sao chép truy vấn và tiếp tục phân tích trên terminal Strasmore.