2026年6月29日 微觀結構深度分析
深入解析2026年6月29日交易與報價明細:包含原始成交記錄、字典推導之成交量修正、奈秒級時間戳,以及截斷之FINRA檔案。
這是2026年6月29日市場回顧的幕後輔助資料:在一個普通的週一交易日中,原始數據串流位於分鐘K線之下,包含156.1萬筆個別交易與505.38萬筆NBBO報價更新。每個數字皆為儲存查詢結果(展開任一區塊即可查看確切SQL語法),當日兩項鑑識發現將有完整說明:一項是成交量的修正(由行情資料本身的程式碼字典所要求),另一項則是某個供應商檔案在字母S處悄然終止。
逐筆成交明細
交易日曆檢查是首要前提,不可預設:2026年6月29日的交易所休市日曆共有 0 筆記錄,SPY 在常規交易時段內(紐約時間上午9:30至下午4:00)恰好產生了 390 根分鐘線,為完整交易日。延伸交易時段中,整合成交記錄帶共錄得 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% 為零股交易(少於100股的交易),但這些交易僅佔 8.79% 的原始股數(未經修正的總量,下方成交量鑑識章節將進行調整)。中位數成交筆數為 21 股,採用自我驗證區間探針測量,累計計數落在19至23股之間;若區間未命中則回傳0,且設有邊界,使未命中時維持後續數值。17.9 萬筆成交記錄恰好為1股,4.73% 筆為碎股規模,此模式與散戶應用程式逐筆打入成交記錄帶的行為一致,而造市商則承接另一邊。
成交量鑑識:從字典推導「配對成交量」
將每筆成交紀錄的規模欄位加總後,6月29日顯示為24.79億股。這個數字是錯的,而行情本身也這麼說。每筆成交都帶有條件代碼,而SIP(證券資訊處理器,負責將所有交易所合併為單一資料流的機構)會發布一份字典,逐一說明每個代碼是否會更新合併成交量。有些訊息只是行政性的重新廣播,所計入的成交量早已被計算過一次。本文不採用硬編碼的「已知」代碼清單,而是直接從字典本身推導出排除集合:
每個數據背後的精確 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') = 03個成交條件在合併資料流中將 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百萬筆資料的過程中,對字典執行一個純量子查詢,會直接超過我們30秒的上限。因此,上方的區塊先將排除集合推導為單一列,並以代碼數量與ID校驗和(69)進行合理性邊界檢查;下方的區塊則套用推導出的字面值。如果字典日後有所變動,校驗和邊界會讓本文進入審查流程;這些字面值絕不會在無人察覺的情況下過時。
每個數據背後的精確 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億股,SIP計入20.66億股,4.13億股因91175筆行政性成交而被排除。只有一個定義,且定義得非常精確:「配對成交量」指的是SIP自身的條件規則計入合計總量的成交量,僅此而已。我們不是在判斷哪些交易具有經濟意義;我們只是在套用行情本身的會計規則。
最大筆成交解讀
當日最大筆成交,讓條件代碼不再只是冷知識:
每個數據背後的精確 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 美東時間標記為代碼 8, 41(8 收盤列印、41 豁免交易),這是紐約證交所於下午 4:00 後發布的收盤競價結果。這筆交易僅計入成交量一次。同一批 61.69 百萬股隨後以代碼 15(市場中心官方收盤)再次出現:這是字典排除的重新申報,屬於上方剔除的 4.13 十億美元的一部分。該筆代碼 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 美東時間從交易所代碼 10(股票目錄中的紐約證交所)標記:即上市市場重申自身的競價結果。
其餘 CAG 行則屬於不同類型:代碼 12, 2(12 表格 T / 延長交易時段、2 平均價格交易)下的 15.17 百萬股列印,以及另外兩筆代碼 12 的列印,均為透過 FINRA 申報的競價後成交,其條件設定 updates_volume = true。SIP 將其視為真實列印,我們的比對數字亦同。
在其他部分,代碼 9 標記那斯達克收盤交叉交易,NVDA 的 3389.5 百萬美元交叉交易是表格中金額最大的列印,而 SNAP 列印(53, 41)上的代碼包含 53,即合格或有交易。
時鐘:一天中的十分鐘
以分鐘為解析度來看,交易記錄幾乎完全集中在盤前與盤後時段:
每個數據背後的精確 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 百萬筆交易,每秒超過六萬筆。其餘前十名是否都緊貼開盤與收盤,本身就是一個單行測量:
每個數據背後的精確 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),即彙整各交易所最佳買賣價格,每當任一價格變動即重新發布,在6月29日當天更新了 505.38百萬次,而同期成交筆數為 156.1百萬筆。
每個數據背後的精確 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秒時限內無法完整列出所有掛牌代碼的逐檔普查數據,因此下方的排行榜為經篩選的樣本,並非全面排名:
每個數據背後的精確 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 DESCQQQ 以 5.23百萬次更新位居篩選樣本之首;排行榜前列多為指數型基金及其槓桿版本,而非一般常見的個股。
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 orderedSPY 的報價在常規交易時段內變動了 3.98 百萬次。其最忙碌的一秒鐘發生在 10:15:43 ET,位於上方標記的 10:15 分鐘內,承載了 1461 次更新。連續更新之間的最小間隔為 1375 奈秒,中位數為 245.6 微秒,而 75138 對連續更新帶有完全相同的奈秒時間戳——即便奈秒解析度也無法完全為現代報價序列排序。
這些奈秒在衡量 買賣價差 時發揮了作用。若將每次更新視為等權,SPY 的平均價差為 2.72 美分;若按每筆報價的持續時間加權,則為 2.34 美分。每次更新的數據機械性地寬了 0.38 美分:更新集中在價差擴大且劇烈波動的時刻,而靜止的委託單則存在於時鐘時間中。每當你看到價差統計數據時,應先問清楚是用哪個時鐘來衡量的。普查結果是公開而非隱藏的:1544 次常規時段更新曾短暫出現交叉(賣價低於買價,來自不同交易所的報價交錯),而 0 次更新帶有零買價或零賣價;價差統計數據將兩者排除在外,並明確說明了排除的內容。
價差也有時間表
將SPY報價價差按半小時分組,微觀結構就變成一條任何交易者都能運用的曲線:
每個數據背後的精確 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_time8 ET盤前時段的中位數為04:00美分,3開盤時段為09:30美分,到2時降至14:00美分。在盤前開盤時交易同一檔股票,成本大約是午後下單的四倍。價差並非固定不變,而是一張時間表。
鑑識證據:一份停在S字母的檔案
每份每日券商檔案在發布數據前,都會先經過完整性檢查:計算代碼數量、核對字母跨度、比對相鄰檔案。6月29日的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 date6月26日的檔案涵蓋15052個代碼,範圍從A到ZYME。6月29日的檔案則涵蓋5489個代碼,範圍從A到SSUS,它單純在S字母名稱的中途就中斷了。此後按字母順序的所有代碼,包括TSLA在內,在6月29日僅有0筆資料,相較於6月26日的1筆,這些資料全部遺失;到了6月30日,檔案又恢復為15362個代碼。完整性檢查不過就是這種每日一列的收據,它決定了發布的是統計數據還是錯誤產物。
在附上上述揭露資訊(且僅在此前提下)之後,以下是比率數據: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筆)才恢復,這是跨股票代碼的資料饋送/交易時段模式,並非資料遺漏。
- 碎股交易隨處可見。 4.73%的成交紀錄帶有非整數股數;成交量必須以十進位方式加總。
- 代碼字典在不同類別間重複使用編號。 編號15同時代表一種成交條件(市場中心官方收盤價)與一種報價條件(收盤);此處所有字典查詢皆已過濾 asset_class = 'stocks' AND type = 'sale_condition'。未經篩選直接查詢編號會導致代碼標示錯誤。
- 報價品質排除項目已計入行內。 上述SPY顯微鏡面板中已包含交叉報價與買賣價為零的計數;任何價差統計數據皆未隱藏其排除筆數。
- 全盤掃描僅為批次面板。 此處所測量的全市場區塊,在冷快取狀態下每次執行約需30秒(逾時的區塊會重試一次;暖機後的通過可清除上限);這些掃描僅在撰寫時透過受控的唯讀路徑執行一次,讀者端無法即時執行,儲存的結果即為最終紀錄。
方法論
- 時間戳記以UTC儲存,並使用原始UTC邊界進行篩選(6月29日的常規交易時段為13:30至20:00 UTC);toTimeZone僅出現在SELECT清單中。
- 交易時段類型會根據假日行事曆及觀察到的390根K線常規視窗進行驗證,絕不預設。
- 「SIP計數(配對)成交量」是指SIP自身條件規則計入彙總總量的成交量;排除集合理論來自字典,並以校驗和為邊界,絕不寫死。
- 每次更新的價差統計會平等加權每一筆NBBO更新;時間加權統計則根據每筆報價持續的時間長短加權。兩者均揭露其排除條件。
- 十進制價格/數量欄位以原生方式加總,並在進行任何比率或價格乘以數量的運算前,轉換為64位元浮點數。
- 報價明細表保留完整歷史紀錄,無滾動到期機制;這些已儲存且具版本管理的結果即為持久記錄。倉儲狀態截至2026年7月3日。
以上每個面板都是一個儲存物件,包含圖表、表格及SQL。開啟任一面板,複製查詢,並在Strasmore終端機上進一步運用。