2026年6月29日市場微結構深度解析
解析2026年6月29日的完整成交與報價逐筆資料、字典衍生的成交量更正、奈秒級收據,以及在字母 S 處截斷的 FINRA 檔案。
這是 2026年6月29日市場回顧 的底層解析:呈現分鐘 K 線下方的原始資料流,包括一個普通週一交易時段中的 156.1 百萬筆個別成交與 505.38 百萬筆 NBBO 報價更新。所有數字均來自儲存的查詢結果(展開任一面板即可查看完整 SQL)。當天發現的兩項資料問題也會完整說明:一項是行情資料本身的代碼字典要求進行的成交量更正,另一項則是供應商檔案在字母 S 處悄然停止。
逐筆交易紀錄
交易時段檢查必須先行,不能想當然耳:交易所休市日曆在2026年6月29日列有 0 筆資料,而 SPY 在正常交易時段內確實列印了 390 根1分鐘K線,涵蓋完整交易時段,即紐約時間上午9:30至下午4:00。整個延長交易日中,綜合交易紀錄共記錄 156.1 百萬筆個別交易。
| 6月29日假日列 | SPY正常交易時段柱數 | 交易筆數(百萬) | 零股交易占比(%) | 零股股數占比(%) | 成交中位數股數 | 一股交易筆數(百萬) | 碎股交易占比(%) |
|---|---|---|---|---|---|---|---|
| 0 | 390 | 156.1 | 72.61 | 8.79 | 21 | 17.9 | 4.73 |
每個數據背後的精確 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%% 屬於零股交易,即少於100股的交易;但其成交股數僅占原始股數的 8.79%,而下方的成交量鑑識段落會對這項未校正總數進行修整。成交筆數的中位數為 21 股,這是透過可自行驗證的區間探測法測得;該方法檢查累計筆數介於19至23股的區間,若未命中區間則回傳0,並設有界限,讓未命中的結果維持原位。共有 17.9 百萬筆交易恰好為1股,另有 4.73% 筆採用零碎股數,這種模式與零售交易 App 將訂單一次切成一小筆一小筆送進交易紀錄的情況一致,由造市商承接另一側交易。
成交量鑑識:從字典推導「matched volume」
將每筆成交紀錄的 size 欄位加總後,6月29日顯示成交了 24.79 billion 股。這個數字是錯的,成交明細本身就說明了這一點。每筆成交紀錄都帶有 condition codes;SIP(Securities Information Processor)會將所有交易場所的資料整合為單一串流,並發布一份字典,逐一說明各代碼下的成交紀錄是否會更新整合成交量。有些訊息只是將已計入一次的成交量重新廣播。本文不硬編碼一份「已知」代碼清單,而是直接從字典推導排除集合:
| 排除代碼 | 排除識別碼校驗和 | 代碼 |
|---|---|---|
| 3 | 69 | 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market) |
每個數據背後的精確 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 個 sale conditions 的 updates_volume = false:15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market)。以下是這項工作的重點:先前版本的每日摘要硬編碼 15 和 16 兩個代碼。這是每份資料指南都會提到的官方開盤與收盤訊息,但該版本完全漏掉代碼 38。字典才是唯一依據,不是憑記憶建立的代碼清單。
刻意分成兩個區塊,是因為在 156.1 million 筆資料的掃描中,若在字典上使用 scalar subquery,執行時間會超過我們設定的30秒上限。因此,上方區塊先將集合推導為單一列,並以代碼數量與 id checksum(69)進行合理性檢查;下方區塊再套用推導出的常值。若字典日後發生變動,checksum 的限制會讓本文進入複核流程;這些常值不可能在無提示的情況下悄悄過時。
| 原始股數(十億) | 撮合股數(十億) | 排除股數(十億) | 排除成交筆數 |
|---|---|---|---|
| 24.79 | 20.66 | 4.13 | 91175 |
每個數據背後的精確 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 billion 股,SIP 計入的成交量為 20.66 billion 股,另有 4.13 billion 股分布於 91175 筆行政性成交紀錄中而遭排除。明確定義如下:「matched volume」是指依 SIP 自身的 condition rules 計入整合成交總量的成交量,僅此而已。我們不是在判斷哪些交易具有經濟意義,而是依照成交明細自身的核算規則處理。
最大筆成交的解讀
當日最大筆成交最能說明成交條件代碼並非無關緊要的細節:
| ticker | 美東時間 | 股數(百萬) | 價格 | 名目金額(美元百萬) | 占最大美元成交金額(%) | 條件識別碼 |
|---|---|---|---|---|---|---|
| CAG | 16:04:53 | 61.69 | 13.98 | 862.5 | 25.4 | 8, 41 |
| SNAP | 11:46:13 | 22.6 | 4.41 | 99.7 | 2.9 | 53, 41 |
| NVDA | 16:00:00 | 17.38 | 194.97 | 3389.5 | 100 | 8, 9, 41 |
| CAG | 16:04:59 | 15.17 | 13.98 | 212 | 6.3 | 12, 2 |
| CAG | 16:04:53 | 12.87 | 13.98 | 179.9 | 5.3 | 12 |
| CAG | 16:04:53 | 12.61 | 13.98 | 176.3 | 5.2 | 12 |
| ARI | 16:03:52 | 12.54 | 10.52 | 131.9 | 3.9 | 8, 41 |
| AAPL | 16:00:00 | 11.65 | 281.74 | 3281.7 | 96.8 | 8, 9, 41 |
| GPUS | 16:02:47 | 10 | 0.1545 | 1.5 | 0 | 12, 2 |
每個數據背後的精確 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(8 Closing Prints、41 Trade Thru Exempt)。這是 NYSE 收盤競價的結果,於美東時間下午4點後公布。該筆成交只計入成交量一次。相同的 61.69 百萬股隨後又以代碼15「Market Center Official Close」重新出現:這是字典排除的重報資料,也是前文剔除的 4.13 十億股成交量的一部分。上述表格刻意剔除代碼15的資料列,因此這筆成交另以簡潔的單列面板呈現:
| 競價成交股數(百萬) | 官方收盤重發股數(百萬) | 股數差異 | 重發美東時間 | 重發交易所識別碼 | CAG代碼15成交筆數 |
|---|---|---|---|---|---|
| 61.69 | 61.69 | 0 | 16:04:53 | 10 | 6 |
每個數據背後的精確 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 列則屬於不同類型。當中一筆為 15.17 百萬股,條件代碼為 12, 2(12 Form T/延長交易時段、2 Average Price Trade);另有兩筆同樣使用代碼12。這些都是透過 FINRA 申報的競價後成交,且其成交條件帶有 updates_volume = true。SIP 將其計為實際成交,我們的匹配數值也同樣計入。
在其他成交中,代碼9代表 Nasdaq 收盤交叉交易。NVDA 的 $3389.5 百萬美元交叉成交,是表中按金額計算的最大筆成交;而 SNAP 的成交條件代碼(53, 41)包含53,即 Qualified Contingent Trade。
時鐘:十分鐘主導全天交易
以分鐘為單位觀察,成交明細幾乎全都集中在交易時段的兩端:
| 美東時間分鐘 | 交易筆數(百萬) |
|---|---|
| 15:59 | 3.98 |
| 15:58 | 2.29 |
| 09:30 | 1.81 |
| 15:57 | 1.59 |
| 15:55 | 1.36 |
| 15:56 | 1.24 |
| 15:54 | 1.01 |
| 15:50 | 1 |
| 10:15 | 0.88 |
| 15:53 | 0.8 |
每個數據背後的精確 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 1015:59 ET 分鐘內成交了 3.98 百萬筆交易,每秒超過六萬筆。其餘前十大時點是否同樣集中在開盤與收盤附近,可由一列資料直接衡量:
| 開收盤外資料筆數 | 開收盤內資料筆數 | 外部資料分鐘 | 外部資料交易筆數(百萬) |
|---|---|---|---|
| 1 | 9 | 10:15 | 0.88 |
每個數據背後的精確 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,NBBO)涵蓋各交易所的最佳買價與賣價。只要任一價格變動,就會重新發布。6月29日共更新 505.38 百萬次,相較之下,成交筆數為 156.1 百萬筆。
| 更新筆數(百萬) | QQQ更新筆數(百萬) | NVDA:更新筆數(百萬) | QQQ減NVDA:更新筆數(百萬) | NVDA:減次高單一標的(百萬) |
|---|---|---|---|---|
| 505.38 | 5.23 | 1.8 | 3.43 | 0.67 |
每個數據背後的精確 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秒上限,以下排行榜是經核對的樣本,並非完整排名:
| ticker | 更新筆數(百萬) |
|---|---|
| QQQ | 5.23 |
| SPY | 5.07 |
| TQQQ | 3.91 |
| IWM | 3.4 |
| SQQQ | 3.29 |
| NVDA | 1.8 |
| AAPL | 1.13 |
| TSLA | 0.59 |
每個數據背後的精確 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 放大檢視:奈秒級成交紀錄,以及兩種計算方式的買賣價差
| SPY 更新數(百萬) | 最繁忙秒(ET) | 10:15內最繁忙秒 | 最繁忙秒更新數 | 更新間最小間隔(奈秒) | 間隔中位數(微秒) | 相同時間戳記配對數 | 時間加權平均價差(美分) | 每次更新平均價差(美分) | 每次更新溢價(美分) | 交叉報價更新數 | 買價或賣價為零的更新數 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3.98 | 10:15:43 | 1 | 1461 | 1375 | 245.6 | 75138 | 2.34 | 2.72 | 0.38 | 1544 | 0 |
每個數據背後的精確 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 對連續更新使用相同的奈秒時間戳。這表示即使具備奈秒解析度,也無法完全排列現代交易紀錄的先後順序。
這些奈秒資料可用來精確衡量 買賣價差。若每次更新權重相同,SPY 的平均價差為 2.72 美分;若依每筆報價維持的時間加權,則為 2.34 美分。每次更新的計算結果機械式地寬了 0.38 美分,原因是報價更新會集中在價差擴大且快速變動的時刻,而靜置中的委託單則是以時鐘時間持續存在。每當看到價差統計,都應先確認採用的是哪一種時間衡量方式。這項統計也揭露了排除的資料,而非將其隱藏:正常交易時段有 1544 次更新曾短暫出現交叉報價(賣價低於買價,代表不同交易場所的報價交錯),另有 0 次更新的買價或賣價為零;價差統計排除這兩類資料,並明確計算排除的筆數。
The spread has a clock
Bucketing SPY's quoted spread by half hour turns the microstructure into a curve any trader can use:
| 美東時間 | 價差中位數(美分) | 報價更新數 |
|---|---|---|
| 04:00 | 8 | 90477 |
| 04:30 | 7 | 94194 |
| 05:00 | 6 | 85391 |
| 05:30 | 6 | 84732 |
| 06:00 | 6 | 80634 |
| 06:30 | 6 | 67515 |
| 07:00 | 6 | 78384 |
| 07:30 | 7 | 90251 |
| 08:00 | 6 | 82373 |
| 08:30 | 6 | 96858 |
| 09:00 | 5 | 75032 |
| 09:30 | 3 | 714684 |
| 10:00 | 3 | 828786 |
| 10:30 | 3 | 598922 |
| 11:00 | 3 | 415660 |
| 11:30 | 3 | 254713 |
| 12:00 | 3 | 194340 |
| 12:30 | 2 | 159115 |
| 13:00 | 2 | 150132 |
| 13:30 | 2 | 106726 |
每個數據背後的精確 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_timeA median of 8 cents in the 04:00 ET premarket bucket, 3 cents in the 09:30 opening bucket, and 2 cents by 14:00, trading the same share at the premarket open costs roughly four times the spread of an early-afternoon order. The spread is not a constant; it is a schedule.
取證展品:在 S 開頭處中止的檔案
我們每天發布任何數據前,都會先對供應商檔案進行完整性檢查:計算 ticker 數量、檢查字母排序涵蓋範圍,並與相鄰日期比較。6月29日的 FINRA 場外交易放空成交量檔案,正好說明原因:
| date | 股票代碼 | 首個股票代碼 | 最後股票代碼 | TSLA 資料列數 | 放空占申報數百分比 |
|---|---|---|---|---|---|
| 2026-06-26 | 15052 | A | ZYME | 1 | 46.89 |
| 2026-06-29 | 5489 | A | SSUS | 0 | 45.85 |
| 2026-06-30 | 15362 | A | ZYME | 1 | 48.82 |
每個數據背後的精確 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 date6月26日的檔案涵蓋 15052 個 ticker,範圍從 A 到 ZYME。6月29日的檔案涵蓋 5489 個 ticker,範圍從 A 到 SSUS;檔案在 S 開頭的名稱中途便停止。此後依字母排序的所有 ticker,包括 TSLA,在6月29日僅有 0 列,相較之下6月26日有 1 列,因而全部遺漏;到了6月30日,檔案恢復為 15362 個 ticker。完整性檢查並不複雜,就像每天每列一筆的收據;這正是發布統計數字與發布殘缺檔案之間的差別。
在納入上述揭露後,也只有在這個前提下,才能看這項比率:6月29日,標示為放空的成交量占申報場外交易成交量的 45.85%;6月26日為 46.89%,6月30日為 48.82%。6月29日的數字僅涵蓋 A 至 S 的部分,因此應視為不完整讀數。鄰近各交易日顯示,接近一半的放空占比才是常態水準;而每日放空成交量並不等於 放空未平倉量。
資料說明
完整資料說明
- 下午5點至6點的報價低谷。 SPY 的報價串流在 17:00 ET 半小時內幾乎停止(233 次更新),並在 18:00 恢復(40608 次更新)。這是跨 ticker 的資料串流與交易時段模式,並非資料遺失。
- 零股無處不在。 4.73% 的成交筆數包含非整數股數;成交量必須以小數相加。
- 代碼字典會在不同類型間重複使用 id。 Id 15 同時代表成交條件(Market Center Official Close)與報價條件(Closed);本文每次查詢字典時,都會篩選 asset_class = 'stocks' AND type = 'sale_condition'。若僅依 id 直接查詢,便會誤標代碼。
- 報價品質排除項目會直接計入。 交叉報價與買方或賣方報價為零的筆數,均列在上方的 SPY microscope 面板中;任何 spread 統計都沒有隱藏這些排除項目。
- 完整市場逐筆資料掃描僅以批次面板執行。 這裡的全市場區塊在冷快取下,每個最多約需30秒(逾時的區塊會重試一次;快取暖機後的執行可解除上限)。這些掃描僅在撰寫時透過受控的唯讀路徑執行一次,不會在讀者瀏覽時即時執行;儲存的結果即為紀錄。
方法論
- 時間戳記以 UTC 儲存,並使用原始 UTC 邊界篩選(6月29日正常交易時段為 13:30 至 20:00 UTC);toTimeZone 僅出現在 SELECT 清單中。
- 交易時段類型會與假日行事曆及實際觀察到的 390 根正常交易時段 bar 進行核對,不會逕行假設。
- 「SIP 計入(matched)成交量」是 SIP 依自身條件規則計入合併總量的成交量;排除集合是根據字典推導,受 checksum 邊界約束,從未硬編碼。
- 每次更新的 spread 統計對每次 NBBO 更新給予相同權重;時間加權統計則依每筆報價維持的時間長度加權。兩者均揭露排除項目。
- Decimal 價格與數量欄位以原生格式加總,並在任何比率或價格乘以數量的算術運算前轉換為 64 位元浮點數。
- Tick 表保留完整歷史資料,不採用滾動式到期;無論如何,這些已儲存且具版本控管的結果都是持久紀錄。資料倉儲狀態截至2026年7月3日。
上方每個面板都是一個整合的儲存物件、圖表、表格與 SQL。開啟任一面板、複製查詢,並在 Strasmore terminal 上進一步分析。