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

Marktstruktur Analyse 29. Juni 2026

Detaillierter Einblick in den Tape vom 29. Juni 2026: Analyse der Einzeltransaktionen, NBBO-Quote-Updates sowie Korrekturen der Handelsvolumina und FINRA-Daten.

Dies ist die ergänzende Analyse zu dem Marktbericht vom 29. Juni 2026: die Rohdaten hinter den Minutenbalken — 156.1 Millionen Einzeltransaktionen und 505.38 Millionen NBBO-Quote-Updates in einer gewöhnlichen Montagssitzung. Jeder Wert ist das Ergebnis einer gespeicherten Abfrage (erweitern Sie ein Panel für das exakte SQL). Die zwei forensischen Erkenntnisse des Tages erhalten ausführliche Berichte: eine Volumenkorrektur, die das Code-Wörterbuch des Tapes erfordert, und eine Anbieterdatei, die stillschweigend beim Buchstaben S endet.

Das Handelsjournal, Transaktion für Transaktion

Zuerst erfolgt die Sitzungsprüfung, niemals auf Annahmen basierend: Der Feiertagskalender der Börse enthält 0 Zeilen für den 29. Juni 2026, und der SPY generierte genau 390 Minuten-Bars innerhalb des regulären Zeitfensters – eine vollständige Sitzung von 09:30 Uhr bis 16:00 Uhr New York Zeit. Über den erweiterten Handel hinweg verzeichnete der konsolidierte Tape 156.1 Millionen Einzeltransaktionen.

AbfrageEin Handelstag: Session-Check plus Größe jedes Prints
Das exakte SQL hinter jeder Zahl
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% aller Transaktionen waren Odd Lots – also Handelsvolumina von weniger als 100 Aktien – doch sie bewegten nur 8.79% der Rohaktien – die unkorrigierte Gesamtsumme, die der Abschnitt zur Volumenforensik unten bereinigt. Der Median-Print lag bei 21 Aktien, gemessen mit einer selbstverifizierenden Bracket-Sonde – kumulative Zählungen von 19 bis 23 Aktien – die 0 zurückgibt, wenn die Bracket den Wert verpasst, und nach oben begrenzt ist, sodass ein Verpassen den Wert hält. 17.9 Millionen Transaktionen betrugen exakt eine Aktie und 4.73% wiesen Bruchteilsgrößen auf – ein Muster, das typisch für Retail-Apps ist, die den Tape Stück für Stück bedienen, während Market Maker die Gegenseite übernehmen.

Volumen-Forensik: Ableitung des „Matched Volume“ aus dem Dictionary

Die Summe des Size-Feldes aller Prints ergibt für den 29. Juni ein Handelsvolumen von 24.79 Milliarden Aktien. Diese Zahl ist falsch, und der Tape selbst belegt dies. Jeder Print enthält Condition-Codes. Der SIP — der Securities Information Processor, der alle Handelsplätze in einem Stream konsolidiert — veröffentlicht ein Dictionary, das Code für Code angibt, ob ein Print das konsolidierte Volumen aktualisiert. Einige Nachrichten sind administrative Re-Broadcasts von bereits gezähltem Volumen. Anstatt eine Liste „bekannter“ Codes fest einzuprogrammieren, leitet dieser Beitrag die Ausschlussmenge direkt aus dem Dictionary ab:

AbfrageAusschlussset, abgeleitet aus dem Code-Dictionary des Tapes (eine Zeile)
Das exakte SQL hinter jeder Zahl
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 Verkaufsbedingungen weisen im konsolidierten Feed das Attribut updates_volume = false auf: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Hier ist die Analyse: Ein früherer Entwurf des täglichen Recaps enthielt die Codes 15 und 16 fest programmiert — die beiden offiziellen Open/Close-Meldungen, die in jedem Datenleitfaden erwähnt werden — und übersah den Code 38 komplett. Das Dictionary ist die einzige verlässliche Quelle, nicht eine Liste auswendig gelernter Codes.

Die Verwendung von zwei Blöcken ist Absicht: Eine skalare Unterabfrage über das Dictionary innerhalb eines 156.1-Millionen-Zeilen-Scans überschreitet unser Limit von 30 Sekunden. Daher leitet der obere Block die Menge als eine einzelne Zeile ab — begrenzt durch die Anzahl der Codes und eine ID-Prüfsumme (69) — und der untere Block wendet die abgeleiteten Literale an. Falls sich das Dictionary ändert, dient die Prüfsumme als Warnsignal für eine Überprüfung dieses Beitrags; die Literale können so niemals unbemerkt veralten.

AbfrageRohvolumen vs. SIP-Volumen unter Anwendung des Ausschlusssets
Das exakte SQL hinter jeder Zahl
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'

Die korrigierte Abrechnung: 24.79 Milliarden Aktien Rohdaten, 20.66 Milliarden SIP-gezählt, 4.13 Milliarden ausgeschlossen über 91175 administrative Prints. Eine präzise Definition: „Matched Volume“ bedeutet das Volumen, das nach den eigenen Bedingungsregeln des SIP zum konsolidierten Gesamtwert zählt — nicht mehr und nicht weniger. Wir bewerten nicht, welche Trades wirtschaftlich relevant waren; wir wenden die eigene Buchführung des Tapes an.

Die größten Transaktionen analysiert

Die größten Transaktionen des Tages zeigen, wo Zuständigkeitscodes mehr als nur Details sind:

AbfrageGrößte Einzelprints vom 29. Juni (bereinigt um ausgeschlossene Codes)
Das exakte SQL hinter jeder Zahl
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

Betrachten Sie die obersten Zeilen als Beispiel. Die größte Transaktion des Tages — 61.69 Millionen CAG (Conagra) Aktien zu $13.98, etwa $862.5 Millionen, markiert um 16:04:53 ET unter den Codes 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — ist das Ergebnis der NYSE-Schlussauktion, das nach 16:00 Uhr veröffentlicht wird. Diese Transaktion wird genau einmal auf das Volumen angerechnet. Dieselben 61.69 Millionen Aktien erscheinen dann unter dem Code 15, Market Center Official Close: eine Neumeldung, die laut Glossar ausgeschlossen wird und Teil der oben abgezogenen 4.13 Milliarden ist. Diese Code-15-Zeile wurde absichtlich aus der obigen Tabelle entfernt, weshalb ihr Empfang in einem eigenen, einfachen einzeiligen Panel erscheint:

AbfrageVergleich: CAG-Closing-Auction und Code-15 Re-Report
Das exakte SQL hinter jeder Zahl
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'

Die größte der 6 Official-Close-Meldungen zu CAG umfasst 61.69 Millionen Aktien — exakt die 61.69 Millionen der Auktion (Differenz: 0) — markiert um 16:04:53 ET von der Exchange-ID 10, NYSE im Aktienverzeichnis: der Handelsplatz, der seine eigene Auktion erneut meldet.

Die anderen CAG Zeilen sind anders zu bewerten — die Transaktion über 15.17 Millionen Aktien unter den Codes 12, 2 (12 Form T / extended hours, 2 Average Price Trade) und zwei weitere unter Code 12 sind Transaktionen nach der Auktion, die über FINRA gemeldet wurden und deren Bedingungen updates_volume = true aufweisen. Das SIP zählt diese als echte Transaktionen, ebenso wie unsere abgeglichene Zahl.

An anderer Stelle kennzeichnet Code 9 die Nasdaq-Schlussauktionen — der $3389.5 Millionen Cross von NVDA ist die größte Transaktion der Tabelle in Dollar — und die Codes der SNAP Transaktion (53, 41) beinhalten 53, ein Qualified Contingent Trade.

Die Uhr: Zehn Minuten dominieren den Handelstag

In Minutentakt konzentriert sich das Handelsvolumen fast ausschließlich auf die Randzeiten der Sitzung:

AbfrageDie zehn aktivsten Minuten des Trade-Tapes (Millionen Prints)
Das exakte SQL hinter jeder Zahl
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

Der 15:59 ET-Minuten-Ticker verzeichnete 3.98 Millionen Trades — das sind über sechzigtausend pro Sekunde. Ob die restlichen Werte der Top-zehn ebenfalls die Eröffnung und den Schluss konzentrieren, lässt sich in einer Zeile messen:

AbfrageAnzahl der zehn aktivsten Minuten außerhalb von Open und Close
Das exakte SQL hinter jeder Zahl
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 der zehn Werte liegen innerhalb der ersten zehn Minuten oder der letzten zehn Minuten vor Börsenschluss. Die einzige Ausnahme — 10:15 ET mit einem Ausbruch von 0.88 Millionen Trades — ist eine echte Anomalie am Vormittag; die Ursache ist aus diesen Daten nicht ersichtlich, und wir werden keine Vermutung anstellen. Die gleiche Uhrzeit erscheint weiter unten erneut.

Der Quote-Stream: eine halbe Milliarde Aktualisierungen

Der National Best Bid and Offer — der beste Kauf- und Verkaufspreis über alle Börsen hinweg, der bei jeder Änderung neu veröffentlicht wird — wurde am 29. Juni 505.38 Millionen Mal aktualisiert, bei 156.1 Millionen Trades.

AbfrageDer gesamte NBBO-Stream in einer Zeile — QQQ und NVDA
Das exakte SQL hinter jeder Zahl
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'

Index-Produkte dominieren die Kurse: QQQ verzeichnete allein 5.23 Millionen Aktualisierungen gegenüber 1.8 Millionen für NVDA, der am häufigsten zitierten Einzelaktie in unserer Prüfung — 0.67 Millionen Aktualisierungen mehr als der nächstfolgende Einzelwert. Eine vollständige Erfassung jedes gelisteten Titels passt nicht in das 30-Sekunden-Zeitlimit; die folgende Bestenliste ist daher eine geprüfte Auswahl und kein erschöpfendes Ranking:

AbfrageNBBO-Quote-Updates für acht hochfrequentierte Ticker (Millionen)
Das exakte SQL hinter jeder Zahl
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 führte die geprüfte Auswahl mit 5.23 Millionen Aktualisierungen an; die Spitze der Liste bilden Indexfonds und deren gehebelte Varianten, keine bekannten Standardaktien.

SPY im Fokus: Nanosekunden-Daten und die zwei Arten des Spreads

AbfrageSPY im Detail: Nanosekunden-Gaps, Spread in beide Richtungen, Quote-Qualität
Das exakte SQL hinter jeder Zahl
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

Der Kurs des SPY änderte sich allein während der regulären Handelszeiten 3.98 Millionen Mal. Die aktivste Sekunde – 10:15:43 ET, innerhalb der oben markierten 10:15 Minute – verzeichnete 1461 Aktualisierungen. Der kleinste Abstand zwischen aufeinanderfolgenden Aktualisierungen betrug 1375 Nanosekunden, der Median 245.6 Mikrosekunden. Zudem trugen 75138 aufeinanderfolgende Paare identische Nanosekunden-Zeitstempel – selbst die Nanosekunden-Auflösung reicht nicht aus, um den modernen Tape vollständig zu ordnen.

Diese Nanosekunden dienen der Messung des bid-ask spread. Bei einer gleichmäßigen Zählung jeder Aktualisierung lag der durchschnittliche Spread des SPY bei 2.72 Cent; gewichtet nach der Dauer jeder Quote lag er bei 2.34 Cent. Der Wert pro Aktualisierung ist mechanisch um 0.38 Cent breiter: Aktualisierungen häufen sich genau in den Momenten, in denen der Spread groß ist und sich bewegt, während eine ruhende Order nach Uhrzeit gemessen wird. Wenn Sie eine Spread-Statistik sehen, prüfen Sie, welche Uhrzeit die Messung durchgeführt hat. Die Datenlage ist transparent: 1544 Aktualisierungen während der regulären Handelszeiten waren kurzzeitig crossed (der Ask lag unter dem Bid, was durch das Ineinandergreifen von Quotes verschiedener Handelsplätze entsteht) und 0 wiesen einen Bid oder Ask von Null auf; die Spread-Statistiken schließen beide Fälle aus und zählen stattdessen das, was sie ausschließen.

Der Spread folgt einem Zeitplan

Die Aufteilung des angebotenen Spreads von SPY in halbstündige Intervalle macht die Mikrostruktur zu einer Kurve, die für jeden Trader nutzbar ist:

AbfrageMedian des SPY-Spreads pro halber Stunde, 4:00 bis 20:00 Uhr ET
Das exakte SQL hinter jeder Zahl
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

Ein Median von 8 Cent im 04:00 ET Pre-Market-Bucket, 3 Cent im 09:30 Eröffnungs-Bucket und 2 Cent bis 14:00 — der Handel derselben Aktie zur Pre-Market-Eröffnung kostet etwa das Vierfache des Spreads einer Order am frühen Nachmittag. Der Spread ist keine Konstante; er ist ein Zeitplan.

Forensik-Beispiel: Die Datei, die bei S aufhörte

Jede tägliche Datei eines Anbieters wird vor der Veröffentlichung einer Kennzahl einer Vollständigkeitsprüfung unterzogen: Anzahl der Ticker zählen, die alphabetische Spanne prüfen, Nachbardaten vergleichen. Die FINRA Off-Exchange Short-Volume-Datei vom 29. Juni dient als Beispiel für die Notwendigkeit dieser Prüfung:

AbfrageVollständigkeitsprüfung: FINRA Short-Volume-Abdeckung, 26.–30. Juni
Das exakte SQL hinter jeder Zahl
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

Die Datei vom 26. Juni umfasst 15052 Ticker, von A bis ZYME. Die Datei vom 29. Juni umfasst 5489, von A bis SSUS — sie bricht einfach mitten in den Namen mit S ab. Jeder Ticker, der alphabetisch danach folgt – einschließlich TSLA, mit 0 Zeilen am 29. Juni gegenüber 1 am 26. Juni – fehlt; bis zum 30. Juni umfasst die Datei wieder 15362 Ticker. Eine Vollständigkeitsprüfung ist nicht komplizierter als dieser tägliche Beleg – der Unterschied zwischen der Veröffentlichung einer Statistik und der Veröffentlichung eines Artefakts.

Unter Berücksichtigung dieser Information – und nur mit ihr – ergibt sich folgendes Verhältnis: Das Short-Volume berechnet sich auf 45.85% des gemeldeten Off-Exchange-Volumens am 29. Juni, im Vergleich zu 46.89% am 26. Juni und 48.82% am 30. Juni. Der Wert vom 29. Juni deckt nur den Bereich von A bis S ab, daher ist er als Teilmessung zu betrachten. Ein Short-Anteil von fast der Hälfte ist das übliche Niveau, das jede benachbarte Sitzung aufweist – und das tägliche Short-Volume ist nicht short interest.

Datenhinweise

Vollständige Datenhinweise
  • Die Kursruhe zwischen 17:00 und 18:00 Uhr. Der Kursstrom von SPY stoppt in der halben Stunde 17:00 ET (233) fast vollständig und erholt sich bis 18:00 (40608) — dies ist ein tickerübergreifendes Feed- bzw. Sitzungsmuster und kein Datenverlust.
  • Bruchstücke sind allgegenwärtig. 4.73% der Meldungen weisen nicht-ganzzahlige Größen auf; das Volumen muss als Dezimalzahl summiert werden.
  • Das Code-Verzeichnis verwendet IDs über verschiedene Typen hinweg wieder. Die ID 15 ist sowohl eine Verkaufsbedingung (Market Center Official Close) als auch eine Kursbedingung (Closed); jede Abfrage des hier verwendeten Verzeichnisses filtert nach asset_class = 'stocks' UND type = 'sale_condition'. Eine einfache Suche nach der ID führt zu Fehlbezeichnungen.
  • Ausschlüsse der Kursqualität werden direkt mitgezählt. Die Zählungen für Crossed-Kurse sowie Zero-Bid-or-Ask-Kurse befinden sich im SPY-Mikroskop-Panel oben; keine Spread-Statistik verbirgt diese Ausfälle.
  • Vollständige Tape-Scans sind nur Batch-basierte Panels. Die hier gemessenen marktweiten Blöcke dauerten auf einem kalten Cache jeweils etwa 30 Sekunden (ein zeitüberschreitender Block wird einmal wiederholt; ein erwärmter Durchlauf überschreitet das Limit nicht); sie werden zum Zeitpunkt der Erstellung einmalig über den geschützten Read-only-Pfad ausgeführt und sind für Leser nicht live verfügbar; die gespeicherten Ergebnisse bilden die Aufzeichnung.

Methodik

  • Zeitstempel werden in UTC gespeichert und mit rohen UTC-Grenzwerten gefiltert (reguläre Handelszeiten am 29. Juni sind 13:30 bis 20:00 UTC); toTimeZone erscheint nur in SELECT-Listen.
  • Der Session-Typ wird anhand des Feiertagskalenders und des beobachteten 390-Bar-Fensters für den regulären Handel verifiziert; er wird niemals einfach angenommen.
  • Das „SIP-counted (matched) volume“ ist das Volumen, das die eigenen Bedingungsregeln des SIP zum konsolidierten Gesamtwert zählen; der Ausschluss-Satz wird aus dem Dictionary abgeleitet und ist checksummen-begrenzt, nicht fest kodiert.
  • Spread-Statistiken pro Update gewichten jedes NBBO-Update gleich; zeitgewichtete Statistiken gewichten jedes Quote nach seiner Dauer. Beide geben ihre Ausschlüsse an.
  • Spalten für Dezimalpreise und -größen werden nativ summiert und vor jeglicher Ratio- oder Preis-mal-Größe-Arithmetik in 64-Bit-Floats umgewandelt.
  • Tick-Tabellen behalten die vollständige Historie ohne rollendes Ablaufdatum; diese gespeicherten, versionierten Ergebnisse sind das dauerhafte Protokoll. Warehouse-Status vom 3. Juli 2026.

Jedes obige Panel ist ein einzelnes gespeichertes Objekt – Chart, Tabelle und SQL zusammen. Öffnen Sie eines davon, kopieren Sie die Abfrage und führen Sie diese im Strasmore-Terminal weiter aus.