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

Microestructura de mercado 29 de junio de 2026

Análisis técnico de la cinta de trades y quotes del 29 de junio de 2026. Incluye corrección de volumen por diccionario y detalles de archivos FINRA.

Este es el complemento técnico de el resumen de mercado del 29 de junio de 2026: el flujo de datos base detrás de las barras de un minuto — 156.1 millones de operaciones individuales y 505.38 millones de actualizaciones de cotizaciones NBBO en una sesión ordinaria de lunes. Cada cifra es el resultado de una consulta almacenada (expanda cualquier panel para ver el SQL exacto), y los dos hallazgos forenses del día cuentan con informes completos: una corrección de volumen que el propio diccionario de código de la cinta exige, y un archivo de proveedor que se detiene silenciosamente en la letra S.

El registro de operaciones, impresión por impresión

Primero se realiza la verificación de la sesión, nunca se asume: el calendario de días festivos de la bolsa contiene 0 filas para el 29 de junio de 2026, y el SPY registró exactamente 390 barras de un minuto dentro del horario regular — una sesión completa, de 9:30 am a 4:00 pm hora de Nueva York. Durante la jornada extendida, la cinta consolidada registró 156.1 millones de operaciones individuales.

ConsultaUn día de trades: sesión y tamaño de cada print
El SQL exacto detrás de cada cifra
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 todas las impresiones fueron lotes impares —operaciones de menos de cien acciones— pero solo movieron el 8.79% de las acciones brutas —el total sin corregir que la sección de forense de volumen detalla abajo—. La impresión mediana fue de 21 acciones, medida con una sonda de corchete de autoverificación —conteos acumulados de diecinueve a veintitrés acciones— que devuelve 0 si el corchete falla, y está limitada para que un error mantenga el valor anterior. 17.9 millones de impresiones fueron de exactamente una acción y 4.73% presentaron tamaños fraccionarios —un patrón consistente con las aplicaciones minoristas que impactan la cinta una fracción a la vez, con market makers tomando la contraparte.

Forense de volumen: derivando el "matched volume" desde el diccionario

Suma el campo de tamaño de cada print y el 29 de junio muestra 24.79 billones de acciones negociadas. Esa cifra es incorrecta, y la propia cinta lo indica. Cada print incluye códigos de condición, y el SIP —el Securities Information Processor que consolida cada mercado en un solo flujo— publica un diccionario que establece, código por código, si un print actualiza el volumen consolidado. Algunos mensajes son retransmisiones administrativas de volumen ya contabilizado. En lugar de programar una lista de códigos "conocidos", este post deriva el conjunto de exclusión desde el propio diccionario:

ConsultaSet de exclusión, derivado del diccionario de códigos del tape (una fila)
El SQL exacto detrás de cada cifra
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 condiciones de venta tienen updates_volume = false en el feed consolidado: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Aquí está la lección aprendida: un borrador anterior del resumen diario incluía de forma fija los códigos 15 y 16 —los dos mensajes oficiales de apertura/cierre que menciona cualquier guía de datos— y omitió por completo el código 38. El diccionario, y no una lista de códigos memorizada, es la fuente de verdad.

El uso de dos bloques es deliberado: una subconsulta escalar sobre el diccionario dentro de un escaneo de 156.1 millones de filas supera nuestro límite de 30 segundos. Por ello, el bloque superior deriva el conjunto como una sola fila —con límites de control basados en el conteo de códigos y un checksum de id (69)— y el bloque inferior aplica los literales derivados. Si el diccionario cambia, el límite del checksum marca este post para revisión; los literales nunca quedarán obsoletos de forma silenciosa.

ConsultaVolumen bruto vs. volumen SIP, aplicando el set de exclusión derivado
El SQL exacto detrás de cada cifra
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'

La contabilidad corregida: 24.79 billones de acciones brutas, 20.66 billones contados por el SIP, 4.13 billones excluidos en 91175 prints administrativos. Una definición, expuesta con precisión: "matched volume" significa el volumen que las propias reglas de condición del SIP contabilizan para el total consolidado; nada más. No estamos juzgando qué operaciones fueron económicamente significativas; estamos aplicando la contabilidad de la propia cinta.

Los prints más grandes, decodificados

Los prints más grandes del día son donde los códigos de condición dejan de ser datos irrelevantes:

ConsultaLos largest prints del 29 de junio (sin códigos excluidos por diccionario)
El SQL exacto detrás de cada cifra
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

Lea las primeras filas como un ejemplo práctico. El print más grande del día — 61.69 millones de CAG (Conagra) a $13.98, aproximadamente $862.5 millones, registrado a las 16:04:53 ET bajo los códigos 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — es el resultado de la subasta de cierre de la NYSE publicado después de las 4:00 pm. Se contabiliza en el volumen exactamente una vez. Esas mismas 61.69 millones de acciones reaparecen bajo el código 15, Market Center Official Close: un reporte duplicado que el diccionario excluye, parte de los 4.13 mil millones eliminados arriba. Esa fila con código 15 se elimina de la tabla anterior por diseño, por lo que su registro recibe su propio panel económico de una sola fila:

ConsultaEl recibo: CAG auction de cierre y su re-reporte con código-15, comparados
El SQL exacto detrás de cada cifra
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'

El mayor de los 6 mensajes de cierre oficial de CAG tiene 61.69 millones de acciones — exactamente las 61.69 millones de la subasta (diferencia: 0) — registrados a las 16:04:53 ET desde el id de la bolsa 10, NYSE en el directorio de acciones: el mercado de cotización restatando su propia subasta.

Las otras CAG filas son de una naturaleza distinta: el print de 15.17 millones de acciones bajo los códigos 12, 2 (12 Form T / extended hours, 2 Average Price Trade) y dos más bajo el código 12 son prints posteriores a la subasta reportados a través de FINRA cuyos códigos de condición tienen updates_volume = true. El SIP los cuenta como prints reales, al igual que nuestra cifra emparejada.

En otros puntos, el código 9 marca los cruces de cierre de Nasdaq — el cruce de $3389.5 millones de NVDA es el print más grande de la tabla en dólares — y los códigos en el print SNAP (53, 41) incluyen el 53, un Qualified Contingent Trade.

El reloj: diez minutos dominan la jornada

En resolución de un minuto, la cinta de negociación se concentra casi totalmente en los extremos de la sesión:

ConsultaLos diez minutos con mayor actividad del tape (millones de prints)
El SQL exacto detrás de cada cifra
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

El minuto 15:59 ET registró 3.98 millones de operaciones —más de sesenta mil por segundo. Determinar si el resto de los diez principales se concentra en la apertura y el cierre es una medición de una sola fila:

ConsultaCuántos de los diez minutos más activos ocurren fuera del open y el close
El SQL exacto detrás de cada cifra
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 de los diez se encuentran dentro de los diez minutos de apertura o los diez minutos finales antes del cierre. La única excepción —10:15 ET, con un pico de 0.88 millones de registros— es una anomalía real de media mañana; su causa es desconocida según estos datos y no la inventaremos. La misma hora se repite más abajo.

El flujo de cotizaciones: quinientos millones de actualizaciones

El National Best Bid and Offer —el mejor precio de compra y venta en todas las bolsas, que se republica cada vez que alguno cambia— registró 505.38 millones de actualizaciones el 29 de junio, frente a 156.1 millones de operaciones.

ConsultaTodo el stream NBBO en una fila — QQQ y NVDA destacados
El SQL exacto detrás de cada cifra
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'

Los productos de índice dominan las cotizaciones: solo el QQQ registró 5.23 millones de actualizaciones frente a 1.8 millones de NVDA, la acción individual con más cotizaciones en nuestro análisis —0.67 millones de actualizaciones por encima del siguiente valor individual. Un censo completo por ticker de todas las cotizaciones no cabe en el límite de 30 segundos, por lo que la tabla de posiciones a continuación es un conjunto verificado y no un ranking exhaustivo:

ConsultaActualizaciones de quotes NBBO para ocho tickers con alta cotización (millones)
El SQL exacto detrás de cada cifra
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 lideró el conjunto verificado con 5.23 millones de actualizaciones; la parte superior de la tabla está compuesta por fondos de índice y sus variantes apalancadas, no por acciones de consumo masivo.

SPY bajo el microscopio: recibos de nanosegundos y el spread en dos direcciones

ConsultaSPY bajo el microscopio: gaps de nanosegundos, el spread en dos vías, calidad de quote
El SQL exacto detrás de cada cifra
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

La cotización de SPY cambió 3.98 millones de veces solo durante el horario regular. Su segundo más activo —10:15:43 ET, dentro del minuto 10:15 señalado anteriormente— registró 1461 actualizaciones. El intervalo más corto entre actualizaciones consecutivas fue de 1375 nanosegundos, la mediana de 245.6 microsegundos, y 75138 pares consecutivos presentaron marcas de tiempo idénticas en nanosegundos; ni siquiera la resolución de nanosegundos puede ordenar completamente la cinta moderna.

Esos nanosegundos sirven para medir el bid-ask spread. Si se cuenta cada actualización por igual, el spread promedio de SPY fue de 2.72 centavos; si se pondera cada cotización según su duración, fue de 2.34 centavos. La cifra por actualización es mecánicamente 0.38 centavos más amplia: las actualizaciones se concentran precisamente en los momentos en que el spread es amplio y volátil, mientras que una orden en reposo se mide en tiempo cronológico. Siempre que vea una estadística de spread, pregunte qué reloj la midió. El censo es público, no oculto: 1544 actualizaciones en horario regular estuvieron momentáneamente cruzadas (el ask por debajo del bid, una intercalación de cotizaciones de diferentes centros de negociación) y 0 presentaron un bid o un ask en cero; las estadísticas de spread excluyen ambos casos y cuentan lo que excluyen.

El spread tiene un horario

Agrupar el spread cotizado de SPY en intervalos de media hora convierte la microestructura en una curva útil para cualquier trader:

ConsultaSpread mediano cotizado de SPY por media hora, 4:00 am a 8:00 pm ET
El SQL exacto detrás de cada cifra
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

Una mediana de 8 centavos en el bucket de premarket de las 04:00 ET, 3 centavos en el bucket de apertura de las 09:30 y 2 centavos para las 14:00 — operar la misma acción al inicio del premarket cuesta aproximadamente cuatro veces el spread de una orden a primera hora de la tarde. El spread no es constante; es un cronograma.

Evidencia forense: el archivo que se detuvo en la S

Cada archivo diario de proveedores pasa por una prueba de integridad antes de que publiquemos una cifra basada en él: contamos los tickers, verificamos el rango alfabético y comparamos con los archivos anteriores. El archivo de volumen de ventas en corto fuera de bolsa de FINRA del 29 de junio es el ejemplo de por qué esto es necesario:

ConsultaPrueba de integridad: cobertura del archivo de short-volume de FINRA, 26-30 de junio
El SQL exacto detrás de cada cifra
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

El archivo del 26 de junio cubre 15052 tickers, desde A hasta ZYME. El archivo del 29 de junio cubre 5489, desde A hasta SSUS — simplemente se detiene a mitad de los nombres que empiezan con S. Todos los tickers alfabéticamente posteriores a ese punto —incluyendo TSLA, con 0 filas para el 29 de junio frente a 1 el 26 de junio— faltan; para el 30 de junio, el archivo vuelve a tener 15362 tickers. Una prueba de integridad no es más que este recibo de una fila por día: la diferencia entre publicar una estadística y publicar un error de datos.

Con esa aclaración incluida —y solo con ella— aquí está la proporción: el volumen de ventas en corto marcado representa el 45.85% del volumen reportado fuera de bolsa el 29 de junio, frente al 46.89% el 26 de junio y el 48.82% el 30 de junio. La cifra del 29 de junio solo cubre el segmento de la A a la S, por lo que debe tratarse como una lectura parcial. Un volumen de ventas en corto cercano a la mitad es el nivel habitual que muestran todas las sesiones adyacentes —y el volumen de ventas en corto diario no es short interest.

Notas de datos

Notas completas de datos
  • El periodo de baja actividad de cotizaciones de las 5-6 p.m. El flujo de cotizaciones de SPY casi se detiene en la media hora de 17:00 ET (233) y se reactiva para las 18:00 (40608); es un patrón de sesión/feed entre tickers, no falta de datos.
  • Las acciones fraccionarias son comunes. El 4.73% de las transacciones tiene tamaños no enteros; el volumen debe sumarse usando decimales.
  • El diccionario de códigos reutiliza ids entre tipos. El id 15 es tanto una condición de venta (Market Center Official Close) como una condición de cotización (Closed); cada consulta de diccionario aquí filtra asset_class = 'stocks' AND type = 'sale_condition'. Una búsqueda simple por id etiqueta erróneamente los códigos.
  • Las exclusiones por calidad de cotización se cuentan de forma integrada. Los conteos de órdenes cruzadas y de bid-ask en cero se encuentran en el panel microscópico de SPY arriba; ninguna estadística de spread oculta sus caídas.
  • Los escaneos de cinta completa son paneles solo por lotes. Los bloques de todo el mercado aquí medidos duran aproximadamente hasta 30 segundos cada uno en un caché frío (un bloque con tiempo agotado se reintenta una vez; la pasada con caché activo supera el límite); se ejecutan una vez al momento de la autoría a través de la ruta de solo lectura restringida, nunca en vivo para los lectores, y los resultados almacenados son el registro.

Metodología

  • Las marcas de tiempo se almacenan en UTC y se filtran con límites UTC brutos (el horario regular del 29 de junio es de 13:30 a 20:00 UTC); toTimeZone solo aparece en las listas SELECT.
  • El tipo de sesión se verifica contra el calendario de días festivos y la ventana regular observada de 390 barras; nunca se asume.
  • El "volumen contado por SIP (coincidente)" es el volumen que las reglas de condición del propio SIP cuentan para el total consolidado; el conjunto de exclusión se deriva del diccionario y tiene límites de checksum, nunca está codificado de forma fija.
  • Las estadísticas de spread por actualización ponderan cada actualización del NBBO por igual; las estadísticas ponderadas por tiempo ponderan cada cotización según su duración. Ambas detallan sus exclusiones.
  • Las columnas decimales de precio/tamaño se suman de forma nativa y se convierten a floats de 64 bits antes de cualquier aritmética de ratio o precio por tamaño.
  • Las tablas de ticks conservan el historial completo sin vencimiento rotativo; estos resultados almacenados y versionados son el registro duradero. Estado del almacén al 3 de julio de 2026.

Cada panel anterior es un objeto almacenado: gráfico, tabla y SQL integrados. Abra cualquiera de ellos, copie la consulta y profundice en la terminal de Strasmore.