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

Microstructuur analyse 29 juni 2026

Analyse van de trade en quote tape van 29 juni 2026, inclusief volume correcties en nanosecond receipts voor een diepgaand inzicht in de marktdata.

Dit is het aanvullende overzicht bij de marktupdate van 29 juni 2026: de ruwe gegevens achter de minute bars — 156.1 miljoen individuele trades en 505.38 miljoen NBBO quote updates in één reguliere maandagse sessie. Elk getal is het resultaat van een query (klap elk paneel open voor de exacte SQL), en de twee forensische bevindingen van de dag krijgen een volledige analyse: een volume-correctie die vereist is door de code-dictionary van de tape, en een vendor file die stilletjes stopt bij de letter S.

De handelsgegevens, transactie voor transactie

De controle van de sessie vindt als eerste plaats: de feestdagkalender van de beurs bevat 0 regels voor 29 juni 2026, en SPY registreerde exact 390 minute bars binnen het reguliere venster — een volledige sessie van 9:30 uur tot 16:00 uur New Yorkse tijd. Gedurende de extended day registreerde de geconsolideerde tape 156.1 miljoen individuele trades.

QueryEén handelsdag: session check plus de grootte van elke print
De exacte SQL achter elk getal
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% van alle prints waren odd lots — transacties van minder dan honderd shares — maar zij vertegenwoordigden slechts 8.79% van het totale aantal shares — het gecorrigeerde totaal dat in de onderstaande sectie over volume-forensics wordt verwerkt. De mediane print was 21 shares, gemeten met een zelfverificerende bracket probe — cumulatieve tellingen van negenentwintig tot drieëntwintig shares — die 0 retourneert als de bracket de waarde mist, en begrensd is zodat een miss de post behoudt. 17.9 miljoen prints waren voor exact één share en 4.73% bevatten fractional sizes — een patroon dat consistent is met retail-apps die de tape één slice per keer raken, waarbij market makers de andere zijde nemen.

Volume-forensisch onderzoek: het afleiden van "matched volume" uit het dictionary

Tel het size-veld bij elke print bij elkaar op; op 29 juni werden 24.79 miljard aandelen verhandeld. Dat cijfer is onjuist, en de tape geeft dit zelf ook aan. Elke print bevat condition codes, en de SIP — de Securities Information Processor die elke venue consolideert in één stream — publiceert een dictionary waarin code voor code staat aangegeven of een print de geconsolideerde volume bijwerkt. Sommige berichten zijn administratieve re-broadcasts van volume dat al eenmaal is geteld. In plaats van een lijst met "bekende" codes hard te coderen, leidt dit artikel de uitsluitingsset af uit het dictionary zelf:

QueryDe exclusion set, afgeleid van de tape code dictionary (één rij)
De exacte SQL achter elk getal
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 verkoopcondities hebben updates_volume = false op de geconsolideerde feed: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Hier is de geleerde les: een eerdere versie van de dagelijkse recap had codes 15 en 16 hard gecodeerd — de twee officiële open/close berichten die in elke dataguide worden genoemd — en miste code 38 volledig. Het dictionary is de bron van waarheid, niet een lijst met onthouden codes.

Het gebruik van twee blokken is bewust: een scalar subquery over het dictionary binnen een scan van 156.1 miljoen rijen overschrijdt onze limiet van 30 seconden. Daarom leidt het bovenstaande blok de set af als één rij — met een controle op het aantal codes en een id checksum (69) — en het onderstaande blok past de afgeleide literalen toe. Als het dictionary verandert, zorgt de checksum ervoor dat dit artikel opnieuw beoordeeld moet worden; de literalen kunnen nooit ongemerkt verouderd raken.

QueryRaw vs SIP-counted volume, toegepast op de afgeleide exclusion set
De exacte SQL achter elk getal
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'

De gecorrigeerde berekening: 24.79 miljard aandelen bruto, 20.66 miljard SIP-geteld, 4.13 miljard uitgesloten over 91175 administratieve prints. Eén definitie, nauwkeurig geformuleerd: "matched volume" is het volume dat volgens de eigen condition rules van de SIP wordt meegeteld voor het geconsolideerde totaal — niets meer. We beoordelen niet welke transacties economisch relevant waren; we passen de eigen boekhouding van de tape toe.

De grootste prints, ontleed

De grootste prints van de dag zijn de momenten waarop conditiecodes meer zijn dan alleen trivia:

QueryDe grootste single prints van June 29 (zonder dictionary-excluded codes)
De exacte SQL achter elk getal
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

Lees de bovenste rijen als een rekenvoorbeeld. De grootste print van de dag — 61.69 miljoen CAG (Conagra) aandelen tegen $13.98, ongeveer $862.5 miljoen, genoteerd om 16:04:53 ET onder codes 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — is het resultaat van de NYSE closing auction dat na 16:00 uur wordt gepubliceerd. Deze telt precies één keer mee voor het volume. Dezelfde 61.69 miljoen aandelen verschijnen vervolgens opnieuw onder code 15, Market Center Official Close: een herrapportage die volgens de dictionary wordt uitgesloten en deel uitmaakt van de 4.13 miljard die hierboven is weggefilterd. Die code-15 rij is ontwerptechnisch uit de bovenstaande tabel verwijderd, waardoor de registratie ervan een eigen, beknopte een-rijen paneel krijgt:

QueryHet bewijs: CAG's closing auction en de code-15 re-report, naast elkaar
De exacte SQL achter elk getal
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'

De grootste van de 6 official-close berichten over CAG betreft 61.69 miljoen aandelen — exact de 61.69 miljoen van de auction (verschil: 0) — genoteerd om 16:04:53 ET via exchange id 10, NYSE in de stocks directory: de listing market die haar eigen auction herbevestigt.

De overige CAG rijen zijn van een andere aard — de print van 15.17 miljoen aandelen onder codes 12, 2 (12 Form T / extended hours, 2 Average Price Trade) en nog twee onder code 12 zijn post-auction prints die via FINRA worden gerapporteerd en waarbij de condities updates_volume = true bevatten. De SIP telt deze als echte prints, net als ons bijpassende cijfer.

Verder markeert code 9 de Nasdaq closing crosses — de $3389.5 miljoen cross van NVDA is de grootste print in dollars in de tabel — en de codes op de SNAP print (53, 41) bevatten 53, een Qualified Contingent Trade.

De klok: tien minuten domineren de dag

Op minutenbasis concentreert de handelsactiviteit zich bijna volledig rond de randen van de sessie:

QueryDe tien drukste minuten van de trade tape (miljoenen prints)
De exacte SQL achter elk getal
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

De 15:59 ET-minuut registreerde 3.98 miljoen trades — meer dan zestigduizend per seconde. Of de rest van de top tien zich rond de opening en de sluiting concentreert, is een meting van één regel:

QueryAantal van de tien drukste minuten buiten de open en de close
De exacte SQL achter elk getal
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 van de tien valt binnen de eerste tien minuten of de laatste tien minuten voor de sluiting. De enige uitzondering — 10:15 ET, met een piek van 0.88 miljoen prints — is een anomalie in de ochtend; de oorzaak is op basis van deze data onbekend en wij zullen geen verklaring verzinnen. Dezelfde tijdstippen volgen hieronder.

De quote stream: een half miljard updates

De National Best Bid and Offer — de beste bied- en laatprijs over alle beurzen heen, die telkens opnieuw wordt gepubliceerd wanneer een van beide wijzigt — werd op 29 juni 505.38 miljoen keer bijgewerkt, tegenover 156.1 miljoen trades.

QueryDe volledige NBBO stream in één rij — QQQ en NVDA gepind op naam
De exacte SQL achter elk getal
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'

Indexproducten domineren de quoting: QQQ alleen al registreerde 5.23 miljoen updates tegenover 1.8 miljoen voor NVDA, het meest geciteerde individuele aandeel dat wij hebben gecontroleerd — 0.67 miljoen updates meer dan de eerstvolgende naam. Een volledige inventarisatie per ticker van elke listing past niet binnen de limiet van 30 seconden, dus de onderstaande ranglijst is een gecontroleerde selectie en geen volledige rangschikking:

QueryNBBO quote updates voor acht heavily-quoted tickers (miljoenen)
De exacte SQL achter elk getal
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 leidde de gecontroleerde selectie met 5.23 miljoen updates; de top van de lijst bestaat uit indexfondsen en hun leveraged varianten, niet uit bekende aandelen.

SPY onder de loep: nanoseconden-gegevens en de spread in twee richtingen

QuerySPY onder de microscoop: nanosecond gaps, de spread op twee manieren, quote quality
De exacte SQL achter elk getal
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

De koers van SPY veranderde alleen al tijdens de reguliere handelsuren 3.98 miljoen keer. De drukste seconde — 10:15:43 ET, binnen de 10:15 minuten die hierboven worden aangegeven — bevatte 1461 updates. De kleinste kloof tussen opeenvolgende updates was 1375 nanoseconds, de mediaan 245.6 microseconds, en 75138 opeenvolgende paren hadden identieke nanosecond-stempels — zelfs een resolutie van nanoseconds kan de moderne tape niet volledig ordenen.

Die nanoseconds zijn essentieel voor het meten van de bid-ask spread. Wanneer elke update gelijk wordt geteld, was de gemiddelde spread van SPY 2.72 cents; wanneer elke quote wordt gewogen naar de duur ervan, was dit 2.34 cents. Het cijfer per update is mechanisch gezien 0.38 cents breder: updates clusteren precies op de momenten dat de spread groot is en beweegt, terwijl een rustende order in kloktijd staat. Wanneer u een spread-statistiek ziet, vraag u dan af welke klok deze heeft gemeten. De gegevens zijn openbaar, niet verborgen: 1544 updates tijdens de reguliere uren waren momentaal crossed (de ask stond onder de bid, een vermenging van quotes van verschillende venues) en 0 hadden een zero bid of ask; de spread-statistieken sluiten beide uit en tellen juist wat zij uitsluiten.

De spread volgt een tijdschema

Wanneer de spread van SPY wordt ingedeeld in blokken van een half uur, ontstaat er een curve in de microstructuur die voor elke trader bruikbaar is:

QuerySPY's median quoted spread per half uur, 4:00 am tot 8:00 pm ET
De exacte SQL achter elk getal
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

Een mediaan van 8 cents in de 04:00 ET premarket bucket, 3 cents in de 09:30 opening bucket, en 2 cents tegen 14:00 — het verhandelen van dezelfde aandeel bij de premarket opening kost ongeveer vier keer de spread van een order in de vroege middag. De spread is niet constant; het is een schema.

Forensisch bewijs: het bestand dat stopte bij de S

Elk dagelijks vendor-bestand ondergaat een controle op volledigheid voordat wij een cijfer publiceren: het tellen van de tickers, het controleren van het alfabetische bereik en het vergelijken met omliggende dagen. Het FINRA off-exchange short-volume bestand van 29 juni dient als bewijs:

QueryCompleteness probe: FINRA short-volume file coverage, June 26-30
De exacte SQL achter elk getal
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

Het bestand van 26 juni bevat 15052 tickers, van A tot en met ZYME. Het bestand van 29 juni bevat 5489, van A tot en met SSUS — het stopt simpelweg halverwege de namen die met een S beginnen. Elke ticker die alfabetisch na dat punt komt — inclusief TSLA, met 0 regels voor 29 juni tegenover 1 op 26 juni — ontbreekt; tegen 30 juni is het bestand weer terug naar 15362 tickers. Een controle op volledigheid is niet complexer dan dit bonnetje van één regel per dag — het verschil tussen het publiceren van een statistiek en het publiceren van een artefact.

Met deze toelichting — en uitsluitend hiermee — volgt hier de ratio: de marked-short volume bedraagt 45.85% van het gerapporteerde off-exchange volume op 29 juni, vergeleken met 46.89% op 26 juni en 48.82% op 30 juni. Het cijfer van 29 juni bevat alleen het segment van A tot en met S, beschouw dit daarom als een gedeeltelijke meting. Een short share van bijna de helft is het gebruikelijke niveau dat elke omliggende sessie laat zien — en dagelijkse short volume is geen short interest.

Databeschrijvingen

Volledige databeschrijvingen
  • De rustperiode in de quotes tussen 17:00 en 18:00 uur. De quote-stroom van SPY stopt bijna tijdens het 17:00 ET half uur (233 updates) en komt rond 18:00 (40608) weer op gang — dit is een patroon in de feed/sessie over verschillende tickers heen, geen ontbrekende data.
  • Fractionele aandelen komen overal voor. 4.73% van de prints heeft geen gehele getallen; het volume moet als decimalen worden opgeteld.
  • Het code-woordenboek hergebruikt id's voor verschillende typen. Id 15 is zowel een verkoopconditie (Market Center Official Close) als een quote-conditie (Closed); elke dictionary-query hier filtert op asset_class = 'stocks' EN type = 'sale_condition'. Een zoekopdracht enkel op basis van id leidt tot foutieve labels.
  • Uitsluitingen op quote-kwaliteit worden direct meegeteld. De tellingen voor 'crossed' en 'zero-bid-or-ask' staan in het SPY microscope-paneel hierboven; geen enkele spread-statistiek verbergt deze dalingen.
  • Scans van de volledige tape zijn uitsluitend batch-panelen. De marktbrede blokken hier werden gemeten met een duur van ongeveer dertig seconden per blok op een cold cache (een time-out blok wordt eenmaal opnieuw geprobeerd; een warmed pass haalt de limiet); ze worden eenmalig uitgevoerd op het moment van schrijven via het gated read-only pad en zijn nooit live voor lezers; de opgeslagen resultaten vormen de registratie.

Methodologie

  • Timestamps worden opgeslagen in UTC en gefilterd met ruwe UTC-grenzen (normale handelsuren op 29 juni zijn 13:30 tot 20:00 UTC); toTimeZone komt alleen voor in SELECT-lijsten.
  • Het sessietype wordt geverifieerd aan de hand van de feestdagkalender en het waargenomen venster van 390 bars tijdens de reguliere handel; dit wordt nooit aangenomen.
  • "SIP-counted (matched) volume" is het volume dat volgens de eigen conditieregels van de SIP wordt meegeteld bij het geconsolideerde totaal; de uitsluitingsset wordt afgeleid uit het dictionary en is checksum-bounded, nooit hardcoded.
  • Spread-statistieken per update wegen elke NBBO-update even zwaar; tijdgewogen statistieken wegen elke quote op basis van de duur van de weergave. Beide geven hun uitsluitingen weer.
  • Decimalen voor prijs/omvang worden natief opgeteld en omgezet naar 64-bit floats voordat er berekeningen met ratio's of prijs-maal-omvang worden uitgevoerd.
  • Tick-tabellen behouden de volledige historie zonder rollende vervaldatum; deze opgeslagen, versiespecifieke resultaten vormen de duurzame registratie. Warehouse-status per 3 juli 2026.

Elk paneel hierboven is één opgeslagen object — grafiek, tabel en SQL samen. Open een van deze objecten, kopieer de query en gebruik deze verder op de Strasmore terminal.