Strasmore Research
Resúmenes de mercado Matt ConnorPor Matt Connor · Actualizado 2026-07-23

Resumen de mercado 29 de junio de 2026

Análisis del 29 de junio de 2026: ganancias en índices por crecimiento, spread sectorial de cuatro puntos, movimientos en acciones de memoria y datos de 0DTE.

El lunes 29 de junio de 2026 fue una jornada alcista impulsada por el crecimiento con un grupo de liderazgo reducido: QQQ ganó 2.57%, SPY 1.62%, y nombres líquidos 3968 subieron frente a declinistas 2327; sin embargo, casi la mitad de las canastas sectoriales cerraron en rojo. Cada cifra se lee de una consulta almacenada; expanda cualquier panel para ver el SQL. La capa tick-by-tick de la misma sesión: el análisis profundo de la microestructura del 29 de junio.

El marcador

Cada cambio compara el último minuto de la sesión regular del 29 de junio con el del viernes 26 de junio.

ConsultaSPY / QQQ / DIA / IWM — 29 de junio vs. cierre del 26 de junio, horario regular
El SQL exacto detrás de cada cifra
WITH friday AS (
    SELECT ticker, argMax(close, window_start) AS friday_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00'
    GROUP BY ticker
),
monday AS (
    SELECT ticker,
           argMin(open, window_start) AS monday_open,
           argMax(close, window_start) AS monday_close,
           max(high) AS day_high,
           min(low) AS day_low,
           round(toFloat64(sum(volume)) / 1e6, 1) AS shares_traded_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
)
SELECT
    m.ticker AS ticker,
    toFloat64(f.friday_close) AS jun26_close,
    toFloat64(m.monday_open) AS jun29_open,
    toFloat64(m.monday_close) AS jun29_close,
    round((toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) * 100, 2) AS pct_change,
    round(100 * (toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) / max(toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) OVER (), 1) AS pct_of_best_change,
    toFloat64(m.day_high) AS day_high,
    toFloat64(m.day_low) AS day_low,
    m.shares_traded_m AS shares_traded_m
FROM monday m
JOIN friday f ON m.ticker = f.ticker
ORDER BY m.ticker

SPY abrió a $736.525 frente al cierre de $729.09 del viernes y terminó a $740.88, por debajo de su máximo de $741.56. El +2.57% de QQQ frente al +0.81% de DIA marca un día de crecimiento y tecnología; el small-cap IWM sumó un 0.45%.

¿Fue un día inusual?

Un movimiento porcentual tiene poco valor sin un punto de referencia. Este panel compara el 29 de junio con el mes anterior según el tamaño absoluto del cierre sobre el cierre anterior.

ConsultaQQQ y SPY: 29 de junio frente al mes de sesiones anterior (rank 1 = mayor movimiento absoluto)
El SQL exacto detrás de cada cifra
SELECT
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-06-29'))) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ') AS qqq_sessions_compared,
    round(max(if(ticker = 'QQQ', abs(cc_pct), 0)), 2) AS qqq_biggest_move_of_month_pct,
    countIf(ticker = 'QQQ' AND cc_pct > 0) AS qqq_up_sessions,
    round(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'SPY' AND d != toDate('2026-06-29'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_open_to_close_pct,
    concat(monthName(min(d)), ' ', toString(toDayOfMonth(min(d))), ', ', toString(toYear(min(d)))) AS first_session
FROM (
    SELECT ticker, d,
           (close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct,
           oc_pct
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS close_px,
               (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'QQQ')
          AND window_start >= toDateTime('2026-05-28 00:00:00')
          AND window_start < toDateTime('2026-06-30 00:00:00')
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker, d
    )
)
WHERE isFinite(cc_pct)

Grande, pero no un récord: el movimiento del 2.57% de QQQ ocupa el puesto 5 de las sesiones del 21 desde May 29, 2026, en un mes cuyo mayor movimiento individual fue de 4.76%; el 1.62% de SPY ocupa el puesto 4 de 21. El origen del movimiento es relevante: el avance de SPY de apertura a cierre fue de solo 0.59%, por lo que la mayor parte de la ganancia ocurrió en el gap nocturno, antes de que se registrara una sola vela en horario regular. QQQ cerró al alza en el 10 de esas sesiones: un mes de resultados divididos.

Amplitud: ¿qué tan amplio fue el rally?

Un valor alcista es un ticker cuyo cierre del lunes superó al del viernes, entre aquellos con un volumen de negociación de al menos un millón de dólares; este filtro descarta el 5,108 del 11,475 de los tickers con doble sesión.

ConsultaAvances vs. caídas entre tickers con al menos $1M negociado el 29 de junio
El SQL exacto detrás de cada cifra
WITH per_ticker AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') AS monday_dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE (window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
       OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
    GROUP BY ticker
)
SELECT
    countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000) AS advancers,
    countIf(monday_close < friday_close AND monday_dollar_volume >= 1000000) AS decliners,
    countIf(monday_close = friday_close AND monday_dollar_volume >= 1000000) AS unchanged,
    countIf(monday_dollar_volume >= 1000000) AS liquid_tickers,
    count() AS tickers_traded_both_sessions,
    reverse(arrayStringConcat(extractAll(reverse(toString(count())), '[0-9]{1,3}'), ',')) AS tickers_traded_both_sessions_label,
    count() - countIf(monday_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
    reverse(arrayStringConcat(extractAll(reverse(toString(count() - countIf(monday_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS dropped_by_liquidity_filter_label,
    round(100.0 * countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000)
        / countIf(monday_dollar_volume >= 1000000), 1) AS advancer_pct
FROM per_ticker
WHERE friday_close > 0 AND monday_close > 0

3968 alcistas, 2327 bajistas, 72 sin cambios: el 62.3% de la cinta líquida subió — contabilizado nombre por nombre, una jornada de amplia amplitud.

Sector por sector: el rally fue más limitado de lo que parecía

Contar el número de acciones es una perspectiva; ponderarlas por el tamaño de la empresa es otra. Los once ETF de sectores de SPDR representan la segunda opción: una canasta por sector del S&P 500 ponderada por capitalización de mercado. Estos muestran una diferencia marcada respecto al conteo de amplitud.

ConsultaLos once baskets sectoriales: 29 de junio vs. cierre del 26 de junio, horario regular
El SQL exacto detrás de cada cifra
WITH per_etf AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') / 1e6, 0) AS dollar_volume_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    sector,
    ticker,
    round((monday_close / friday_close - 1) * 100, 2) AS pct_change,
    round((day_high / day_low - 1) * 100, 2) AS range_pct,
    dollar_volume_m,
    round((monday_close / friday_close - 1) * 100 - min((monday_close / friday_close - 1) * 100) OVER (), 2) AS pct_above_worst_sector
FROM (
    SELECT *,
        multiIf(ticker = 'XLB', 'Materials',
                ticker = 'XLC', 'Communication services',
                ticker = 'XLE', 'Energy',
                ticker = 'XLF', 'Financials',
                ticker = 'XLI', 'Industrials',
                ticker = 'XLK', 'Technology',
                ticker = 'XLP', 'Consumer staples',
                ticker = 'XLRE', 'Real estate',
                ticker = 'XLU', 'Utilities',
                ticker = 'XLV', 'Health care',
                'Consumer discretionary') AS sector
    FROM per_etf
)
ORDER BY pct_change DESC

Tecnología lideró con 2.52%, seguido por consumo discrecional con 2.37%; materiales cerró en -1.82% y bienes raíces en -0.64%. La diferencia entre el mejor y el peor —la dispersión sectorial del día— fue de 4.34 puntos porcentuales, con servicios públicos, consumo básico, energía, bienes raíces y materiales en rojo en un día en que el índice subió. Amplio por número de acciones, limitado por ponderación: esto es lo que la ganancia de un fondo indexado puede ocultar.

Lo más destacado del día: memoria y almacenamiento

Cuatro nombres operaron bajo la misma temática con resultados muy distintos; solo hubo movimiento conjunto y magnitud; los datos no explican la causa.

ConsultaNombres de memory/storage: cambio vs. cierre del viernes y rango intradía
El SQL exacto detrás de cada cifra
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-06-29 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-29 00:00:00') AS high_bar
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(friday_close, 2) AS jun26_close,
    round(monday_close, 2) AS jun29_close,
    round((monday_close / friday_close - 1) * 100, 2) AS pct_chg,
    round(day_high, 2) AS day_high,
    formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
    round(day_low, 2) AS day_low,
    formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
    round((day_high / day_low - 1) * 100, 2) AS range_pct
FROM per_name
ORDER BY ticker

MU es el caso típico de rango frente a cambio neto: un rango intradía de 12.22% —un mínimo de $1023.65 a las 10:18 ET y un máximo de $1148.79 a las 15:59— pero un cierre 1.97% por encima del viernes. Western Digital subió un 11.15% y Seagate un 8.17%; SanDisk cerró un -1.9% dentro de un rango de 10.33%, siendo el único cierre a la baja del grupo. El cierre oculta la volatilidad que experimentaron los accionistas.

Dónde se negoció el dinero

Por volumen de dólares negociados, Micron (MU) superó a todo lo demás, incluidos los fondos indexados: $58.47 mil millones frente a los $33.97 mil millones de SPY. Por número de acciones, el panorama fue distinto.

ConsultaLíderes de volumen de dos formas: top 6 por dólares negociados, top 4 por acciones negociadas
El SQL exacto detrás de cada cifra
SELECT ticker, leaderboard, dollar_volume_bn, if(dollar_volume_bn < 1, dollar_volume_m, NULL) AS dollar_value_m, shares_m,
    round(100 * if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)
        / max(if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)) OVER (PARTITION BY leaderboard), 1) AS pct_of_board_leader
FROM (
    SELECT
        'by dollars traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
    ORDER BY dollar_volume_bn DESC
    LIMIT 6
    UNION ALL
    SELECT
        'by shares traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESC

Los tableros de conteo de acciones pueden ser engañosos: los líderes en volumen de acciones fueron SOXS, un ETF inverso apalancado 3x (695.3 millones de acciones), e INLF, una penny stock cuyas 353.8 millones de acciones valieron aproximadamente $23 millones durante todo el día. El volumen en dólares muestra hacia dónde se movió el dinero; el volumen relativo muestra si la actividad de un ticker es inusual para sí mismo.

En periodos de 30 minutos en Nueva York, el 29 de junio muestra la clásica "sonrisa" de volumen:

ConsultaAcciones negociadas por bucket de 30 minutos, horario regular (billions)
El SQL exacto detrás de cada cifra
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(sum(toFloat64(volume)) / 1e9, 2) AS shares_bn,
    round(100 * sum(toFloat64(volume)) / max(sum(toFloat64(volume))) OVER (), 1) AS pct_of_biggest_bucket,
    round(100 * (sum(toFloat64(volume)) / min(sum(toFloat64(volume))) OVER () - 1), 1) AS pct_above_trough
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY et_time
ORDER BY et_time

2.3 mil millones de acciones en la primera media hora, un valle de 0.77 mil millones a las 13:30, y el bloque más grande —2.39 mil millones— en la última media hora, donde se concentran las subastas de cierre y los flujos de seguimiento de índices.

El registro de opciones

Se negociaron 66.33 millones de contratos en 11.04 millones de operaciones.

ConsultaUna fila para todo el día de opciones: volumen, 0DTE, semana ajustada por feriado
El SQL exacto detrás de cada cifra
WITH
    (
        SELECT (any(underlying_symbol), any(toFloat64(strike_price)), any(option_type),
                any(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))),
                sum(size), count(), round(avg(toFloat64(price)), 3))
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
        GROUP BY ticker
        ORDER BY sum(size) DESC
        LIMIT 1
    ) AS top_contract,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS spy_regular_close
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    round(100.0 * sumIf(size, option_type = 'C') / sum(size), 1) AS call_pct_of_volume,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260629') / sum(size), 1) AS same_day_expiry_pct,
    round(toFloat64(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260702')) / 1e6, 2) AS thu_jul2_expiry_contracts_m,
    countIf(substring(ticker, length(ticker) - 14, 6) = '260703') AS fri_jul3_expiry_prints,
    countIf(sip_timestamp < '2026-06-29 13:30:00') AS premarket_prints,
    reverse(arrayStringConcat(extractAll(reverse(toString(countIf(sip_timestamp < '2026-06-29 13:30:00'))), '[0-9]{1,3}'), ',')) AS premarket_prints_label,
    countIf(sip_timestamp < '2026-06-29 13:30:00'
        AND underlying_symbol NOT IN ('SPX', 'SPXW', 'XSP', 'RUTW', 'VIX', 'VIXW')) AS premarket_non_index_prints,
    arrayStringConcat(arraySort(groupUniqArrayIf(underlying_symbol, sip_timestamp < '2026-06-29 13:30:00')), ', ') AS premarket_underlyings,
    round(toFloat64(sumIf(size, underlying_symbol = 'SPY')) / 1e6, 2) AS spy_contracts_m,
    round(toFloat64(sumIf(size, underlying_symbol = 'QQQ')) / 1e6, 2) AS qqq_contracts_m,
    top_contract.1 AS top_contract_underlying,
    top_contract.2 AS top_contract_strike,
    top_contract.3 AS top_contract_type,
    top_contract.4 AS top_contract_expiry,
    top_contract.5 AS top_contract_volume,
    reverse(arrayStringConcat(extractAll(reverse(toString(assumeNotNull(top_contract.5))), '[0-9]{1,3}'), ',')) AS top_contract_volume_label,
    round(top_contract.7, 3) AS top_contract_avg_price,
    round(top_contract.2 - spy_regular_close, 2) AS top_strike_minus_spy_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

Las calls representaron el 55.7% del volumen de contratos, y el 35.8% de todo lo negociado venció ese mismo lunes — la parte sobre las opciones de vencimiento en el mismo día (0DTE). El contrato individual con mayor actividad fue la call de SPY con strike de $741: 788,133 contratos con una prima promedio de $0.474, con el cierre de SPY situándose 0.12 dólares por debajo del strike; la opción más negociada del día terminó fuera del dinero (out of the money). SPY negoció 12.01 millones de contratos como subyacente; QQQ 7.32 millones.

El panel también registra 40,621 operaciones de opciones antes de la apertura de acciones a las 9:30 — todas en un índice con liquidación en efectivo (RUTW, SPX, SPXW, VIX, VIXW, XSP), con 0 operaciones de opciones sobre acciones o ETF en ese mismo periodo. Esto es una regla, no un accidente: las opciones sobre índices extienden sus sesiones de negociación global, mientras que las opciones sobre acciones y ETF abren con el mercado de valores. Las acciones operan temprano — ver negociación premarket y after-hours — sus opciones no.

Ningún contrato con código de vencimiento para el viernes 3 de julio registró operaciones durante el día (0 operaciones) — el mercado estará cerrado ese viernes — mientras que el vencimiento del jueves 2 de julio negoció 10.73 millones.

La cinta de cotizaciones: el costo de operar durante el día

Cada precio en esta página proviene de un flujo de cotizaciones: el National Best Bid and Offer, que se republica continuamente para cada activo listado. La diferencia entre la mejor oferta de compra y la mejor oferta de venta, el bid-ask spread, es lo que paga una orden para ejecutarse.

ConsultaCosto de cruzar el spread: actualizaciones de NBBO y ancho cotizado mediano, horario regular
El SQL exacto detrás de cada cifra
SELECT
    ticker,
    round(count() / 1e6, 2) AS nbbo_updates_m,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00'), 2) AS open_30min_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS midday_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00')
        - quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS open_minus_midday_bps,
    countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid_quotes
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'MU', 'WDC')
  AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY ticker

El ancho medio de cotización de SPY fue de 0.41 puntos básicos de su precio medio, frente a 0.84 para QQQ, 4.6 para Micron y 8.2 para Western Digital, siendo este último el más amplio de los cuatro. Un punto básico de una orden de $10,000 es un dólar, por lo que comprar y vender instantáneamente $10,000 de SPY a la cotización cuesta aproximadamente $0.41; el mismo viaje de ida y vuelta en Western Digital cuesta $8.2. El tamaño de la operación no cambió; lo que cambió fue el activo.

Los cuatro cotizaron con un spread más amplio en la primera media hora que en el periodo de control del mediodía: SPY 0.41 bps frente a 0.27, Western Digital 14.33 frente a 7.55, lo que representa una prima de apertura de 6.78 bps en el activo con mayor spread. El volumen de transacciones es la otra mitad: 3.98 millones de actualizaciones de NBBO en SPY durante el horario regular y 4.42 millones en QQQ.

Tasas: la curva apenas se movió

Los bonos del Tesoro tuvieron un lunes tranquilo. Los rendimientos corresponden a los cierres diarios, comparados con el 26 de junio.

ConsultaLa curva del Treasury, cierre del 29 de junio vs. 26 de junio (solo vencimientos con datos)
El SQL exacto detrás de cada cifra
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jun29_yield_pct,
    round((t.2 - t.3) * 100) AS one_day_change_bp
FROM (
    SELECT arrayJoin([
        ('1 month',  toFloat64(mon.yield_1_month),  toFloat64(fri.yield_1_month)),
        ('3 month',  toFloat64(mon.yield_3_month),  toFloat64(fri.yield_3_month)),
        ('1 year',   toFloat64(mon.yield_1_year),   toFloat64(fri.yield_1_year)),
        ('2 year',   toFloat64(mon.yield_2_year),   toFloat64(fri.yield_2_year)),
        ('5 year',   toFloat64(mon.yield_5_year),   toFloat64(fri.yield_5_year)),
        ('10 year',  toFloat64(mon.yield_10_year),  toFloat64(fri.yield_10_year)),
        ('30 year',  toFloat64(mon.yield_30_year),  toFloat64(fri.yield_30_year)),
        ('2s10s spread', toFloat64(mon.yield_10_year - mon.yield_2_year), toFloat64(fri.yield_10_year - fri.yield_2_year))
    ]) AS t
    FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-29') AS mon,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-26') AS fri
)

El bono a 10 años cerró en 4.38%, sin cambios en el día (0 bp), mientras que la letra a 3 meses sumó 4 bp para situarse en 3.87%. El 2s10s spread —el bono a 10 años menos el de 2 años— cerró en 0.28 puntos porcentuales (-3 bp): sigue siendo positivo, aunque ligeramente más plano.

El calendario detrás de la jornada

ConsultaCalendario corporativo y flujo de información del 29 de junio, en una fila
El SQL exacto detrás de cada cifra
WITH
    (
        SELECT (argMax(d, n), max(n))
        FROM (
            SELECT ex_dividend_date AS d, count() AS n
            FROM global_markets.stocks_dividends
            WHERE ex_dividend_date BETWEEN '2026-06-22' AND '2026-07-02'
            GROUP BY d
        )
    ) AS peak_ex_div,
    (
        SELECT (countIf(form_type = '424B2'), countIf(form_type = '4'), countIf(form_type = '8-K'), count())
        FROM global_markets.stocks_sec_edgar_index
        WHERE filing_date = '2026-06-29'
    ) AS filings,
    (
        SELECT (count(), uniqExact(publisher), countIf(has(tickers, 'NVDA')))
        FROM global_markets.stocks_news
        WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
    ) AS news,
    (
        SELECT max(n)
        FROM (
            SELECT t, count() AS n
            FROM (
                SELECT arrayJoin(tickers) AS t
                FROM global_markets.stocks_news
                WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
            )
            WHERE t NOT IN ('NVDA', 'SPCX')
            GROUP BY t
        )
    ) AS runner_up_articles,
    (
        SELECT (any(split_from), any(split_to), count())
        FROM global_markets.stocks_splits
        WHERE ticker = 'HON' AND execution_date = '2026-06-29'
    ) AS hon_split,
    (
        SELECT (
            round(toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')), 2),
            round(toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'HON'
          AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
            OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    ) AS hon_close
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29') AS ex_dividend_records_jun29,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29'
        AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
                       'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
                       'SPY', 'QQQ', 'DIA', 'IWM', 'VTI')) AS household_name_ex_dividends,
    length(['AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
            'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
            'SPY', 'QQQ', 'DIA', 'IWM', 'VTI']) AS household_names_checked,
    concat(monthName(peak_ex_div.1), ' ', toString(toDayOfMonth(peak_ex_div.1))) AS busiest_ex_div_day_of_window,
    peak_ex_div.2 AS busiest_ex_div_day_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-29') AS splits_executed,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-29') AS ipos_listed_jun29,
    (SELECT arrayStringConcat(groupArray(ticker), ', ') FROM (
        SELECT ticker FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-01' ORDER BY ticker
    )) AS jul1_ipo_debuts,
    filings.4 AS sec_filings,
    filings.1 AS prospectus_424b2_filings,
    filings.2 AS insider_form4_filings,
    filings.3 AS filings_8k,
    news.1 AS news_articles,
    news.2 AS news_publishers,
    news.3 AS nvda_articles,
    runner_up_articles AS next_most_covered_articles,
    news.3 - runner_up_articles AS nvda_minus_next_most_covered,
    hon_split.3 AS hon_split_records,
    hon_split.1 AS hon_split_from,
    hon_split.2 AS hon_split_to,
    hon_close.1 AS hon_close_jun26,
    hon_close.2 AS hon_close_jun29

Los registros de dividendos de 449 salieron ex-dividend el 29 de junio — debe poseer la acción antes de su fecha ex-dividend para recibir el pago — sin embargo, entre los 25 nombres familiares que revisamos, solo apareció 0. La ola de cierre de trimestre alcanzó un máximo de 745 registros el July 1. Se ejecutaron 23 splits y se listaron 0 IPOs; los debuts del miércoles (BSP, ITG, LIME) ya están programados.

La SEC registró 6173 presentaciones con fecha del 29 de junio: 1473 suplementos de precios de productos estructurados (formulario 424B2) y 1277 reportes de operaciones de insiders (Formulario 4) superan en volumen a los 231 8-Ks que suelen ser noticia. Nuestro feed de noticias incluyó 170 artículos de 3 editores; excluyendo un símbolo reutilizado con etiquetas ambiguas (eliminado de la consulta), el nombre con más cobertura fue NVDA con 14 artículos frente a los 12 del segundo lugar.

Notas de los datos

Los datos atípicos reciben una nota, nunca una exclusión silenciosa; estos cuatro afectan a las cifras principales.

  • Las canastas sectoriales son un método declarado. "Sector" se refiere a los once ETFs sectoriales de SPDR, ponderados por valor de mercado; son siempre los mismos nombres cada sesión, no una clasificación por ticker de un proveedor.
  • El volumen en dólares es un proxy por minuto — el precio de cierre multiplicado por el volumen sumado por cada barra de un minuto; es cercano, pero no idéntico, a la suma de los valores de las transacciones.
  • Los spreads cotizados excluyen cotizaciones inválidas (registros de NBBO unidireccionales o cruzados); el panel contabiliza lo que descartó (1544 en SPY). Un ancho de cotización mediano es una estadística de cotización, no un costo por transacción; las órdenes suelen ejecutarse dentro de la cotización.
  • Una sola transacción puede contaminar el máximo o el mínimo de una barra de un minuto. La barra de QQQ de las 11:07 ET tiene un mínimo de $709.58, mientras que ninguna barra circundante cayó por debajo de $715.09 — una transacción de $5.51 por debajo del mercado concurrente. Cada máximo y mínimo anterior fue verificado contra las barras adyacentes; el mínimo de sesión de QQQ de $705.172 fue validado.
Notas de datos completas
  • La cobertura de los Treasuries es más limitada que el esquema. Cuatro vencimientos anunciados (6 meses, 3, 7 y 20 años) nunca han sido poblados; la curva muestra los siete existentes, más la fila de 2s10s.
  • Un "reverse split" de Honeywell contradice la cinta. El feed contiene el registro 1 de HON con fecha del 29 de junio: un split inverso que convierte 2 acciones antiguas en 1 nuevas. HON cerró a $231.3 el viernes y a $227.71 el lunes — sin duplicación. No lo aplicamos.
  • El conteo de noticias es el feed de un proveedor, los 3 editores que manejamos — no "todas las noticias del mercado".
  • Los registros a nivel de tick — cotizaciones cruzadas, la corrección de volumen fantasma, el archivo truncado de volumen de ventas en corto de FINRA (y por qué el volumen de ventas en corto no es el interés en corto) — se encuentran en el análisis profundo.

La sesión, verificada

ConsultaSession check: span de barras de un minuto de SPY, y el cierre del viernes en el tape
El SQL exacto detrás de cada cifra
WITH
    (
        SELECT (
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') = '11:07')), 2),
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') IN ('11:04', '11:05', '11:06', '11:08', '11:09', '11:10'))), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'QQQ' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS qqq_lone
SELECT
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= '2026-07-03 00:00:00' AND window_start < '2026-07-04 00:00:00') AS jul3_spy_bars,
    formatDateTime(min(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS first_spy_bar_et,
    formatDateTime(max(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS last_spy_bar_et,
    count() AS spy_minute_bars,
    countIf(window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00') AS regular_session_bars,
    qqq_lone.1 AS qqq_1107_lone_low,
    qqq_lone.2 AS qqq_1107_adjacent_bars_low,
    round(qqq_lone.2 - qqq_lone.1, 2) AS qqq_lone_print_below_adjacent
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'

Las barras de SPY transcurren de 04:00 a 19:59 hora de Nueva York con exactamente 390 barras de ventana regular — una sesión completa, verificada mediante la cinta (el conjunto de datos del calendario de la bolsa solo contiene cierres próximos). Ese viernes 3 de julio fue un cierre completo — las barras de SPY imprimieron 0 durante todo el día, y el 4 de julio cayó en sábado; la semana de cuatro sesiones tiene su propio resumen.

Preguntas frecuentes

¿Cómo le fue al mercado de acciones el 29 de junio de 2026?

Fue un día de alzas liderado por el sector de crecimiento: QQQ cerró un 2.57% por encima del viernes, SPY 1.62%, DIA 0.81% e IWM 0.45%, con un 62.3% de los tickers con un volumen de $1m o más cerrando al alza.

¿Fue el 29 de junio de 2026 un día importante para el Nasdaq?

Importante, pero no excepcional: el movimiento de cierre sobre cierre del 2.57% de QQQ ocupó el puesto 5 de las sesiones del 21 del último mes por tamaño absoluto, frente a un máximo mensual de 4.76%.

¿Qué sectores lideraron el 29 de junio de 2026?

Tecnología (2.52%) y consumo discrecional (2.37%) lideraron las once cestas sectoriales de SPDR; materiales quedó en último lugar con un -1.82%, un spread de 4.34 puntos porcentuales. Servicios públicos, productos básicos, energía y bienes raíces también cerraron a la baja.

¿Qué proporción del volumen de opciones el 29 de junio de 2026 fue 0DTE?

Los vencimientos en el mismo día representaron el 35.8% de los 66.33 millones de contratos negociados; el contrato individual más activo, una call de SPY de $741 con vencimiento en el mismo día (788,133 contratos), terminó fuera de dinero.

¿Por qué se negocian opciones antes de la apertura del mercado de acciones?

Solo las opciones sobre índices lo hacen. Todas las 40,621 operaciones de opciones antes de las 9:30 a.m. ET del 29 de junio correspondieron a índices con liquidación en efectivo (RUTW, SPX, SPXW, VIX, VIXW, XSP), los cuales listan sesiones con horario de negociación global extendido; las operaciones de opciones de acciones y ETF en ese intervalo fueron de 0.

Metodología

  • Las marcas de tiempo se almacenan en UTC y se convierten a la hora de Nueva York dentro de las consultas. El "Close" es el último minuto de la sesión regular, no el print de la subasta; los cambios diarios comparan el 29 de junio con el 26 de junio, y la sesión se verificó según el intervalo de barras observado.
  • El ranking del mes anterior utiliza los movimientos de cierre sobre cierre en horario regular, descartando la primera sesión (sin cierre previo dentro del periodo). Los vencimientos de opciones se procesan nuevamente desde el ticker de la OCC (la columna de vencimiento de la tabla presenta errores).
  • Cada panel se lee una sola vez, al momento de la redacción, a través de la ruta de solo lectura restringida. Estado del almacén al 13 de julio de 2026.

Cada panel es el resultado de una consulta almacenada: gráfico, tabla y SQL en un solo objeto. Puede pegar cualquiera de ellos en la terminal Strasmore. Próxima sesión: 30 de junio.