2026年6月29日のマイクロストラクチャー
2026年6月29日の取引テープの詳細を解説します。出来高の修正やナノ秒単位の記録、FINRAファイルの内容まで深く掘り下げます。
これは 2026年6月29日の市場概況 の詳細データです。通常の月曜日のセッションにおける、1分足の背景にある生データを示しています。これには 156.1 million件の個別取引 と 505.38 million件のNBBOクオート更新 が含まれます。すべての数値は保存されたクエリの結果です(正確なSQLを確認するには、各パネルを展開してください)。また、本稿では2つの調査結果を詳しく解説します。1つは、テープのコード辞書に基づいた出来高の修正、もう1つは、Sの文字で静かに終了しているベンダーファイルについてです。
取引テープ、プリントごとの記録
まずセッションの確認を行います。取引所の休日カレンダーでは、2026年6月29日が0行として記録されています。SPYは通常取引時間内に正確に390分のミニットバーを記録しました。これはニューヨーク時間の午前9時30分から午後4時までのフルセッションです。延長取引を含めたコンソリデーテッド・テープでは、156.1 million件の個別取引が記録されました。
各数値の背後にある正確な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 million件のプリントはちょうど1株であり、4.73%は端数サイズでした。これは、リテール向けアプリが一度に一区画ずつテープに注文を出し、マーケットメーカーがその反対側で取引を行うパターンと一致しています。
ボリューム・フォレンジック:ディクショナリから「マッチド・ボリューム」を導出する
すべてのプリントのsizeフィールドを合算すると、6月29日の取引高は24.79 billion sharesとなります。しかし、この数値は誤りであり、テープ自体がそれを証明しています。各プリントにはコンディション・コードが含まれています。すべての取引所を一つのストリームに統合するSIP(Securities Information Processor)は、各コードがコンソリデート・ボリューム(統合取引高)を更新するかどうかを記したディクショナリを公開しています。メッセージの中には、すでにカウント済みのボリュームを再放送している管理用メッセージも存在します。本稿では、「既知」のコードリストをハードコードするのではなく、ディクショナリ自体から除外セットを導出します。
各数値の背後にある正確な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を完全に見落としていました。記憶に基づいたコードリストではなく、ディクショナリこそが真実のソース(source of truth)です。
ブロックを2つに分けているのは意図的です。156.1-million-row のスキャン中にディクショナリに対してスカラー副問合せを実行すると、30秒の制限時間を超過してしまいます。そのため、上記のブロックでコード数とidチェックサム(69)によって範囲を限定した上で、セットを1行として導出しています。下のブロックでは、導出されたリテラルを適用しています。ディクショナリに変化が生じた場合、チェックサムによって本稿の再確認が必要であることが判明します。これにより、リテラルが密かに古くなることはありません。
各数値の背後にある正確な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 shares、SIPカウントでは 20.66 billion shares、91175 の管理用プリントにより 4.13 billion sharesが除外されました。「マッチド・ボリューム」の定義は、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上部の行を例として示します。当日の最大約定は、13.98ドルでCAG (Conagra)の61.69百万株、総額約862.5百万ドルです。これは16:04:53 ETにコード8, 41 (8 Closing Prints, 41 Trade Thru Exempt)として記録されており、午後4時以降に公開されるNYSEのクロージング・オークションの結果です。この約定は、出来高として一度だけカウントされます。その後、同じ61.69百万株がコード15(Market Center Official Close)として再度表示されます。これは再報告(re-report)であり、辞書の定義により、上記の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 ETに株式ディレクトリのNYSE(取引所ID 10)から記録されています。これは、上場取引所が自身のオークション結果を再表明したものです。
その他のCAG行は性質が異なります。コード12, 2 (12 Form T / extended hours, 2 Average Price Trade)による15.17百万株の約定と、コード12による2件の約定は、FINRAを通じて報告されたオークション後の約定であり、コンディションに updates_volume = true が含まれています。SIPおよび当社の照合数値では、これらを実際の約定としてカウントします。
その他では、コード9はNasdaqのクロージング・クロスを示します。NVDAの3389.5百万ドルのクロスは、ドル建てでこの表最大の約定です。また、SNAPの約定(53, 41)のコードには、Qualified Contingent Tradeを示す53が含まれています。
時計:1日のうちの10分間が支配的
分単位の解像度で見ると、取引履歴の大部分はセッションの開始時と終了時に集中しています。
各数値の背後にある正確な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の1分間における取引数は3.98 million tradesに達しました。これは1秒あたり6万件以上の取引に相当します。上位10銘柄の残りが、開始時と終了時のいずれかに集中しているかどうかは、以下の1行のデータで確認できます。
各数値の背後にある正確な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
)10銘柄のうち9は、開始後10分間、または終了前10分間のいずれかに位置しています。唯一の例外は10:15 ETの0.88 million printsという急増であり、これは午前中の特異な動きです。このデータからその原因を特定することはできず、推測も行いません。同じ時間帯のデータが以下に続きます。
クオート・ストリーム:5億件の更新
National Best Bid and Offer(全取引所における最良気配値)は、買い気配または売り気配が変化するたびに再公開されます。6月29日、この値は156.1百万件の取引に対し、505.38百万回更新されました。
各数値の背後にある正確な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百万回でした。QQQは、次に多い銘柄を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 DESC確認済みデータではQQQが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 ordered取引時間中だけで、SPYの価格は3.98百万回変化しました。最も取引が活発だった秒間は、上記の10:15分間内にある10:15:43 ETで、1461件の更新がありました。連続する更新間の最小間隔は1375ナノ秒、中央値は245.6マイクロ秒でした。また、75138組の連続する更新は、ナノ秒単位でも同一のタイムスタンプを持っていました。現代のテープ(取引記録)を完全に順序付けするには、ナノ秒の解像度でも不十分です。
これらのナノ秒データは、bid-ask spread(売買スプレッド)の測定に活用されます。すべての更新を均等にカウントした場合、SPYの平均スプレッドは2.72セントでした。各価格が維持された時間で加重平均すると、2.34セントとなります。更新ごとの数値は、機械的に0.38セント広くなります。これは、スプレッドが拡大し変動している瞬間に更新が集中する一方で、静止している注文は経過時間としてカウントされるためです。スプレッドの統計を見る際は、どの時間軸で測定されたかを確認してください。内訳は公開されています。1544件の取引時間中の更新で一時的なクロス(異なる取引所からの引用が混在し、アスクがビッドを下回る状態)が発生し、0件でビッドまたはアスクがゼロでした。スプレッドの統計には、これら両方のケースは除外されています。
スプレッドには時間経過がある
SPYの提示スプレッドを30分単位で分類すると、トレーダーが活用できる曲線的なマイクロストラクチャが見えてきます。
各数値の背後にある正確な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_time04:00 ETのプレマーケットでは中央値が8セント、09:30の開始直後の時間帯は3セント、14:00までには2セントとなります。プレマーケット開始時に同じ銘柄を取引するコストは、午後の早い時間帯の注文におけるスプレッドの約4倍に達します。スプレッドは一定ではなく、スケジュールに従って変動します。
フォレンジック調査: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で始まる名称の途中で停止しています。その後のアルファベット順のティッカーはすべて欠落しています。これには0行を記録した6月29日のTSLAも含まれます(6月26日は1行)。6月30日には、ファイルは15362のティッカーに戻っています。完全性チェックとは、このような1日ごとの受領書を確認することに他なりません。これこそが、統計データを公開することと、不完全なデータ(アーティファクト)を公開することの差です。
この事実を明記した上で、比率を報告します。6月29日のマークド・ショート・ボリュームは、報告された場外ボリュームの45.85%であり、6月26日は46.89%、6月30日は48.82%でした。6月29日の数値はAからSまでの範囲のみをカバーしているため、部分的なデータとして扱ってください。ショートシェアが半分近くになるのは、前後のセッションで見られる通常のレベルです。また、デイリー・ショート・ボリュームはショート・インタレストとは異なります。
データに関する注記
データに関する詳細情報
- 午後5時から6時までの引用の停滞。 SPYの引用ストリームは、17:00 ETの30分間(233)でほぼ停止し、18:00(40608)までに再開します。これはデータ欠損ではなく、銘柄を横断するフィードおよびセッションのパターンです。
- 端株の普遍性。 4.73%の約定は整数ではないサイズを含みます。出来高は小数点を用いて合算する必要があります。
- コード辞書におけるIDの重複。 ID 15は、売却条件(Market Center Official Close)と引用条件(Closed)の両方に使用されます。ここでの辞書クエリは、すべて asset_class = 'stocks' かつ type = 'sale_condition' でフィルタリングされています。IDのみで検索すると、コードを誤認する可能性があります。
- 引用品質の除外項目はインラインでカウント。 交差(crossed)およびゼロ・ビッド・オア・アスクのカウントは、上部のSPYマイクロスコープパネルに表示されます。スプレッド統計によってこれらの減少が隠されることはありません。
- ホールテープ・スキャンはバッチ処理専用のパネルです。 ここでの市場全体のブロックは、コールドキャッシュの状態ではそれぞれ最大約30秒間測定されます(タイムアウトしたブロックは1回再試行され、ウォーム状態のパスでは上限をクリアします)。これらは作成時にゲート付きの読み取り専用パスを通じて一度だけ実行され、読者のためにライブで提供されることはありません。保存された結果が記録となります。
手法
- タイムスタンプはUTCで保存され、生のUTC範囲でフィルタリングされます(6月29日の通常取引時間は13:30から20:00 UTC)。toTimeZoneはSELECTリストにのみ使用されます。
- セッションタイプは、祝日カレンダーおよび観測された390バーの通常取引時間に基づいて検証されます。推測は行いません。
- 「SIP集計(マッチ済み)ボリューム」は、SIP独自の条件ルールによってコンソリデーテッド・トータルにカウントされるボリュームです。除外セットはディクショナリから導出され、チェックサムによって制限されます。ハードコードはしていません。
- 更新ごとのスプレッド統計は、各NBBO更新を均等に加重します。時間加重統計は、各クオートの継続時間に基づいて加重します。両方の統計において、除外対象が明示されます。
- 小数点を含む価格・サイズ列は、ネイティブに合算され、比率や価格×サイズの計算を行う前に64ビット浮動小数点数にキャストされます。
- Tickテーブルは、ローリング式の有効期限なしで全履歴を保持します。これらの保存・バージョン管理された結果が、永続的な記録となります。2026年7月3日時点のウェアハウスの状態です。
上記の各パネルは、チャート、テーブル、SQLが一体となった一つの保存オブジェクトです。これらを開いてクエリをコピーし、Strasmoreターミナルでさらに詳細な分析を行ってください。