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.
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.tickerSPY 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.
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.
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 > 03968 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.
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 DESCTecnologí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.
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 tickerMU 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.
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) DESCLos 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:
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_time2.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.
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.
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 tickerEl 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.
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
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_jun29Los 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
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.