Strasmore Research
Recaps de mercado Matt ConnorPor Matt Connor · Atualizado 2026-07-23

Resumo de mercado 30 de junho de 2026

A última sessão do trimestre teve alta liderada pelo setor de tecnologia em um mercado em queda. O QQQ subiu e o índice de opções fechou o dia com spread.

Terça-feira, 30 de junho de 2026 — a última sessão do trimestre — foi um dia de alta liderada pelo setor de tecnologia em um mercado majoritariamente em queda: o QQQ subiu 1.63% e o SPY 0.73%, mas apenas 4 dos fundos do setor S&P 10 fecharam em alta (3,349 ativos líquidos em alta, 3,033 em baixa). A sessão anterior: o resumo de 29 de junho. Cada número abaixo é extraído de uma consulta armazenada — expanda qualquer painel para ver o SQL.

O placar

Cada variação compara o último candle de sessão regular de 30 de junho com o de segunda-feira, 29 de junho.

QuerySPY / QQQ / DIA / IWM — 30 de junho vs fechamento de 29 de junho, regular hours
O SQL exato por trás de cada número
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.ticker

O SPY abriu a $741.29 e fechou a $746.32, próximo à sua máxima de $748.02. O 1.63% do QQQ contra o 0.12% do DIA define o dia: o crescimento avançou, as blue chips mal se moveram e o IWM 0.49%.

O fechamento do trimestre

O dia 30 de junho encerrou a última das 62 sessões do segundo trimestre, e o movimento do dia refletiu o comportamento do trimestre.

QueryQ2 2026 completo: cada ETF de índice do open de 1º de abril ao close de 30 de junho, regular hours
O SQL exato por trás de cada número
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 ASC

De 1º de abril ao fechamento de 30 de junho: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08%. O QQQ teve o melhor desempenho no trimestre e no dia 30 de junho, embora a ordem tenha mudado no meio do caminho: o SPY superou o IWM no dia, mas o IWM liderou o SPY durante o trimestre. O QQQ fechou em alta em 38 das 62 sessões (o resumo do Q2 apresenta os dados detalhados).

O dia foi atípico?

QueryMovimento open-to-close do SPY ranqueado contra o mês anterior (rank 1 = maior variação absoluta)
O SQL exato por trás de cada número
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
)

A variação do SPY entre a abertura e o fechamento — uma perspectiva diferente do placar de fechamento sobre fechamento — foi de 0.68%, ocupando a posição 7 de 21 sessões anteriores em termos de magnitude absoluta. O índice apresentou calma, mas o fluxo de ordens não.

Amplitude: uma vantagem positiva estreita

QueryAdvancers vs decliners entre tickers com pelo menos $1M negociados em 30 de junho
O SQL exato por trás de cada número
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 > 0

3,349 altas, 3,033 baixas, 88 estáveis: 51.8% do volume líquido subiu — um resultado incerto sob um índice de crescimento de 1.63%. O filtro de liquidez remove 5,055 de 11,525 tickers de duas sessões (com menos de um milhão de dólares negociados), contabilizados aqui, sem omissões.

Setor por setor: para onde o dinheiro realmente foi

Contar o número de ativos com uma única cotação esconde a real distribuição do capital. Os dez fundos abaixo representam fatias do S&P 500, e o spread entre o melhor e o pior desempenho mede o quão desigual foi a sessão.

QueryOs dez fundos de setores do S&P em 30 de junho: variação vs fechamento de segunda-feira e distância do líder
O SQL exato por trás de cada número
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 ASC

Tecnologia (XLK) subiu 2.69% e operou de forma isolada: industriais 1.34%, materiais 0.36% e discricionários 0.15% foram os únicos outros no campo positivo, enquanto o restante do painel ficou no vermelho, desde o setor financeiro (-0.17%) até o de utilidades (-1.48%), bens de consumo (-1.53%) e o setor imobiliário por último, em -2%. Diferença entre o melhor e o pior: 4.69 pontos percentuais, com 4 de 10 fundos no positivo. Um índice com alta inferior a um por cento e um spread de quatro pontos: um único setor liderou o movimento.

Maiores altas e baixas do dia, mercado geral

A amplitude mede quantos ativos subiram; este gráfico mostra quais tiveram maior variação — os cinco maiores ganhos e perdas percentuais entre ativos com volume superior a $10 milhões.

QueryTop 5 gainers e top 5 decliners entre nomes com +$10M negociados em 30 de junho (uma listagem com símbolo duplicado excluída)
O SQL exato por trás de cada número
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 ASC

Nenhum dos pregões seguiu o movimento do índice. JEM liderou com +256.76% em $141 milhões negociados; SOC caiu 55.89% com $306 milhões. ABVX subiu 38.56% com $942 milhões, o maior turnover de ambos os pregões; NVCT caiu 35.62% e UNCY 39.09%. A coluna de split evita distorções — um reverse split de um-para-dez aparece como um "ganho" de 900% em um tape não ajustado — e cada ativo aqui possui um 0: negociações reais.

Três linhas representam o mesmo ativo em dois pregões: CRCA (-35.16%) e CRCG (-35.19%) caíram, enquanto CRCD subiu 35.47% — cada um próximo ao dobro do movimento de -17.53% do ativo ligado a cripto abaixo: wrappers de ações individuais alavancados.

O destaque do dia: semicondutores em virada trimestral

Seis nomes, um tema, resultados muito distintos — apenas co-movimento e magnitude; os dados não indicam o motivo.

QueryNomes de semicondutores e storage: variação vs fechamento de segunda-feira, range e dollar volume
O SQL exato por trás de cada número
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 ticker

SanDisk subiu 10.79%, AMD 7.7%, Intel 5.93%, TSMC 4.86% — enquanto a MU, com o maior volume do pregão de $37.41 bilhões, fechou apenas 0.52% acima e a Western Digital (-2.01%) não participou. Este é o componente por trás do resultado do setor de tecnologia de 2.69% (MU em junho, tick a tick).

A tendência contrária atingiu o setor financeiro ligado a cripto, contra o mercado em alta:

QueryFinanceiras ligadas a crypto: variação vs fechamento de segunda-feira, range e dollar volume
O SQL exato por trás de cada número
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 ticker

CRCL registrou -17.53%, com sua mínima de $62.52 atingida às 15:59 ET — no último minuto da sessão — acompanhada por MSTR -6.2%, COIN -3.61% e HOOD -1.53%. Co-movimento observado; causa não declarada.

O que o feed de notícias trouxe

Um resumo que evita afirmar causas deve ao leitor o que foi realmente publicado no dia.

QueryFeed de notícias em 30 de junho: contagem de artigos e a última manchete do dia para cada nome neste recap
O SQL exato por trás de cada número
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 ASC

O nome mais coberto foi NVDA, com 21 artigos — sem estar entre os destaques de movimentação do dia — seu último texto da sessão (16:28 ET, Investing.com) intitulado "These Stocks Could Benefit as the Robotaxi Race Heats Up". MU teve 7; o único artigo da SanDisk (The Motley Fool) é a única manchete do dia que cita uma movimentação real: "Why Sandisk Stock Is Skyrocketing Today".

A lacuna é o achado: a maior queda do dia, a maior alta e o nome ligado ao setor de cripto que mais caiu registraram 0, 0 e 0 artigos — zero para cada um, em um feed de 211 peças. A cobertura não é um indicador do price action.

Onde o dinheiro foi negociado

QueryLíderes de volume de duas formas: top 6 por dollars negociados, top 4 por shares negociadas (uma listagem com símbolo duplicado excluída)
O SQL exato por trás de cada número
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) DESC

Em volume financeiro, a MU superou todos os outros ativos, inclusive fundos de índice: $37.41 bilhões contra os $31.84 bilhões do SPY — foi a segunda sessão consecutiva em que superou o principal ETF de índice (resumo de segunda-feira contém o primeiro). O painel de ações mostra um cenário diferente: o SOXS, um ETF inverso de semicondutores com alavancagem de 3x (515.5 milhões de ações), e dois ativos abaixo de um dólar que representam um valor desprezível perto do volume da MU — o volume apresenta duas interpretações.

Um nome é excluído de ambos os painéis propositalmente: uma listagem de junho cujo ticker pertencia anteriormente a uma empresa diferente e não relacionada, fazendo com que os feeds de dados identifiquem duas entidades com as mesmas três letras (registros aqui).

QueryShares negociadas por bucket de 30 minutos, regular hours (bilhões)
O SQL exato por trás de cada número
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_time

2.05 bilhões de ações na primeira meia hora, um ponto baixo de 0.78 bilhões às 13:30, e o maior volume do dia — 2.69 bilhões — até o fechamento do trimestre, onde o leilão de fechamento e seus fluxos de rebalanceamento aparecem (análise detalhada de 29 de junho detalha o processo).

O fluxo de opções

QueryUma linha para o dia de options: volume, expiry no mesmo dia, skew de put/call do SPY por moneyness, semana ajustada por feriado
O SQL exato por trás de cada número
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'

Foram negociados 61.95 milhões de contratos de opções em 10.06 milhões de registros; as calls representaram 57.3% do volume total, e 28% desse volume expirou naquela terça-feira. O SPY seguiu a direção oposta: 12.04 milhões de contratos com um put/call ratio de 1.09 — mais puts do que calls, em um dia de alta do fundo.

Ao comparar os vencimentos no mesmo dia do SPY com seu fechamento de $746.32, o skew fica evidente: 3.33 milhões de puts out-of-the-money (strikes abaixo do fechamento) e 2.28 milhões de calls out-of-the-money, contra 1.77 milhões de calls in-the-money e 0.63 milhões de puts in-the-money — os strikes de baixa que expiraram sem valor foram o grupo mais movimentado no dia de 0DTE do SPY. Nada com código de vencimento para sexta-feira, 3 de julho, foi registrado (0 registros — o mercado estará fechado nessa sexta-feira); a semanal de quinta-feira registrou 10.52 milhões.

QueryOs seis option contracts mais negociados de 30 de junho, por contratos negociados
O SQL exato por trás de cada número
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 ASC

O contrato mais negociado foi a call do SPY de $747 com vencimento no mesmo dia — 821,361 contratos com prêmio médio de $0.641, fechando $0.68 acima da última barra regular do SPY, e sem valor. O quadro por trás disso serve de lição: cinco dos seis contratos mais negociados no tape foram strikes do SPY com vencimento no mesmo dia, separados por um dólar em torno do fechamento (SPY $748 call o próximo), cada um negociado por centavos. A exceção, com 65.1% do volume do líder, foi a KWEB $29 call vencendo em December 18, 2026, não um contrato de mesmo dia: uma posição de seis meses entre cinco bilhetes de loteria de tarde.

Juros: o longo prazo subiu no fechamento do primeiro semestre

QueryCurva de Treasury, close de 30 de junho vs 29 de junho (apenas vencimentos populados)
O SQL exato por trás de cada número
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
)

O longo prazo subiu no último dia do semestre: o título de 10 anos subiu 6 bp para 4.44%, o de 2 anos subiu 4 bp para 4.14%, e o spread 2s10s inclinou 2 bp para 0.3 pontos. Os yields de longo prazo subiram em uma sessão cujo setor mais fraco, o imobiliário (-2%), e o terceiro mais fraco, o de utilidades (-1.48%), são ambos classicamente sensíveis aos juros: uma coincidência digna de nota, mas não um mecanismo que estes dados possam provar (o resumo do H1 reflete a curva do semestre).

O calendário por trás do dia

QueryCalendário corporativo e fluxo de informações de 30 de junho, em uma linha (gap do filing-index em exibição)
O SQL exato por trás de cada número
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_session

704 registros de dividendos ficaram ex-dividend no último dia do trimestre — uma onda de fechamento de trimestre, com a maioria das empresas dos EUA pagando trimestralmente — com 7 splits e 2 novas listagens (AACU — Ares Acquisition Corp III; OSPRU — Osprey Acquisition Corp. III). A coluna de registros é o dado principal de qualidade: o índice da SEC contém 31 registros para 30 de junho — 0 Insider Form 4s, 0 8-Ks — contra 4439 da sessão anterior. Um padrão de fim de mês no feed, diagnosticado em nota sobre o gap de fim de mês; qualquer contagem que inclua este dia está subestimada até que ocorra o preenchimento retroativo.

A sessão, verificada

QueryCheck de sessão: span de minute-bar observado do SPY
O SQL exato por trás de cada número
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'

As barras do SPY ocorrem de 04:00 a 19:59 no horário de Nova York, com exatamente 390 barras de janela regular — uma sessão completa, verificada pelo tape (o conjunto de dados do calendário da bolsa contém apenas os fechamentos futuros).

O que a sessão representa

Um fechamento do SPY com 0.73% de ativos em alta, 51.8% de fundos do setor 4 de 10 no verde e 4.69 pontos de diferença entre os melhores e piores não é um rali amplo — é o rali de um único setor disfarçado de índice, ocorrendo em seu período mais intenso em um leilão de fechamento de trimestre. Uma variação de índice é uma média, e este movimento foi puxado pela tecnologia enquanto a maioria dos setores caiu: analise a dispersão antes de confiar na direção.

FAQ

Como foi o desempenho do mercado de ações em 30 de junho de 2026?

O mercado fechou em alta: o SPY subiu 0.73% e o QQQ 1.63% em relação ao fechamento de 29 de junho. A amplitude foi menor — 51.8% das ações líquidas subiram, enquanto 4 dos 10 fundos setoriais do S&P ficaram no verde.

Qual setor liderou o mercado em 30 de junho de 2026?

Tecnologia: o XLK subiu 2.69%, contra 1.34% para industriais e -2% para o setor imobiliário — uma diferença de 4.69 pontos entre o melhor e o pior desempenho.

Quais foram as maiores variações de ações em 30 de junho de 2026?

Entre os ativos com volume de negociação de US$ 10 milhões ou mais, a JEM teve o maior ganho (+256.76%) e a SOC a maior queda (55.89%). Nenhuma delas registrou desdobramento de ações: ambos são movimentos reais de preço, não efeitos de eventos corporativos.

Como foi o desempenho do mercado de ações no Q2 2026?

Do início de 1º de abril ao fechamento de 30 de junho, ao longo de 62 sessões: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08% — um trimestre liderado por ações de crescimento, encerrado por um dia de alta para o setor de growth.

Por que há tanto volume de negociação na última meia hora?

A última meia hora registrou 2.69 bilhões de ações, contra 2.05 bilhões na abertura. O leilão de fechamento define o preço oficial de fechamento de cada ação em um único cruzamento, e os fundos de índice negociam nesse período para acompanhá-lo; o rebalanceamento de fim de trimestre concentra o fluxo.

Notas de dados e metodologia

  • As cestas. O painel do setor compreende os dez fundos setoriais da SPDR listados em seu painel — a mesma cesta em todas as sessões, permitindo a comparação da dispersão entre dias. Os painéis de movimentação exigem um turnover de $10 milhões e fechamento anterior acima de $1, excluem a listagem de símbolos reutilizados acima e incluem uma coluna de registro de split.
  • As ressalvas. O volume financeiro é uma estimativa por minuto (fechamento × volume por barra). O índice de registros de 30 de junho está quase vazio (a nota sobre o gap de fim de mês explica o motivo). A contagem de notícias utiliza apenas um feed de fornecedor: a ausência de um artigo aqui não prova que nada foi publicado em outro lugar.
  • A metodologia. Uma sessão (1, verificada a partir das barras observadas); timestamps armazenados em UTC, convertidos para o horário de Nova York nas consultas; "close" refere-se à última barra regular de um minuto, não ao print do leilão. Os vencimentos de opções são reprocessados a partir do ticker da OCC (a coluna da própria tabela apresenta erro); o moneyness é medido em relação à última barra regular do SPY. Os painéis são executados uma única vez, no momento da autoria, através do caminho de leitura restrito. Armazenamento atualizado em 13 de julho de 2026.

Cada painel é o resultado de uma consulta armazenada — gráfico, tabela e SQL em um único objeto. Cole qualquer um deles no terminal Strasmore. Próxima sessão: 1 de julho.