Resumen de mercado 30 de junio de 2026
Análisis de la última sesión del trimestre con alzas en tecnología y el desempeño de los ETFs principales frente a un mercado mayoritariamente rojo.
El martes 30 de junio de 2026 —la última sesión del trimestre— fue un día de alzas liderado por el sector tecnológico en un mercado mayoritariamente rojo: QQQ ganó 1.63% y SPY 0.73%, pero solo el 4 de los fondos del sector S&P 10 cerraron al alza (3,349 nombres líquidos subieron, 3,033 bajaron). La sesión anterior: el resumen del 29 de junio. Cada cifra a continuación se lee de una consulta almacenada; expanda cualquier panel para ver el SQL.
El marcador
Cada cambio compara la última barra de sesión regular del 30 de junio con la del lunes 29 de junio.
El SQL exacto detrás de cada cifra
WITH prior AS (
SELECT ticker, argMax(close, window_start) AS prior_close
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
),
sess AS (
SELECT ticker,
argMin(open, window_start) AS day_open,
argMax(close, window_start) AS day_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-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
GROUP BY ticker
)
SELECT
s.ticker AS ticker,
round(toFloat64(p.prior_close), 2) AS prior_close,
round(toFloat64(s.day_open), 2) AS day_open,
round(toFloat64(s.day_close), 2) AS day_close,
round((toFloat64(s.day_close) / toFloat64(p.prior_close) - 1) * 100, 2) AS pct_change,
round(toFloat64(s.day_high), 2) AS day_high,
round(toFloat64(s.day_low), 2) AS day_low,
s.shares_traded_m AS shares_traded_m
FROM sess s
JOIN prior p ON s.ticker = p.ticker
ORDER BY s.tickerSPY abrió a $741.29 y cerró a $746.32, cerca de su máximo de $748.02. El 1.63% de QQQ frente al 0.12% de DIA define la tendencia del día: las acciones de crecimiento subieron, las blue chips apenas se movieron e IWM 0.49%.
El cierre del trimestre
El 30 de junio cerró la última de las 62 sesiones del segundo trimestre, y la tendencia del día fue un reflejo a pequeña escala de lo ocurrido en el trimestre.
El SQL exacto detrás de cada cifra
WITH q2 AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMin(toFloat64(open), window_start) AS d_open,
argMax(toFloat64(close), window_start) AS d_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
AND window_start >= toDateTime('2026-04-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
GROUP BY ticker, d
)
SELECT
ticker,
toString(min(d)) AS quarter_first_session,
count() AS quarter_sessions,
round(argMin(d_open, d), 2) AS quarter_open,
round(argMax(d_close, d), 2) AS quarter_close,
round((argMax(d_close, d) / argMin(d_open, d) - 1) * 100, 2) AS quarter_pct,
countIf(d_close > d_open) AS up_sessions
FROM q2
GROUP BY ticker
ORDER BY quarter_pct DESC, ticker ASCDel 1 de abril al cierre del 30 de junio: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08%. El QQQ lideró el trimestre y también la jornada del 30 de junio, aunque hubo un cambio en la posición relativa: el SPY superó ligeramente al IWM durante el día, pero el IWM lideró al SPY durante todo el trimestre. El QQQ cerró al alza en 38 de las 62 sesiones (el resumen del Q2 presenta el análisis detallado).
¿Fue un día inusual?
El SQL exacto detrás de cada cifra
SELECT round(anyIf(oc_pct, d = toDate('2026-06-30')), 2) AS day_move_pct,
arrayCount(x -> x > abs(anyIf(oc_pct, d = toDate('2026-06-30'))), groupArrayIf(abs(oc_pct), d != toDate('2026-06-30'))) + 1 AS abs_move_rank,
count() AS sessions_compared,
toString(min(d)) AS first_session
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
(argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-06-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
GROUP BY d
)El movimiento del SPY desde la apertura hasta el cierre —una perspectiva distinta al marcador de cierre sobre cierre— fue de 0.68%, lo que lo sitúa en el puesto 7 de 21 sesiones anteriores en términos de magnitud absoluta. El índice se mantuvo estable; la actividad en el mercado no lo estuvo.
Amplitud: una ventaja positiva estrecha
El SQL exacto detrás de cada cifra
WITH per_ticker AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') AS day_dollar_volume
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')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00')
GROUP BY ticker
)
SELECT
countIf(day_close > prior_close AND day_dollar_volume >= 1000000) AS advancers,
countIf(day_close < prior_close AND day_dollar_volume >= 1000000) AS decliners,
countIf(day_close = prior_close AND day_dollar_volume >= 1000000) AS unchanged,
countIf(day_dollar_volume >= 1000000) AS liquid_tickers,
count() AS tickers_traded_both_sessions,
count() - countIf(day_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
round(100.0 * countIf(day_close > prior_close AND day_dollar_volume >= 1000000)
/ countIf(day_dollar_volume >= 1000000), 1) AS advancer_pct,
countIf(ticker IN ('XLB', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')) AS sector_funds_counted,
countIf(ticker IN ('XLB', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
AND day_close > prior_close) AS sector_funds_up
FROM per_ticker
WHERE prior_close > 0 AND day_close > 03,349 avances, 3,033 declives, 88 sin cambios: el 51.8% de la cinta líquida subió — un resultado incierto bajo un reporte de crecimiento del índice de 1.63%. El filtro de liquidez descarta el 5,055 de los 11,525 tickers de doble sesión (con menos de un millón de dólares negociados), contabilizados aquí, nunca ocultos.
Por sector: hacia dónde se movió realmente el dinero
Contar nombres por voto individual oculta la distribución del capital. Los diez fondos a continuación poseen una parte del S&P 500, y el spread entre el mejor y el peor sector mide qué tan desigual fue la sesión.
El SQL exacto detrás de cada cifra
WITH per_name AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') / 1e9, 2) AS day_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('XLB', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
AND ((window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(prior_close, 2) AS prior_close,
round(day_close, 2) AS day_close,
round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
if(day_close > prior_close, 1, 0) AS is_up,
round(max((day_close / prior_close - 1) * 100) OVER () - (day_close / prior_close - 1) * 100, 2) AS pts_behind_leader,
day_dollar_bn
FROM per_name
ORDER BY pct_chg DESC, ticker ASCTechnology (XLK) ganó un 2.69% y destacó por sí solo: industrials 1.34%, materials 0.36% y discretionary 0.15% fueron los únicos otros sectores en verde, mientras que el resto del tablero está en rojo, desde financials (-0.17%) hasta utilities (-1.48%), staples (-1.53%) y real estate al final con un -2%. Diferencia entre el mejor y el peor: 4.69 puntos porcentuales, con un 4 de 10 fondos en verde. Un índice con una subida menor al uno por ciento y un spread de cuatro puntos: un solo sector impulsó la jornada.
Los mayores movimientos del día, en todo el mercado
La amplitud mide cuántos valores subieron; esto muestra cuáles se movieron más — los cinco mejores y peores por cambio porcentual entre los nombres con un volumen de negociación de $10 millones o más.
El SQL exacto detrás de cada cifra
WITH per_ticker AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') AS day_dollar_volume
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')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00')
GROUP BY ticker
HAVING prior_close > 1 AND day_close > 0 AND day_dollar_volume >= 10000000 AND ticker NOT IN ('SPCX')
)
SELECT
board,
ticker,
prior_close,
day_close,
pct_chg,
round(abs(pct_chg), 2) AS abs_pct_chg,
dollar_volume_m,
if(ticker IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date >= '2026-06-29' AND execution_date <= '2026-06-30'), 1, 0) AS split_record_on_file
FROM (
SELECT 'top gainers' AS board, ticker, round(prior_close, 2) AS prior_close, round(day_close, 2) AS day_close,
round((day_close / prior_close - 1) * 100, 2) AS pct_chg, round(day_dollar_volume / 1e6, 0) AS dollar_volume_m
FROM per_ticker
ORDER BY (day_close / prior_close) DESC, ticker ASC
LIMIT 5
UNION ALL
SELECT 'top decliners' AS board, ticker, round(prior_close, 2) AS prior_close, round(day_close, 2) AS day_close,
round((day_close / prior_close - 1) * 100, 2) AS pct_chg, round(day_dollar_volume / 1e6, 0) AS dollar_volume_m
FROM per_ticker
ORDER BY (day_close / prior_close) ASC, ticker ASC
LIMIT 5
)
ORDER BY if(board = 'top gainers', 0, 1) ASC, pct_chg DESC, ticker ASCNinguna de las dos bolsas se parece al índice. JEM lideró con un +256.76% con $141 millones negociados; SOC perdió un 55.89% con $306 millones. ABVX subió un 38.56% con $942 millones, el mayor turnover en ambas bolsas; NVCT cayó un 35.62% y UNCY un 39.09%. La columna de split-record mantiene la integridad de la bolsa — un reverse split de uno por diez se registra como una "ganancia" del 900% en una cinta no ajustada — y cada nombre aquí tiene un 0: transacciones reales.
Tres filas representan la misma operación dos veces: CRCA (-35.16%) y CRCG (-35.19%) cayeron mientras CRCD subió un 35.47% — cada uno cercano al doble del movimiento del -17.53% del nombre relacionado con cripto a continuación: wrappers de acciones individuales apalancados.
El hecho destacado del día: los semiconductores en el giro del trimestre
Seis nombres, un mismo tema y resultados muy distintos: solo se observa movimiento conjunto y magnitud; los datos no indican 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-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
maxIf(toFloat64(high), window_start >= '2026-06-30 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-30 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-30 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-30 00:00:00') AS high_bar,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') / 1e9, 2) AS day_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AMD', 'INTC', 'MU', 'SNDK', 'TSM', 'WDC')
AND ((window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(prior_close, 2) AS prior_close,
round(day_close, 2) AS day_close,
round((day_close / prior_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,
day_dollar_bn
FROM per_name
ORDER BY tickerSanDisk subió un 10.79%, AMD un 7.7%, Intel un 5.93% y TSMC un 4.86% — mientras que MU, con el mayor volumen de negociación de la sesión de $37.41 mil millones, cerró apenas un 0.52% arriba y Western Digital (-2.01%) no participó. Este es el componente detrás del reporte del sector tecnológico de 2.69% (MU en junio, tick por tick).
La tendencia contraria afectó a las financieras vinculadas a las criptomonedas, en contra del mercado alcista:
El SQL exacto detrás de cada cifra
WITH per_name AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
maxIf(toFloat64(high), window_start >= '2026-06-30 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-30 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-30 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-30 00:00:00') AS high_bar,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') / 1e9, 2) AS day_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('COIN', 'CRCL', 'HOOD', 'MSTR')
AND ((window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(prior_close, 2) AS prior_close,
round(day_close, 2) AS day_close,
round((day_close / prior_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,
day_dollar_bn
FROM per_name
ORDER BY tickerCRCL registró un -17.53%, alcanzando su mínimo de $62.52 a las 15:59 ET —el último minuto de la sesión— junto con MSTR -6.2%, COIN -3.61% y HOOD -1.53%. Se observó movimiento conjunto; no se afirma la causa.
Lo que reportó el feed de noticias
Un resumen que evita afirmar causas debe al lector lo que realmente se publicó ese día.
El SQL exacto detrás de cada cifra
SELECT
names.n AS ticker,
countIf(has(tickers, names.n)) AS articles_today,
if(countIf(has(tickers, names.n)) = 0, 'none',
formatDateTime(toTimeZone(argMaxIf(published_utc, (published_utc, id), has(tickers, names.n)), 'America/New_York'), '%H:%i')) AS latest_et,
if(countIf(has(tickers, names.n)) = 0, 'no article in our feed this session',
JSONExtractString(argMaxIf(publisher, (published_utc, id), has(tickers, names.n)), 'name')) AS publisher_name,
if(countIf(has(tickers, names.n)) = 0, 'no article in our feed this session',
argMaxIf(title, (published_utc, id), has(tickers, names.n))) AS latest_headline
FROM global_markets.stocks_news
CROSS JOIN (SELECT arrayJoin(['NVDA', 'MU', 'SNDK', 'CRCL', 'SOC', 'ABVX', 'JEM']) AS n) AS names
WHERE published_utc >= '2026-06-30 04:00:00' AND published_utc < '2026-07-01 04:00:00'
GROUP BY names.n
ORDER BY articles_today DESC, ticker ASCEl nombre con mayor cobertura fue NVDA con 21 artículos — sin estar entre los activos con mayor movimiento del día — su última nota de la sesión (16:28 ET, Investing.com) se tituló "These Stocks Could Benefit as the Robotaxi Race Heats Up". MU registró 7; el único artículo de SanDisk (The Motley Fool) es el único titular del día que menciona un movimiento real: "Why Sandisk Stock Is Skyrocketing Today".
El hallazgo es la brecha: el mayor declinante del día, su mayor ganador y el nombre vinculado a las cripto que más cayó registraron 0, 0 y 0 artículos — cero en cada caso, dentro de un feed de 211 piezas. La cobertura no es un indicador del price action.
Dónde se negoció el dinero
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-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
AND ticker NOT IN ('SPCX')
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-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY shares_m DESC
LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESCEn términos de dólares, MU superó a todo lo demás, incluidos los fondos indexados: $37.41 mil millones frente a los $31.84 mil millones de SPY; es la segunda sesión consecutiva en la que superó en volumen de negociación al principal fondo indexado (el resumen del lunes contiene el primero). El tablero de acciones muestra algo distinto: SOXS, un ETF inverso de semiconductores con apalancamiento de 3x (515.5 millones de acciones), y dos valores con precios inferiores al dólar cuyo valor es insignificante comparado con el de MU — el volumen se interpreta de dos formas.
Un nombre se mantiene fuera de ambos tableros deliberadamente: una salida a bolsa en junio cuyo ticker pertenecía anteriormente a una empresa distinta y no relacionada, por lo que los proveedores de datos etiquetan a dos entidades con las mismas tres letras (recibos aquí).
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
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
GROUP BY et_time
ORDER BY et_time2.05 mil millones de acciones en la primera media hora, un mínimo de 0.78 mil millones a las 13:30, y el mayor bloque del día — 2.69 mil millones — hacia un cierre de trimestre, donde la subasta de cierre y sus flujos de rebalanceo se registran (el análisis profundo del 29 de junio se detalla a continuación).
El tape de opciones
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-30 00:00:00' AND sip_timestamp < '2026-07-01 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-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
) AS spy_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) = '260630') / 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,
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,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'P'))
/ toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'C')), 2) AS spy_put_call_ratio,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'C'
AND substring(ticker, length(ticker) - 14, 6) = '260630' AND toFloat64(strike_price) > spy_close)) / 1e6, 2) AS spy_0dte_otm_calls_m,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'C'
AND substring(ticker, length(ticker) - 14, 6) = '260630' AND toFloat64(strike_price) <= spy_close)) / 1e6, 2) AS spy_0dte_itm_calls_m,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'P'
AND substring(ticker, length(ticker) - 14, 6) = '260630' AND toFloat64(strike_price) < spy_close)) / 1e6, 2) AS spy_0dte_otm_puts_m,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY' AND option_type = 'P'
AND substring(ticker, length(ticker) - 14, 6) = '260630' AND toFloat64(strike_price) >= spy_close)) / 1e6, 2) AS spy_0dte_itm_puts_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,
round(top_contract.7, 3) AS top_contract_avg_price,
round(top_contract.2 - spy_close, 2) AS top_strike_minus_spy_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-30 00:00:00' AND sip_timestamp < '2026-07-01 00:00:00'Se negociaron 61.95 millones de contratos de opciones en 10.06 millones de operaciones; las calls representaron el 57.3% del volumen total, y el 28% de este venció ese martes. El SPY mostró una tendencia opuesta: 12.04 millones de contratos con un put/call ratio de 1.09 —más puts que calls, en un día en que el fondo subió.
Al comparar los vencimientos del mismo día del SPY con su cierre de $746.32, el skew se vuelve evidente: 3.33 millones de puts out-of-the-money (strikes por debajo del cierre) y 2.28 millones de calls out-of-the-money, frente a 1.77 millones de calls in-the-money y 0.63 millones de puts in-the-money — los strikes con sesgo bajista que vencieron sin valor fueron el grupo más activo en la jornada 0DTE del SPY. No hubo operaciones para ningún contrato con código de vencimiento viernes 3 de julio (0 operaciones — el mercado está cerrado ese viernes); la weekly del jueves registró 10.52 millones.
El SQL exacto detrás de cada cifra
SELECT
concat(underlying, ' $', toString(strike), ' ', if(typ = 'C', 'call', 'put')) AS contract,
toString(expiry) AS expires,
formatDateTimeInJodaSyntax(expiry, 'MMMM d, yyyy') AS expires_label,
if(expiry = toDate('2026-06-30'), 1, 0) AS is_same_day,
contracts,
round(avg_px, 3) AS avg_premium,
round(100 * contracts / max(contracts) OVER (), 1) AS pct_of_busiest
FROM (
SELECT any(underlying_symbol) AS underlying,
any(toFloat64(strike_price)) AS strike,
any(option_type) AS typ,
any(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) AS expiry,
sum(size) AS contracts,
avg(toFloat64(price)) AS avg_px,
any(ticker) AS occ
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-30 00:00:00' AND sip_timestamp < '2026-07-01 00:00:00'
GROUP BY ticker
ORDER BY contracts DESC, occ ASC
LIMIT 6
)
ORDER BY contracts DESC, contract ASCEl contrato más negociado fue la call del SPY de $747 con vencimiento el mismo día — 821,361 contratos con una prima promedio de $0.641, cerrando $0.68 por encima de la última barra regular del SPY y sin valor. El patrón detrás de esto es la lección: cinco de los seis contratos más activos en el tape fueron strikes del SPY con vencimiento el mismo día y con un dólar de diferencia cerca del cierre (SPY $748 call siguiente), cada uno negociándose por centavos. La excepción, con el 65.1% del volumen del líder, fue KWEB $29 call venciendo el December 18, 2026, que no era un contrato de un día: una posición a seis meses entre cinco boletos de lotería de tarde.
Tasas: el tramo largo subió al cierre del primer semestre
El SQL exacto detrás de cada cifra
SELECT
t.1 AS curve_point,
round(t.2, 2) AS jun30_yield_pct,
round((t.2 - t.3) * 100) AS one_day_change_bp
FROM (
SELECT arrayJoin([
('1 month', toFloat64(d.yield_1_month), toFloat64(p.yield_1_month)),
('3 month', toFloat64(d.yield_3_month), toFloat64(p.yield_3_month)),
('1 year', toFloat64(d.yield_1_year), toFloat64(p.yield_1_year)),
('2 year', toFloat64(d.yield_2_year), toFloat64(p.yield_2_year)),
('5 year', toFloat64(d.yield_5_year), toFloat64(p.yield_5_year)),
('10 year', toFloat64(d.yield_10_year), toFloat64(p.yield_10_year)),
('30 year', toFloat64(d.yield_30_year), toFloat64(p.yield_30_year)),
('2s10s spread', toFloat64(d.yield_10_year - d.yield_2_year), toFloat64(p.yield_10_year - p.yield_2_year))
]) AS t
FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-30') AS d,
(SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-29') AS p
)El tramo largo aumentó en el último día del semestre: el bono a 10 años subió 6 bp hasta 4.44%, el de 2 años 4 bp hasta 4.14%, y el spread 2s10s se empinó 2 bp hasta 0.3 puntos. Los rendimientos largos subieron durante una sesión donde sus sectores más débiles, bienes raíces (-2%) y el tercero más débil, servicios públicos (-1.48%), son ambos clásicamente sensibles a las tasas: una coincidencia digna de notar, aunque no es un mecanismo que estos datos puedan probar (el resumen del H1 define la curva del semestre).
El calendario detrás de la jornada
El SQL exacto detrás de cada cifra
WITH
(
SELECT (count(), uniqExact(publisher))
FROM global_markets.stocks_news
WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-30'
) AS news,
(
SELECT (argMax(t, n), 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-30'
)
WHERE t != 'SPCX'
GROUP BY t
)
) AS top_news
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-30') AS ex_dividend_records,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-30') AS splits_executed,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-30') AS ipos_listed,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS sec_filings,
(SELECT uniqExactIf(accession_number, form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS insider_form4_filings,
(SELECT uniqExactIf(accession_number, form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS filings_8k,
(SELECT arrayStringConcat(groupArray(concat(ticker, ' — ', issuer_name)), '; ') FROM (
SELECT ticker, issuer_name FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-30' ORDER BY ticker
)) AS ipo_names,
news.1 AS news_articles,
news.2 AS news_publishers,
top_news.1 AS most_covered_ticker,
top_news.2 AS most_covered_articles,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-29')) AS filings_prior_session704 registros de dividendos pasaron a fecha ex-dividend el último día del trimestre — una ola de cierre de trimestre, dado que la mayoría de las empresas de EE. UU. pagan trimestralmente — con 7 splits y 2 nuevas cotizaciones (AACU — Ares Acquisition Corp III; OSPRU — Osprey Acquisition Corp. III). La columna de presentaciones es el dato principal de calidad: el índice de la SEC contiene 31 presentaciones para el 30 de junio — 0 insider Form 4s, 0 8-Ks — frente a 4439 de la sesión anterior. Existe un patrón de fin de mes en el feed, identificado en la nota sobre el gap de fin de mes; cualquier conteo que incluya este día será inferior al real hasta que se complete el registro histórico.
La sesión, verificada
El SQL exacto detrás de cada cifra
SELECT
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-30 13:30:00' AND window_start < '2026-06-30 20:00:00') AS regular_session_bars,
uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00') AS day_sessions
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-30 00:00:00' AND window_start < '2026-07-01 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 el tape (el conjunto de datos del calendario de la bolsa solo contiene cierres próximos).
Lo que representa la sesión
Un cierre de 0.73% SPY con un 51.8% de acciones al alza, un 4 de fondos del sector 10 en verde y un 4.69 de puntos de diferencia entre los mejores y peores no es un rally generalizado. Es el rally de un solo sector disfrazado de índice, con su media hora más intensa en una subasta de cierre de trimestre. El cambio de un índice es un promedio, y este fue impulsado por la tecnología mientras la mayoría de los sectores caían: analice la dispersión antes de confiar en la dirección.
Preguntas frecuentes
¿Cómo le fue al mercado de acciones el 30 de junio de 2026?
Cerró al alza: SPY ganó 0.73% y QQQ 1.63% frente al cierre del 29 de junio. La amplitud fue menor: 51.8% de los valores líquidos subieron, mientras que el 4 de los fondos sectoriales del S&P 10 cerraron en verde.
¿Qué sector lideró el mercado el 30 de junio de 2026?
Tecnología: XLK ganó 2.69%, frente al 1.34% de industriales y el -2% de bienes raíces en último lugar — una diferencia de 4.69 puntos entre el mejor y el peor sector.
¿Cuáles fueron las acciones con mayor movimiento el 30 de junio de 2026?
Entre los valores con un volumen de negociación de $10 millones o más, JEM fue la que más ganó (+256.76%) y SOC la que más perdió (55.89%). Ninguna registró un split: ambos son movimientos de precio reales y no artefactos de acciones corporativas.
¿Cómo le fue al mercado de acciones en el Q2 2026?
Desde la apertura del 1 de abril hasta el cierre del 30 de junio, a través de 62 sesiones: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08% — un trimestre liderado por el crecimiento, que concluyó con una jornada de crecimiento.
¿Por qué se negocia tanto volumen en la última media hora?
La media hora final registró 2.69 mil millones de acciones frente a 2.05 mil millones en la apertura. La subasta de cierre establece el precio oficial de cierre de cada acción en un solo cruce, y los fondos indexados negocian allí para igualarlo; el rebalanceo de fin de trimestre concentra el flujo.
Notas de datos y metodología
- Las canastas. El tablero sectorial incluye los diez fondos sectoriales de SPDR mencionados en su panel; es la misma canasta cada sesión, por lo que el número de dispersión permite comparaciones entre días. Los tableros de movimientos requieren un volumen de negociación de $10 millones y un cierre previo superior a $1, excluyen la lista de símbolos reutilizados mencionada arriba y cuentan con una columna de registro de splits.
- Las advertencias. El volumen en dólares es una aproximación por minuto (cierre × volumen por barra). El índice de la declaración del 30 de junio está casi vacío (la nota sobre la brecha de fin de mes lo diagnostica). El conteo de noticias proviene de una sola fuente de proveedor: la ausencia de un artículo aquí no es prueba de que no se haya publicado nada en ningún otro lugar.
- La metodología. Una sesión (1, verificada mediante barras observadas); las marcas de tiempo se almacenan en UTC y se convierten a la hora de Nueva York en las consultas; el "cierre" es la última barra regular de un minuto, no la impresión de la subasta. Los vencimientos de opciones se procesan nuevamente desde el ticker de la OCC (la columna de la propia tabla presenta errores); la probabilidad de ejercicio (moneyness) se mide con respecto a la última barra regular de SPY. Los paneles se ejecutan una vez, al momento de la autoría, a través de la ruta de solo lectura restringida. Almacenamiento actualizado al 13 de julio de 2026.
Cada panel es el resultado de una consulta almacenada: gráfico, tabla y SQL en un solo objeto. Pegue cualquiera de ellos en la terminal Strasmore. Próxima sesión: 1 de julio.