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

Analyse microstructure du 29 juin 2026

Étude détaillée du tape et des cotations NBBO. Analyse du volume corrigé, des flux nanosecondes et du fichier FINRA tronqué pour la session du 29 juin 2026.

Ce document complète le récapitulatif de marché du 29 juin 2026 en analysant les données brutes sous les bougies d'une minute : 156.1 millions de transactions individuelles et 505.38 millions de mises à jour de cotations NBBO lors d'une session ordinaire de lundi. Chaque chiffre provient d'une requête SQL stockée (vous pouvez développer chaque panneau pour obtenir la requête exacte). Deux anomalies ont été identifiées : une correction de volume requise par le dictionnaire de code du tape, et un fichier fournisseur qui s'interrompt à la lettre S.

Le flux de transactions, transaction par transaction

La vérification de la session est systématique : le calendrier des jours fériés de la bourse contient 0 lignes pour le 29 juin 2026, et le SPY a enregistré exactement 390 bougies d'une minute durant la séance régulière — une session complète, de 9h30 à 16h00, heure de New York. Sur l'ensemble de la journée étendue, le tape consolidé a enregistré 156.1 millions de transactions individuelles.

RequêteUne journée de trading : session et taille de chaque print
Le SQL exact derrière chaque chiffre
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% de toutes les transactions étaient des "odd lots" — des ordres de moins de 100 actions — mais elles n'ont représenté que 8.79% du volume brut de shares — le total non corrigé que la section d'analyse du volume ci-dessous réduit. La médiane des transactions était de 21 actions, mesurée via une sonde de bracket auto-vérifiable — les décomptes cumulés allant de 19 à 23 actions — qui renvoie 0 si le bracket est manqué, et qui est borné pour qu'une erreur conserve la valeur précédente. 17.9 millions de transactions concernaient exactement une action et 4.73% présentaient des tailles fractionnées — un schéma cohérent avec les applications retail qui frappent le tape une fraction à la fois, avec les market makers prenant la contrepartie.

Analyse des volumes : dériver le « matched volume » à partir du dictionnaire

L'addition du champ « size » de chaque transaction indique que le 29 juin, 24.79 milliards d'actions ont été échangées. Ce chiffre est erroné, et le tape le confirme. Chaque transaction contient des codes de condition. Le SIP — le Securities Information Processor qui consolide tous les lieux d'échange en un flux unique — publie un dictionnaire précisant, code par code, si une transaction actualise le volume consolidé. Certains messages sont des re-diffusions administratives de volumes déjà comptabilisés. Plutôt que de coder en dur une liste de codes « connus », cet article dérive l'ensemble des exclusions directement du dictionnaire :

RequêteSet d'exclusion, dérivé du dictionnaire de codes du tape (une ligne)
Le SQL exact derrière chaque chiffre
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 conditions de vente affichent updates_volume = false sur le flux consolidé : 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Voici l'explication : une version précédente du récapitulatif quotidien utilisait les codes 15 et 16 en dur — les deux messages officiels d'ouverture et de clôture mentionnés dans chaque guide de données — et omettait totalement le code 38. Le dictionnaire est la seule source de vérité, et non une liste de codes mémorisée.

L'utilisation de deux blocs est volontaire : une sous-requête scalaire sur le dictionnaire lors d'un scan de 156.1 millions de lignes dépasse notre limite de 30 secondes. Le bloc supérieur dérive donc l'ensemble sous forme d'une seule ligne — avec une limite de sécurité sur le nombre de codes et une somme de contrôle d'id (69) — et le bloc inférieur applique les littéraux ainsi dérivés. Si le dictionnaire change, la somme de contrôle permet de signaler ce post pour révision ; les littéraux ne peuvent pas devenir obsolètes sans être détectés.

RequêteVolume brut vs volume SIP, avec application du set d'exclusion
Le SQL exact derrière chaque chiffre
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'

Comptabilité corrigée : 24.79 milliards d'actions brutes, 20.66 milliards comptabilisées par le SIP, 4.13 milliards exclues via 91175 transactions administratives. Une définition précise : le « matched volume » correspond au volume que les propres règles de condition du SIP comptabilisent dans le total consolidé — rien de plus. Nous ne jugeons pas la pertinence économique des transactions ; nous appliquons la comptabilité propre du tape.

Analyse des plus gros prints

Les plus gros prints de la journée indiquent quand les codes de condition deviennent essentiels :

RequêtePlus gros prints du 29 juin (codes exclus du dictionnaire supprimés)
Le SQL exact derrière chaque chiffre
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

Considérez les premières lignes comme un exemple concret. Le plus gros print de la journée — 61.69 millions de shares de CAG (Conagra) à 13.98 $, soit environ 862.5 millions de dollars, enregistré à 16:04:53 ET sous les codes 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — correspond au résultat de l'enchère de clôture de la NYSE publié après 16h00. Ce volume n'est comptabilisé qu'une seule fois. Les mêmes 61.69 millions de shares réapparaissent ensuite sous le code 15, Market Center Official Close : il s'agit d'un re-report exclu par le dictionnaire, faisant partie des 4.13 milliards retirés plus haut. Cette ligne en code 15 est volontairement supprimée du tableau ci-dessus ; sa réception fait l'objet de son propre encadré :

RequêteReçu : enchère de clôture CAG et son re-report code-15, côte à côte
Le SQL exact derrière chaque chiffre
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'

Le plus important des 6 messages de clôture officielle sur CAG porte sur 61.69 millions de shares — soit exactement les 61.69 millions de l'enchère (différence : 0) — enregistré à 16:04:53 ET via l'id d'échange 10, NYSE dans le répertoire des actions : le marché de cotation confirmant sa propre enchère.

Les CAG autres lignes sont de nature différente : le print de 15.17 millions de shares sous les codes 12, 2 (12 Form T / extended hours, 2 Average Price Trade) et deux autres sous le code 12 sont des prints post-enchère rapportés via FINRA dont les conditions incluent updates_volume = true. Le SIP les considère comme des prints réels, tout comme notre chiffre calculé.

Ailleurs, le code 9 marque les clôtures Nasdaq — le cross de NVDA de 3389.5 millions de dollars est le plus gros print du tableau en valeur — et les codes sur le print SNAP (53, 41) incluent le 53, un Qualified Contingent Trade.

L'horloge : dix minutes dominent la séance

À la minute près, le flux des transactions se concentre presque exclusivement sur les ouvertures et les clôtures de la séance :

RequêteLes dix minutes les plus actives du tape (millions de prints)
Le SQL exact derrière chaque chiffre
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

Le 15:59 ET a enregistré 3.98 millions de transactions — soit plus de soixante mille par seconde. La question de savoir si le reste du top dix se concentre sur l'ouverture et la clôture se résout sur une seule ligne :

RequêteNombre de minutes les plus actives hors ouverture et clôture
Le SQL exact derrière chaque chiffre
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 des dix titres se situent dans les dix minutes suivant l'ouverture ou les dix minutes précédant la clôture. La seule exception — 10:15 ET, avec un pic de 0.88 millions de transactions — est une anomalie en milieu de matinée ; la cause n'est pas identifiable avec ces données, et nous n'en inventerons pas une. Cette même temporalité réapparaît ci-dessous.

Le flux de cotations : un demi-milliard de mises à jour

Le National Best Bid and Offer — le meilleur prix d'achat et de vente sur l'ensemble des bourses, republié à chaque modification — a enregistré 505.38 millions de mises à jour le 29 juin, contre 156.1 millions de transactions.

RequêteFlux NBBO complet sur une ligne — QQQ et NVDA identifiés
Le SQL exact derrière chaque chiffre
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'

Les produits indiciels dominent les cotations : le QQQ a enregistré à lui seul 5.23 millions de mises à jour, contre 1.8 millions pour NVDA, l'action individuelle la plus cotée de notre échantillon — soit 0.67 millions de mises à jour d'écart avec la valeur suivante. Un recensement complet par ticker de toutes les cotations ne peut être réalisé dans la limite des 30 secondes ; le classement ci-dessous est donc un échantillon vérifié et non un classement exhaustif :

RequêteMises à jour NBBO pour huit tickers très cotés (millions)
Le SQL exact derrière chaque chiffre
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 arrive en tête de l'échantillon avec 5.23 millions de mises à jour ; le haut du classement est occupé par les fonds indiciels et leurs équivalents à effet de levier, et non par les actions grand public.

SPY sous la loupe : réception à la nanoseconde et dualité du spread

RequêteSPY au microscope : gaps nanosecondes, spread bid-ask, qualité des quotes
Le SQL exact derrière chaque chiffre
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

Le cours du SPY a changé 3.98 millions de fois uniquement durant les sessions régulières. Sa seconde la plus active — 10:15:43 ET, au sein de la minute 10:15 signalée plus haut — a enregistré 1461 mises à jour. L'écart minimal entre deux mises à jour consécutives était de 1375 nanosecondes, avec une médiane de 245.6 microsecondes. Enfin, 75138 paires consécutives présentaient des horodatages identiques à la nanoseconde près : même une résolution à la nanoseconde ne permet pas de classer totalement le flux de données moderne.

Ces nanosecondes servent à mesurer le bid-ask spread. En comptant chaque mise à jour de manière égale, le spread moyen du SPY était de 2.72 cents ; en pondérant chaque cotation par sa durée de maintien, il était de 2.34 cents. Le chiffre par mise à jour est mécaniquement plus élevé de 0.38 cents : les mises à jour se concentrent précisément aux moments où le spread est large et volatil, tandis qu'un ordre passif est mesuré en temps réel. Pour chaque statistique de spread, vérifiez quelle unité de temps a été utilisée. Les données sont transparentes : 1544 mises à jour en session régulière ont été croisées (l'ask était inférieur au bid, dû à l'entrelacement de cotations provenant de différentes plateformes) et 0 présentaient un bid ou un ask nul ; les statistiques de spread excluent ces deux cas et comptabilisent ce qui reste.

Le spread suit un cycle temporel

En segmentant le spread coté du SPY par tranches de trente minutes, la microstructure devient une courbe exploitable par tout trader :

RequêteMédiane du spread coté de SPY par demi-heure, 4h00 à 20h00 ET
Le SQL exact derrière chaque chiffre
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

Une médiane de 8 cents dans la tranche premarket de 04:00, 3 cents dans la tranche d'ouverture 09:30, et 2 cents à 14:00 — acheter la même action à l'ouverture du premarket coûte environ quatre fois le spread d'un ordre en début d'après-midi. Le spread n'est pas constant ; il suit un calendrier.

Analyse technique : le fichier interrompu à la lettre S

Chaque fichier quotidien des fournisseurs subit un test d'exhaustivité avant toute publication : comptage des tickers, vérification de l'étendue alphabétique et comparaison avec les sessions précédentes. Le fichier du volume de ventes à découvert hors-cote de la FINRA du 29 juin illustre ce processus :

RequêteTest de complétude : couverture du fichier short-volume FINRA, 26-30 juin
Le SQL exact derrière chaque chiffre
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

Le fichier du 26 juin contient 15052 tickers, de A à ZYME. Le fichier du 29 juin contient 5489, de A à SSUS — il s'arrête simplement au milieu des noms commençant par S. Tous les tickers situés après ce point dans l'ordre alphabétique — TSLA inclus, avec 0 lignes pour le 29 juin contre 1 le 26 juin — sont manquants ; le 30 juin, le fichier retrouve 15362 tickers. Un test d'exhaustivité consiste simplement en ce type de vérification quotidienne — la différence entre la publication d'une statistique et celle d'une erreur de données.

Avec cette précision — et uniquement avec celle-ci — voici le ratio : le volume de ventes à découvert (marked-short) représente 45.85% du volume hors-cote rapporté le 29 juin, contre 46.89% le 26 juin et 48.82% le 30 juin. Le chiffre du 29 juin ne couvre que la tranche de A à S ; il doit donc être considéré comme une lecture partielle. Un volume de ventes à découvert proche de 50% est le niveau habituel observé lors des sessions voisines — et le volume quotidien de ventes à découvert n'est pas le short interest.

Notes sur les données

Notes complètes sur les données
  • Baisse de l'activité de cotation entre 17h et 18h. Le flux de cotation du SPY s'arrête presque durant la demi-heure 17:00 (233) et reprend vers 18:00 (40608). Il s'agit d'un schéma de session/flux commun à tous les tickers, et non d'une absence de données.
  • Présence généralisée de fractions d'actions. 4.73% des transactions portent sur des tailles non entières ; le volume doit être calculé par la somme des décimales.
  • Réutilisation des identifiants dans le dictionnaire de codes. L'ID 15 correspond à la fois à une condition de vente (Market Center Official Close) et à une condition de cotation (Closed). Chaque requête de dictionnaire ici filtre selon asset_class = 'stocks' ET type = 'sale_condition'. Une recherche par ID seul entraîne une erreur d'étiquetage.
  • Exclusions liées à la qualité des cotations incluses dans les calculs. Les décomptes de transactions croisées (crossed) ou sans bid/ask sont intégrés dans le panneau microscope du SPY ci-dessus ; aucune statistique de spread ne masque ces baisses.
  • Les scans complets du tape sont des panneaux par lots uniquement. Les blocs du marché mesurés ici durent environ 30 secondes chacun sur un cache froid (un bloc avec timeout est retenté une fois ; le passage sur cache chaud élimine la limite). Ils sont exécutés une seule fois lors de la rédaction via le chemin de lecture seule ; les résultats stockés constituent la référence.

Méthodologie

  • Les horodatages sont stockés en UTC et filtrés selon des limites UTC brutes (les heures régulières du 29 juin vont de 13:30 à 20:00 UTC) ; la fonction toTimeZone n'apparaît que dans les listes SELECT.
  • Le type de session est vérifié par rapport au calendrier des jours fériés et à la fenêtre régulière observée de 390 barres — elle n'est jamais supposée.
  • Le « SIP-counted (matched) volume » correspond au volume comptabilisé dans le total consolidé selon les propres règles de condition du SIP ; l'ensemble d'exclusion est dérivé du dictionnaire et limité par checksum, il n'est jamais codé en dur.
  • Les statistiques de spread par mise à jour accordent un poids égal à chaque mise à jour du NBBO ; les statistiques pondérées par le temps accordent un poids à chaque cotation selon sa durée de maintien. Les deux méthodes précisent leurs exclusions.
  • Les colonnes de prix et de taille décimales sont sommées nativement et converties en floats 64-bit avant tout calcul de ratio ou de prix multiplié par la taille.
  • Les tables de ticks conservent l'historique complet sans expiration glissante ; ces résultats stockés et versionnés constituent la trace durable. État de l'entrepôt au 3 juillet 2026.

Chaque panneau ci-dessus est un objet stocké unique — comprenant le graphique, le tableau et la requête SQL. Vous pouvez ouvrir n'importe lequel d'entre eux, copier la requête et l'utiliser sur le terminal Strasmore.