Strasmore Research
Market Recap

Resumen de mercado primer semestre 2026

Matt ConnorBy Matt Connor Updated 2026-07-23

La primera mitad de 2026 consistió en dos mercados distintos integrados: un primer trimestre en el que todos los principales ETF de índices cayeron o se mantuvieron estables, y un segundo trimestre que logró recuperarlos con creces. SPY cerró el semestre con una subida de 8.8%; QQQ subió un 18.7%; y el 21.3% de IWM fue el mejor primer semestre que este ETF de small-caps ha registrado en nuestro historial — el detalle se presenta abajo, recalculado frente a cada año anterior en una sola consulta. El mercado de tasas mostró su propia tendencia: el spread 2s10s se aplanó de 72 puntos de base a 30 durante el semestre sin llegar a invertirse. Esta página es el registro completo del semestre: el marcador, el ranking histórico, la progresión mensual, la curva de rendimientos completa por vencimiento, los once sectores, la evolución mensual del mercado de opciones y las acciones individuales más destacadas del periodo. Cada número aquí es el resultado de una consulta almacenada; puede expandir cualquier panel para ver el SQL.

El balance del semestre

ConsultaH1 2026: rendimientos de la mitad, Q1 y Q2 para los cuatro ETFs de índices — calculados en una sola consulta
El SQL exacto detrás de cada cifra
SELECT ticker,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-03-31') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-04-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS h1_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

La división de dos trimestres define la forma del semestre: SPY -5.2% y luego 14.1%; QQQ -6.9% y luego 26.5%. IWM fue el líder silencioso del semestre en 21.3%; las small caps superaron a todos los índices de large caps durante los seis meses. El detalle trimestral se encuentra en el resumen del Q2. Una nota sobre la aritmética de los semestres: el 8.8% de SPY para los seis meses es mucho menor que su Q2 por sí solo, ya que el semestre encadena una caída y una recuperación; la capitalización de -5.2% y 14.1% llega al valor indicado en la tabla, y cualquier titular sobre el "rendimiento del primer semestre" codifica silenciosamente todo ese ciclo de ida y vuelta.

La primera mitad frente a todas las demás primeras mitades

¿Es inusual una 8.8% mitad? Los paneles a continuación recalculan el MISMO rendimiento de la primera mitad —desde la apertura hasta el cierre en horario regular, de enero a junio— para cada año de historial por minuto, en una consulta por cada par de ETF con aritmética idéntica para cada año, y luego clasifican esta mitad frente al resto. La fecha más antigua del registro por minuto se verifica en la metodología detallada abajo; la primera primera mitad completa en archivo es la que mencionan los recibos.

ConsultaCada primer semestre en el tape: SPY y QQQ, recalculados idénticamente por año (se muestran conteos de sesiones por año)
El SQL exacto detrás de cada cifra
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
       ticker,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
       round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
  AND window_start >= toDateTime('2003-01-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')
  AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 100
ORDER BY y ASC, ticker ASC
ConsultaRanking de posiciones: este semestre frente a todos los anteriores (SPY y QQQ; rank 1 = mejor; excluido a sí mismo)
El SQL exacto detrás de cada cifra
SELECT ticker,
       round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
       arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
       count() AS halves_compared,
       min(y) AS first_year,
       anyIf(sessions, y = 2026) AS sessions_2026
FROM (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
           ticker,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ')
      AND window_start >= toDateTime('2003-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY y, ticker
    HAVING sessions >= 100
)
GROUP BY ticker
ORDER BY ticker ASC

El 8.8% de SPY se sitúa en el 6 de las 23 primeras mitades desde 2004 (rango 1 = mejor) —tercio superior, pero no es un récord. El 18.7% de QQQ se sitúa en el 3 de las 16 mitades comparables —la serie de QQQ es más corta— el fondo operó bajo un ticker distinto durante varios años —y cualquier año con menos de cien sesiones de primera mitad para un símbolo se excluye mediante un filtro de conteo de sesiones mostrado en la tabla, por lo que las exclusiones son visibles y no silenciosas.

ConsultaCada primer semestre en el tape: DIA e IWM, misma aritmética
El SQL exacto detrás de cada cifra
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
       ticker,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
       round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('DIA', 'IWM')
  AND window_start >= toDateTime('2003-01-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')
  AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 100
ORDER BY y ASC, ticker ASC
ConsultaRanking de posiciones: DIA e IWM frente a cada primer semestre anterior (rank 1 = mejor; excluido a sí mismo)
El SQL exacto detrás de cada cifra
SELECT ticker,
       round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
       arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
       count() AS halves_compared,
       min(y) AS first_year,
       anyIf(sessions, y = 2026) AS sessions_2026
FROM (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
           ticker,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('DIA', 'IWM')
      AND window_start >= toDateTime('2003-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY y, ticker
    HAVING sessions >= 100
)
GROUP BY ticker
ORDER BY ticker ASC

La fila de pequeña capitalización es el dato principal: IWM se sitúa en el 1 de las 23 primeras mitades desde 2004 —el mejor registro para el fondo, superando a todas las mitades de recuperación en la tabla. El 8.4% de DIA se sitúa en el 4 de las 23. La base, explicada claramente: apertura a cierre en horario regular dentro de cada primera mitad del año calendario, aritmética idéntica para cada año, y el límite superior fijado al final de este periodo para que el conjunto de comparación no crezca de forma silenciosa cuando se incorporen años posteriores.

Mes a mes

ConsultaEl semestre, mes a mes (SPY y QQQ, recalculados idénticamente en una sola consulta)
El SQL exacto detrás de cada cifra
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start, ticker,
    round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS month_return_pct,
    round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS month_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start, ticker
ORDER BY period_start, ticker

La tendencia muestra ligeros ascensos y descensos, con una subida pronunciada y luego una caída leve: abril fue el punto de inflexión del semestre (SPY 9.9%, QQQ 14.8% — el mejor mes de QQQ en el semestre), y junio cerró el periodo con calma en -1.2% para el SPY. El resumen de junio, con el análisis de la amplitud detrás de esa cifra, está aquí. Analizando la tabla mes a mes: el año comenzó casi sin cambios (SPY 0.9% en enero), cayó durante febrero (-0.5%) y marzo (-4.2%), luego abril revirtió la tendencia en un solo mes, mayo la extendió (4.9%) y junio tuvo un ligero retroceso. Tres de los seis meses fueron negativos; una distribución equilibrada para un semestre que terminó sólidamente en positivo, lo cual es el patrón habitual de los semestres de renta variable y es importante considerarlo cuando un solo mes parece dictar un veredicto.

Tasas: toda la curva, vencimiento por vencimiento

La curva del Tesoro experimentó un giro en lugar de un desplazamiento. El tramo más corto —los vencimientos que siguen más de cerca la política monetaria— apenas se movió; el de dos años subió dos tercios de un punto porcentual; el de treinta años apenas tuvo cambios. El panel presenta la curva completa, comparando el inicio del semestre contra el final.

ConsultaSiete vencimientos: yield al inicio del semestre vs. al final, y el cambio
El SQL exacto detrás de cada cifra
SELECT maturity, start_pct, end_pct, round((end_pct - start_pct) * 100, 0) AS change_bp FROM (
    SELECT '1-month' AS maturity, (SELECT round(argMin(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS start_pct, (SELECT round(argMax(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS end_pct, 1 AS o
    UNION ALL SELECT '3-month', (SELECT round(argMin(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), (SELECT round(argMax(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), 2
    UNION ALL SELECT '1-year', (SELECT round(argMin(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), (SELECT round(argMax(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), 3
    UNION ALL SELECT '2-year', (SELECT round(argMin(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), (SELECT round(argMax(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), 4
    UNION ALL SELECT '5-year', (SELECT round(argMin(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), (SELECT round(argMax(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), 5
    UNION ALL SELECT '10-year', (SELECT round(argMin(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), (SELECT round(argMax(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), 6
    UNION ALL SELECT '30-year', (SELECT round(argMin(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), (SELECT round(argMax(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), 7
) ORDER BY o

Al leer la columna de cambios de arriba hacia abajo, el giro es evidente: el de un mes se movió -2 puntos básicos en seis meses, mientras que el de dos años subió 67 y el de 30 años solo 5. Un desplazamiento paralelo mueve todos los vencimientos en conjunto; este semestre movió la parte media de la curva y mantuvo ambos extremos estables: las tasas cortas se anclaron cerca de la política monetaria y las tasas largas apenas se reajustaron.

What that did to the slope

ConsultaResultados de la pendiente: inicio, fin, mínimo — el spread nunca se invirtió este semestre
El SQL exacto detrás de cada cifra
SELECT
    round((argMin(yield_10_year - yield_2_year, date)) * 100, 0) AS start_bp,
    round((argMax(yield_10_year - yield_2_year, date)) * 100, 0) AS end_bp,
    round(min((yield_10_year - yield_2_year)) * 100, 0) AS min_bp,
    count() AS prints
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)

The short end rising faster than the long end is what a flattening IS: the 2s10s spread ground down from 72 to 30 basis points across 124 prints — and its lowest print of the half was 27, so the curve flattened without ever inverting. Whether a flatter curve "means" anything about what comes next is a forecast, and this table doesn't make forecasts.

ConsultaEl spread 2s10s, cada registro del semestre
El SQL exacto detrás de cada cifra
SELECT toString(date) AS d, round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
ORDER BY date

The daily series shows the flattening was not one event but a grind — 124 prints stepping down through the half, with the spread starting the year at 72 basis points and ending at 30.

Sectores: la dispersión que el índice ocultó

¿Qué partes del mercado generaron realmente las ganancias del semestre? Los once ETF de sectores de SPDR, divididos en mitad y trimestre, en una sola consulta.

ConsultaLos once ETFs de sectores: retorno H1 2026, desglose Q1 y Q2, y volumen en $ de H1
El SQL exacto detrás de cada cifra
SELECT ticker,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-03-31') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-04-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

La dispersión es el punto clave: tecnología (XLK) cerró el semestre con una subida del 30.8% —con un 42% segundo trimestre— mientras que servicios de comunicación (XLC) cerró con un -9.3%, un spread de aproximadamente cuarenta puntos porcentuales entre el mejor y el peor sector en seis meses. Poseer "el mercado" significó poseer ambos extremos de ese rango. Energía es el ejemplo de cautela del panel sobre periodos prolongados: XLE muestra un saludable 18.8% en el semestre —construido a partir de un 36.9% primer trimestre seguido de un -11% segundo. Fue el sector de gran capitalización más fuerte del mercado en el trimestre en que los índices cayeron, y uno de los más débiles en el trimestre en que se recuperaron. Financieros (XLF) presentó el mismo escenario a la inversa: -9.9% en el Q1, luego 7.7% en el Q2. Una cifra única para el primer semestre aplana ambos ciclos; el desglose trimestral ofrece la visión real.

El costo de operar cada sector

Las tablas de rendimientos son comunes; las cintas de cotizaciones no. Este panel mide el spread bid-ask mediano de cada ETF sectorial durante una sesión representativa completa —123 sesiones en el semestre, y la sesión medida aquí es la del 29 de junio, etiquetada como tal— a partir de cada actualización del NBBO de ese día.

ConsultaSpread cotizado mediano por ETF de sector, una sesión representativa (29 de junio, 2026), horario regular
El SQL exacto detrás de cada cifra
SELECT ticker,
    round(quantileDeterministicIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price), 2) AS med_spread_bps,
    round(count() / 1e6, 2) AS quote_updates_m,
    countIf(NOT (bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price)) AS invalid_dropped
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
  AND sip_timestamp >= toDateTime64('2026-06-29 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-29 20:00:00', 9)
GROUP BY ticker
ORDER BY med_spread_bps

Cada una de las once cotizaciones se encuentra en unos pocos puntos básicos o menos —la más barata a 0.62 bps (XLV) y la más amplia a 2.23 bps (XLRE)— lo cual es el significado práctico de que "los ETF sectoriales son líquidos": el costo de adoptar cualquier posición sectorial se mide en centésimas de porcentaje. Para comparar con acciones individuales, el análisis profundo del 29 de junio mide el spread de un activo con baja liquidez en cientos de veces estos niveles, en la misma sesión.

Amplitud en el primer semestre

La amplitud a escala semestral presenta dos matices. El matiz general: el SPY registró 64 sesiones al alza frente a 59 sesiones a la baja durante el 123 del semestre; esto es casi un equilibrio de días dentro de un periodo sólidamente positivo, lo cual es característico de un avance gradual según el registro diario. El matiz detallado —contando cada ticker— se observa a escala mensual: la relación entre avances y declives de junio se encuentra en el resumen de junio (hubo más tickers con caídas que con alzas), y el conteo del cierre trimestral está en el resumen del Q2. Un escaneo de avances de todo el mercado en un periodo de seis meses excede el presupuesto de consultas de esta página; dicho límite se declara aquí en lugar de reducir los resultados de forma silenciosa.

ConsultaSesiones de SPY al alza vs. a la baja durante el semestre, un registro rápido
El SQL exacto detrás de cada cifra
SELECT countIf(day_ret > 0) AS up_sessions,
       countIf(day_ret < 0) AS down_sessions,
       countIf(day_ret = 0) AS flat_sessions,
       count() AS sessions_total
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 2) AS day_ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
)

El registro de opciones, mes a mes

Lo que solo un reporte semestral puede mostrar: la evolución del registro de opciones. Cada panel a continuación es un escaneo completo de un mes: el volumen total de contratos y la proporción que se negoció en su propio día de vencimiento (0DTE). El análisis muestra: el volumen pasó de 1316.1 millones de contratos en enero a 1477.9 millones en junio —el mes con más actividad de opciones del semestre— y la proporción de vencimiento en el mismo día subió de 26.5% en enero a 34.3% en junio, el mes más alto del semestre. Un tercio del volumen de opciones de junio se negoció en contratos que vencían ese mismo día.

ConsultaEnero: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-01-01 00:00:00')
  AND window_start < toDateTime('2026-02-01 00:00:00')
ConsultaFebrero: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-02-01 00:00:00')
  AND window_start < toDateTime('2026-03-01 00:00:00')
ConsultaMarzo: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-03-01 00:00:00')
  AND window_start < toDateTime('2026-04-01 00:00:00')
ConsultaAbril: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-04-01 00:00:00')
  AND window_start < toDateTime('2026-05-01 00:00:00')
ConsultaMayo: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-05-01 00:00:00')
  AND window_start < toDateTime('2026-06-01 00:00:00')
ConsultaJunio: volumen de contratos de options de todo el tape y participación de vencimiento el mismo día (una búsqueda)
El SQL exacto detrás de cada cifra
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')

El costo de operar, muestreado mensualmente

ConsultaSpread cotizado mediano de SPY en una sesión de muestra etiquetada por mes (segundos miércoles), cada actualización de NBBO
El SQL exacto detrás de cada cifra
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
       round(quantileDeterministicIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price), 3) AS med_spread_bps,
       round(count() / 1e6, 2) AS quote_updates_m,
       countIf(NOT (bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price)) AS invalid_dropped
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY'
  AND ((sip_timestamp >= toDateTime64('2026-01-14 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-01-14 21:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-02-11 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-02-11 21:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-03-11 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-03-11 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-04-15 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-04-15 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-05-13 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-05-13 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-06-10 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-10 20:00:00', 9)))
GROUP BY session
ORDER BY session ASC

El spread mediano cotizado de SPY el segundo miércoles de cada mes: 0.145 bps en la muestra de enero, 0.144 en la de febrero, aproximadamente el doble en las muestras de primavera, y 0.409 bps en la muestra de junio — el más amplio de los seis. Base: estos son datos de sesiones únicas etiquetadas (el segundo miércoles de cada mes), no medianas de todo el mes — un escaneo de seis meses de toda la cinta de cotizaciones excede el presupuesto de consulta de esta página. Las fechas de la muestra se encuentran en el panel, y las cotizaciones inválidas se contabilizan allí, no se eliminan silenciosamente.

Los nombres más destacados del semestre

Notabilidad medida, no elección editorial: el siguiente conjunto representa la parte superior de la lista de mayor volumen de transacciones del trimestre, recalculada aquí para que esta página sirva como comprobante, y cada nombre con un análisis profundo enlaza al mismo.

ConsultaVolumen en $ de Q2 en horario regular, todo el tape (se excluye un símbolo reutilizado pendiente de verificación de entidad)
El SQL exacto detrás de cada cifra
SELECT ticker,
    round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS dollar_bn,
    round(100 * sum(toFloat64(close) * toFloat64(volume)) / max(sum(toFloat64(close) * toFloat64(volume))) OVER (), 1) AS pct_of_leader
FROM global_markets.delayed_stocks_minute_aggs
WHERE 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
  AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY dollar_bn DESC
LIMIT 8

MU operó con mayor volumen que SPY durante el segundo trimestre ($2047.5 mil millones frente a $2032 mil millones), según el mismo registro que contiene el resumen del Q2. Para las seis acciones individuales en ese grupo líder, el semestre:

ConsultaRetornos del semestre y Q2 del grupo líder más volumen en $ de H1 — una consulta filtrada por ticker
El SQL exacto detrás de cada cifra
SELECT ticker,
    round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, window_start >= toDateTime('2026-04-01 00:00:00') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'NVDA', 'TSLA', 'SNDK', 'AMD', 'INTC')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

El sector de semiconductores y memoria domina el semestre: SNDK rindió un 830.1% en seis meses, MU un 290% — su análisis detallado de junio está disponible aquí — e INTC un 269.3%. NVDA, el mayor ticker del grupo con $3287.9 mil millones de rotación semestral, rindió un 5.2%; un dígito simple mientras las acciones de memoria se multiplicaron; su análisis profundo de junio detalla esa divergencia sesión por sesión. TSLA es el único declive del grupo con un -8.2%. El mega-listado de junio opera bajo un símbolo reutilizado y está excluido de los escaneos de líderes mientras se verifica la entidad — su primer mes tiene su propio reporte detallado. Base: el SET líder se elige por el volumen de dólares en horario regular del Q2 (el escaneo anterior); las columnas de rendimiento corresponden al semestre, desde la apertura de la primera sesión regular hasta el cierre de la última sesión regular.

La ola de IPOs del semestre, mes a mes

ConsultaNuevos listados por mes durante el semestre
El SQL exacto detrás de cada cifra
SELECT toString(toStartOfMonth(listing_date)) AS m, count() AS listings
FROM global_markets.stocks_ipos
WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')
GROUP BY m
ORDER BY m

La ola de salidas a bolsa fue desigual y concentrada al inicio: febrero fue el mes con mayor actividad con 47 listados, mientras que marzo fue el más tranquilo con 17 — la famosa mega-salida de junio ocurrió en un mes con un volumen ordinario (35 listados).

El calendario del semestre

ConsultaCalendario corporativo de H1 2026 (se revelan los tres gaps de cierre de mes de índices)
El SQL exacto detrás de cada cifra
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-01-01') AND ex_dividend_date <= toDate('2026-06-30')) AS ex_div_events,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-01-01') AND execution_date <= toDate('2026-06-30')) AS splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')) AS ipos,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= toDate('2026-01-01') AND filing_date <= toDate('2026-06-30')) AS h1_filings,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-03-31')) AS filings_mar31,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-04-30')) AS filings_apr30,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-30')) AS filings_jun30

205 empresas salieron a bolsa en el semestre — una ola de listados cuyo debut más grande en junio tiene su propio post detallado por recibo — junto con 830 splits y 28356 eventos ex-dividend. Para dimensionar, esto representa más de un nuevo listado por sesión de negociación durante el semestre. El total de registros presenta una triple divulgación: el índice de la SEC está casi vacío en cada cierre de mes del semestre cuyo último día calendario fue un día hábil (55 registros indexados el 31 de marzo, 34 el 30 de abril, y 31 el 30 de junio, frente a miles en días adyacentes), por lo que los conteos de registros semestrales están subestimados hasta que el feed se actualice — la brecha de cierre de mes tiene su propia nota diagnóstica.

El resumen de la sesión

Consulta123 sesiones en el semestre, verificadas desde el tape
El SQL exacto detrás de cada cifra
SELECT
    (SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')) AS h1_sessions

Notas de datos

Notas de datos completas
  • El interés de ventas en corto termina el cierre del 15 de junio según la generación actual (pendiente la impresión de finales de junio — información completa en el resumen de junio; este post se regenera cuando se publique).
  • Tres días de presentación de índices al cierre de mes de 2026 están casi vacíos (31 de marzo, 30 de abril, 30 de junio — cada cierre de mes del semestre cuyo último día calendario fue un día hábil); se revela junto con los conteos, analizado en la nota sobre el vacío de cierre de mes. Los cierres de mes del año anterior contienen miles de presentaciones, por lo que se trata de un vacío en el feed y no de un feriado de presentación.
  • El leaderboard a escala de mitad de año está limitado: un escaneo de todo el mercado de seis meses excede el presupuesto de consulta que genera esta página, por lo que el conjunto de nombres notables se elige mediante el escaneo de líder a escala trimestral que se muestra en línea, y los rendimientos del semestre se calculan para ese conjunto fijo — la base se indica donde se utiliza. Los resúmenes de Q2 y junio contienen las tablas de líderes completas en sus respectivas escalas.
  • La amplitud de todo el mercado a escala de mitad de año también está limitada — se muestra la división por granularidad diaria; los conteos por ticker residen en la escala mensual y trimestral, vinculados en la sección de amplitud.
  • La serie histórica de QQQ es más corta que la de SPY: el fondo operó bajo un símbolo raíz diferente durante varios años; el límite de conteo de sesiones excluye esos años de forma visible (los conteos de sesiones por año están en la tabla).
  • Los seis paneles de opciones son escaneos mensuales de cinta completa y la tendencia del spread utiliza una sesión etiquetada por mes — ambos se ejecutan en la ruta por lotes; las bases de la muestra se indican en línea.
  • La microestructura se encuentra en el análisis profundo del 29 de junio.

Metodología

  • El periodo comprende del 1 de enero al 30 de junio de 2026 — 123 sesiones, verificadas mediante barras observadas. Los rendimientos se calculan desde la apertura hasta el cierre de la sesión regular dentro de cada ventana, utilizando las mismas consultas mostradas.
  • Las comparaciones históricas se recalculan en tiempo real contra el historial completo de minutos al momento de la generación; nunca se leen valores almacenados. Verificación de profundidad: la fecha de la primera barra de minuto en la vista con retraso coincide con la de la tabla base (septiembre de 2003), verificada durante la redacción, por lo que el primer primer semestre completo disponible es el de 2004. Cada consulta de historial establece su límite superior al final de este periodo (el conjunto de comparación no crece cuando se ingieren años posteriores) y aplica una protección de sesiones mínimas con los conteos anuales mostrados.
  • Las marcas de tiempo se almacenan en UTC con límites UTC originales. Los bloques de historial multianual filtran las horas regulares según el horario de Nueva York (9:30–15:59, convertido por fila — la única convención segura para el horario de verano a través de las décadas); los bloques de ventana única en rangos de EDT utilizan la banda UTC original equivalente. Ambas convenciones se declaran aquí.
  • La generación se realiza a través de la ruta de lectura restringida; la página pública nunca realiza consultas en vivo. Estado del almacén de datos al 5 de julio de 2026.

Esta es la primera edición del resumen semestral permanente; la edición de año completo se publicará en enero. Detalle trimestral: Q2 2026. Los datos macroeconómicos con los que se compara el semestre se encuentran en el panorama macro.