Resumo do mercado em 29 de junho de 2026
Análise de 29 de junho de 2026: alta dos índices por crescimento, spread setorial de quatro pontos, volatilidade em penny stocks e movimentação de 0DTE.
Segunda-feira, 29 de junho de 2026, foi um dia de alta impulsionada pelo crescimento, com uma liderança restrita: o QQQ subiu 2.57%, o SPY 1.62%, e 3968 ativos líquidos subiram contra 2327 declinantes — mas quase metade dos cestos setoriais fechou no vermelho. Cada número é extraído de uma consulta armazenada; expanda qualquer painel para ver o SQL. O detalhamento tick-a-tick da mesma sessão: a análise detalhada da microestrutura de 29 de junho.
O placar
Cada variação compara o último minuto da sessão regular de 29 de junho com o de sexta-feira, 26 de junho.
O SQL exato por trás de cada número
WITH friday AS (
SELECT ticker, argMax(close, window_start) AS friday_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
AND window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00'
GROUP BY ticker
),
monday AS (
SELECT ticker,
argMin(open, window_start) AS monday_open,
argMax(close, window_start) AS monday_close,
max(high) AS day_high,
min(low) AS day_low,
round(toFloat64(sum(volume)) / 1e6, 1) AS shares_traded_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY ticker
)
SELECT
m.ticker AS ticker,
toFloat64(f.friday_close) AS jun26_close,
toFloat64(m.monday_open) AS jun29_open,
toFloat64(m.monday_close) AS jun29_close,
round((toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) * 100, 2) AS pct_change,
round(100 * (toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) / max(toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) OVER (), 1) AS pct_of_best_change,
toFloat64(m.day_high) AS day_high,
toFloat64(m.day_low) AS day_low,
m.shares_traded_m AS shares_traded_m
FROM monday m
JOIN friday f ON m.ticker = f.ticker
ORDER BY m.tickerO SPY abriu a $736.525 contra o fechamento de $729.09 de sexta-feira e encerrou a $740.88, abaixo de sua máxima de $741.56. O retorno de +2.57% do QQQ contra os +0.81% do DIA sinaliza um dia de alta para o setor de tecnologia e crescimento; o IWM (small-caps) somou 0.45%.
O dia foi atípico?
Uma variação percentual tem pouco significado sem um parâmetro de comparação. Este painel classifica o dia 29 de junho em relação ao mês anterior, com base no tamanho absoluto do fechamento sobre o fechamento anterior.
O SQL exato por trás de cada número
SELECT
round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29')), 2) AS qqq_close_over_close_pct,
arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-06-29'))) + 1 AS qqq_abs_move_rank,
countIf(ticker = 'QQQ') AS qqq_sessions_compared,
round(max(if(ticker = 'QQQ', abs(cc_pct), 0)), 2) AS qqq_biggest_move_of_month_pct,
countIf(ticker = 'QQQ' AND cc_pct > 0) AS qqq_up_sessions,
round(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_close_over_close_pct,
arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'SPY' AND d != toDate('2026-06-29'))) + 1 AS spy_abs_move_rank,
countIf(ticker = 'SPY') AS spy_sessions_compared,
round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_open_to_close_pct,
concat(monthName(min(d)), ' ', toString(toDayOfMonth(min(d))), ', ', toString(toYear(min(d)))) AS first_session
FROM (
SELECT ticker, d,
(close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct,
oc_pct
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(toFloat64(close), window_start) AS close_px,
(argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
AND window_start >= toDateTime('2026-05-28 00:00:00')
AND window_start < toDateTime('2026-06-30 00:00:00')
AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
GROUP BY ticker, d
)
)
WHERE isFinite(cc_pct)Grande, mas não um recorde: a movimentação de 2.57% do QQQ ocupa a posição 5 das sessões de 21 desde May 29, 2026, em um mês cujo maior movimento individual foi de 4.76%; a de 1.62% do SPY ocupa a posição 4 de 21. A origem do movimento é relevante: o avanço do SPY do abertura ao fechamento foi de apenas 0.59%, portanto a maior parte do ganho ocorreu no gap do overnight, antes de qualquer barra em horário regular. O QQQ fechou em alta em 10 dessas sessões: um mês de equilíbrio.
Amplitude: qual foi a abrangência do rali?
Um ativo é considerado um "advancer" se o seu fechamento de segunda-feira superou o de sexta-feira, entre nomes com volume de pelo menos US$ 1 milhão — um filtro que remove 5,108 de 11,475 tickers com movimentação em ambas as sessões.
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-27 00:00:00')) AS friday_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') AS monday_dollar_volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE (window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
GROUP BY ticker
)
SELECT
countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000) AS advancers,
countIf(monday_close < friday_close AND monday_dollar_volume >= 1000000) AS decliners,
countIf(monday_close = friday_close AND monday_dollar_volume >= 1000000) AS unchanged,
countIf(monday_dollar_volume >= 1000000) AS liquid_tickers,
count() AS tickers_traded_both_sessions,
reverse(arrayStringConcat(extractAll(reverse(toString(count())), '[0-9]{1,3}'), ',')) AS tickers_traded_both_sessions_label,
count() - countIf(monday_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
reverse(arrayStringConcat(extractAll(reverse(toString(count() - countIf(monday_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS dropped_by_liquidity_filter_label,
round(100.0 * countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000)
/ countIf(monday_dollar_volume >= 1000000), 1) AS advancer_pct
FROM per_ticker
WHERE friday_close > 0 AND monday_close > 03968 advancers, 2327 decliners, 72 estáveis: 62.3% do tape líquido subiu — contados um a um, um dia de ampla abrangência.
Setor por setor: o rali foi mais restrito do que parecia
Contar o número de ativos de forma igualitária é uma visão; ponderá-los pelo tamanho da empresa é outra. Os onze ETFs de setores da SPDR representam a segunda abordagem — uma cesta ponderada pelo valor de mercado para cada setor do S&P 500. Eles divergem drasticamente da contagem de amplitude.
O SQL exato por trás de cada número
WITH per_etf AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') / 1e6, 0) AS dollar_volume_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
GROUP BY ticker
)
SELECT
sector,
ticker,
round((monday_close / friday_close - 1) * 100, 2) AS pct_change,
round((day_high / day_low - 1) * 100, 2) AS range_pct,
dollar_volume_m,
round((monday_close / friday_close - 1) * 100 - min((monday_close / friday_close - 1) * 100) OVER (), 2) AS pct_above_worst_sector
FROM (
SELECT *,
multiIf(ticker = 'XLB', 'Materials',
ticker = 'XLC', 'Communication services',
ticker = 'XLE', 'Energy',
ticker = 'XLF', 'Financials',
ticker = 'XLI', 'Industrials',
ticker = 'XLK', 'Technology',
ticker = 'XLP', 'Consumer staples',
ticker = 'XLRE', 'Real estate',
ticker = 'XLU', 'Utilities',
ticker = 'XLV', 'Health care',
'Consumer discretionary') AS sector
FROM per_etf
)
ORDER BY pct_change DESCTecnologia liderou com 2.52%, o setor de consumo discricionário veio em seguida com 2.37%; materiais fechou em -1.82% e o setor imobiliário em -0.64%. A diferença entre o melhor e o pior — a dispersão setorial do dia — foi de 4.34 pontos percentuais, com os setores de utilidades, bens de consumo, energia, imobiliário e materiais todos em queda em um dia de alta do índice. Amplo em número de ativos, restrito em peso: é isso que o ganho de um fundo de índice pode esconder.
O destaque do dia: memória e armazenamento
Quatro nomes negociaram o mesmo tema com resultados muito diferentes — houve apenas co-movimento e magnitude; os dados não explicam o motivo.
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-27 00:00:00')) AS friday_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-29 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-29 00:00:00') AS high_bar
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(friday_close, 2) AS jun26_close,
round(monday_close, 2) AS jun29_close,
round((monday_close / friday_close - 1) * 100, 2) AS pct_chg,
round(day_high, 2) AS day_high,
formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
round(day_low, 2) AS day_low,
formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
round((day_high / day_low - 1) * 100, 2) AS range_pct
FROM per_name
ORDER BY tickerA MU é o caso clássico de amplitude versus variação líquida: uma amplitude intraday de 12.22% — mínima de $1023.65 às 10:18 ET e máxima de $1148.79 às 15:59 — mas fechamento 1.97% acima de sexta-feira. A Western Digital subiu 11.15% e a Seagate 8.17%; a SanDisk fechou -1.9% dentro de uma amplitude de 10.33% — o único fechamento em baixa do grupo. O fechamento esconde a volatilidade enfrentada pelos detentores.
Onde o dinheiro foi negociado
Em volume financeiro, a Micron (MU) superou todos os outros ativos, incluindo fundos de índice: $58.47 bilhões contra os $33.97 bilhões do SPY. Em número de ações, o cenário foi diferente.
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-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY dollar_volume_bn DESC
LIMIT 6
UNION ALL
SELECT
'by shares traded' AS leaderboard,
ticker,
round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY shares_m DESC
LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESCDados de contagem de ações podem induzir ao erro: os líderes de volume foram o SOXS, um ETF inverso de semicondutores com alavancagem de 3x (695.3 milhões de ações), e a INLF, uma penny stock cujas 353.8 milhões de ações valeram cerca de $23 milhões durante todo o dia. O volume financeiro mostra para onde o dinheiro se moveu; o volume relativo mostra se a atividade de um ticker é incomum para ele mesmo.
Nos intervalos de 30 minutos de Nova York, o dia 29 de junho apresenta o clássico "sorriso" de volume:
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,
round(100 * (sum(toFloat64(volume)) / min(sum(toFloat64(volume))) OVER () - 1), 1) AS pct_above_trough
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY et_time
ORDER BY et_time2.3 bilhões de ações na primeira meia hora, um vale de 0.77 bilhões às 13:30, e o maior intervalo — 2.39 bilhões — na última meia hora, onde se concentram as leilões de fechamento e os fluxos de rastreamento de índices.
O fluxo de opções
Foram negociados 66.33 milhões de contratos em 11.04 milhões de registros.
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-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY ticker
ORDER BY sum(size) DESC
LIMIT 1
) AS top_contract,
(
SELECT round(toFloat64(argMax(close, window_start)), 2)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
) AS spy_regular_close
SELECT
round(count() / 1e6, 2) AS option_prints_m,
round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
round(100.0 * sumIf(size, option_type = 'C') / sum(size), 1) AS call_pct_of_volume,
round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260629') / sum(size), 1) AS same_day_expiry_pct,
round(toFloat64(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260702')) / 1e6, 2) AS thu_jul2_expiry_contracts_m,
countIf(substring(ticker, length(ticker) - 14, 6) = '260703') AS fri_jul3_expiry_prints,
countIf(sip_timestamp < '2026-06-29 13:30:00') AS premarket_prints,
reverse(arrayStringConcat(extractAll(reverse(toString(countIf(sip_timestamp < '2026-06-29 13:30:00'))), '[0-9]{1,3}'), ',')) AS premarket_prints_label,
countIf(sip_timestamp < '2026-06-29 13:30:00'
AND underlying_symbol NOT IN ('SPX', 'SPXW', 'XSP', 'RUTW', 'VIX', 'VIXW')) AS premarket_non_index_prints,
arrayStringConcat(arraySort(groupUniqArrayIf(underlying_symbol, sip_timestamp < '2026-06-29 13:30:00')), ', ') AS premarket_underlyings,
round(toFloat64(sumIf(size, underlying_symbol = 'SPY')) / 1e6, 2) AS spy_contracts_m,
round(toFloat64(sumIf(size, underlying_symbol = 'QQQ')) / 1e6, 2) AS qqq_contracts_m,
top_contract.1 AS top_contract_underlying,
top_contract.2 AS top_contract_strike,
top_contract.3 AS top_contract_type,
top_contract.4 AS top_contract_expiry,
top_contract.5 AS top_contract_volume,
reverse(arrayStringConcat(extractAll(reverse(toString(assumeNotNull(top_contract.5))), '[0-9]{1,3}'), ',')) AS top_contract_volume_label,
round(top_contract.7, 3) AS top_contract_avg_price,
round(top_contract.2 - spy_regular_close, 2) AS top_strike_minus_spy_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'As calls representaram 55.7% do volume de contratos, e 35.8% de tudo o que foi negociado expirou naquele mesmo lunes — a parte sobre opções de vencimento no mesmo dia (0DTE). O contrato individual mais negociado foi a call de SPY $741 com vencimento no mesmo dia: 788,133 contratos com prêmio médio de $0.474, com o fechamento do SPY ficando 0.12 dólares abaixo do strike — a opção mais negociada do dia terminou out of the money. O SPY teve 12.01 milhões de contratos como ativo subjacente; o QQQ teve 7.32 milhões.
O painel também contabiliza 40,621 registros de opções antes da abertura do mercado de ações às 9:30 — todos em índices de liquidação financeira (RUTW, SPX, SPXW, VIX, VIXW, XSP), com 0 registros de opções de ações ou ETFs no mesmo período. Isso é uma regra, não um acidente: opções de índices possuem sessões de negociação global estendidas, enquanto opções de ações e ETFs abrem junto com o mercado de ações. As ações negociam cedo — veja negociações em premarket e after-hours — as opções delas não.
Nenhum contrato com código de vencimento em sexta-feira, 3 de julho, foi registrado durante o dia (0 registros) — o mercado estará fechado nessa sexta-feira — enquanto o vencimento de quinta-feira, 2 de julho, negociou 10.73 milhões.
O tape de cotações: o custo da operação no dia
Cada preço nesta página baseia-se em um fluxo de cotações — o National Best Bid and Offer, republicado continuamente para cada ativo listado. A diferença entre o melhor bid e o melhor offer, o bid-ask spread, é o que uma ordem paga para ser executada.
O SQL exato por trás de cada número
SELECT
ticker,
round(count() / 1e6, 2) AS nbbo_updates_m,
round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00'), 2) AS open_30min_spread_bps,
round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS midday_spread_bps,
round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00')
- quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS open_minus_midday_bps,
countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid_quotes
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'MU', 'WDC')
AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY tickerA mediana da largura das cotações do SPY foi de 0.41 pontos-base do seu preço médio, contra 0.84 para o QQQ, 4.6 para a Micron e 8.2 para a Western Digital — a maior entre as quatro. Um ponto-base de uma ordem de $10.000 é um dólar; portanto, comprar e vender instantaneamente $10.000 de SPY nas cotações custa cerca de $0.41; o mesmo round trip na Western Digital custa $8.2. O tamanho da operação não mudou; o ativo sim.
Todos os quatro apresentaram cotações mais largas na primeira meia hora do que no período de controle do meio-dia — SPY 0.41 bps contra 0.27, Western Digital 14.33 contra 7.55, um prêmio de abertura de 6.78 bps no ativo com maior spread. O churn é a outra metade: 3.98 milhões de atualizações de NBBO no SPY em horário regular, 4.42 milhões no QQQ.
Taxas: a curva quase não se moveu
Os Treasuries tiveram uma segunda-feira calma. Os yields são os fechamentos diários, variando em relação a 26 de junho.
O SQL exato por trás de cada número
SELECT
t.1 AS curve_point,
round(t.2, 2) AS jun29_yield_pct,
round((t.2 - t.3) * 100) AS one_day_change_bp
FROM (
SELECT arrayJoin([
('1 month', toFloat64(mon.yield_1_month), toFloat64(fri.yield_1_month)),
('3 month', toFloat64(mon.yield_3_month), toFloat64(fri.yield_3_month)),
('1 year', toFloat64(mon.yield_1_year), toFloat64(fri.yield_1_year)),
('2 year', toFloat64(mon.yield_2_year), toFloat64(fri.yield_2_year)),
('5 year', toFloat64(mon.yield_5_year), toFloat64(fri.yield_5_year)),
('10 year', toFloat64(mon.yield_10_year), toFloat64(fri.yield_10_year)),
('30 year', toFloat64(mon.yield_30_year), toFloat64(fri.yield_30_year)),
('2s10s spread', toFloat64(mon.yield_10_year - mon.yield_2_year), toFloat64(fri.yield_10_year - fri.yield_2_year))
]) AS t
FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-29') AS mon,
(SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-26') AS fri
)O título de 10 anos fechou em 4.38%, sem alteração no dia (0 bp), enquanto o título de 3 meses somou 4 bp para 3.87%. O 2s10s spread — o de 10 anos menos o de 2 anos — fechou em 0.28 pontos percentuais (-3 bp): ainda positivo, levemente mais plano.
O calendário por trás do dia
O SQL exato por trás de cada número
WITH
(
SELECT (argMax(d, n), max(n))
FROM (
SELECT ex_dividend_date AS d, count() AS n
FROM global_markets.stocks_dividends
WHERE ex_dividend_date BETWEEN '2026-06-22' AND '2026-07-02'
GROUP BY d
)
) AS peak_ex_div,
(
SELECT (countIf(form_type = '424B2'), countIf(form_type = '4'), countIf(form_type = '8-K'), count())
FROM global_markets.stocks_sec_edgar_index
WHERE filing_date = '2026-06-29'
) AS filings,
(
SELECT (count(), uniqExact(publisher), countIf(has(tickers, 'NVDA')))
FROM global_markets.stocks_news
WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
) AS news,
(
SELECT max(n)
FROM (
SELECT t, count() AS n
FROM (
SELECT arrayJoin(tickers) AS t
FROM global_markets.stocks_news
WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
)
WHERE t NOT IN ('NVDA', 'SPCX')
GROUP BY t
)
) AS runner_up_articles,
(
SELECT (any(split_from), any(split_to), count())
FROM global_markets.stocks_splits
WHERE ticker = 'HON' AND execution_date = '2026-06-29'
) AS hon_split,
(
SELECT (
round(toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')), 2),
round(toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')), 2)
)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'HON'
AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
) AS hon_close
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29') AS ex_dividend_records_jun29,
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29'
AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
'SPY', 'QQQ', 'DIA', 'IWM', 'VTI')) AS household_name_ex_dividends,
length(['AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
'SPY', 'QQQ', 'DIA', 'IWM', 'VTI']) AS household_names_checked,
concat(monthName(peak_ex_div.1), ' ', toString(toDayOfMonth(peak_ex_div.1))) AS busiest_ex_div_day_of_window,
peak_ex_div.2 AS busiest_ex_div_day_records,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-29') AS splits_executed,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-29') AS ipos_listed_jun29,
(SELECT arrayStringConcat(groupArray(ticker), ', ') FROM (
SELECT ticker FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-01' ORDER BY ticker
)) AS jul1_ipo_debuts,
filings.4 AS sec_filings,
filings.1 AS prospectus_424b2_filings,
filings.2 AS insider_form4_filings,
filings.3 AS filings_8k,
news.1 AS news_articles,
news.2 AS news_publishers,
news.3 AS nvda_articles,
runner_up_articles AS next_most_covered_articles,
news.3 - runner_up_articles AS nvda_minus_next_most_covered,
hon_split.3 AS hon_split_records,
hon_split.1 AS hon_split_from,
hon_split.2 AS hon_split_to,
hon_close.1 AS hon_close_jun26,
hon_close.2 AS hon_close_jun29449 registros de dividendos ficaram ex-dividend em 29 de junho — é necessário possuir a ação antes da data ex-dividend para ter direito ao pagamento — mas entre as 25 empresas conhecidas que analisamos, 0 apareceram. O volume de fechamento de trimestre atingiu o pico com 745 registros em July 1. 23 splits foram executados e 0 IPOs foram listados, com estreias para quarta-feira (BSP, ITG, LIME) já no calendário.
A SEC registrou 6173 documentos com data de 29 de junho: 1473 suplementos de precificação de produtos estruturados (form 424B2) e 1277 relatórios de negociação de insiders (Form 4) superam os 231 8-Ks que costumam virar notícia. Nosso feed de notícias trouxe 170 artigos de 3 publishers; excluindo um símbolo reutilizado com tag ambígua (removido na consulta), o nome mais coberto foi NVDA com 14 artigos contra os 12 do segundo colocado.
Notas de dados
Dados atípicos recebem uma nota, nunca uma exclusão silenciosa — estes quatro afetam os números principais.
- As cestas setoriais seguem um método declarado. "Setor" refere-se aos onze ETFs setoriais da SPDR, ponderados por valor de mercado — os mesmos nomes de cada sessão, não uma classificação por ticker de um fornecedor.
- O volume em dólar é um proxy por minuto — preço de fechamento × volume somados por barra de um minuto, próximo mas não idêntico à soma dos valores de execução.
- Os spreads cotados excluem cotações inválidas (registros NBBO de um lado só ou cruzados); o painel contabiliza o que foi descartado (1544 no SPY). A largura mediana da cotação é uma estatística de cotação, não um custo por operação — ordens frequentemente são executadas dentro da cotação.
- Uma única operação pode contaminar a máxima ou a mínima de uma barra de um minuto. A barra das 11:07 ET do QQQ apresenta uma mínima de $709.58, enquanto nenhuma barra adjacente caiu abaixo de $715.09 — uma operação de $5.51 abaixo do mercado no mesmo período. Todas as máximas e mínimas acima foram verificadas contra barras adjacentes; a mínima da sessão do QQQ de $705.172 foi validada.
Notas de dados completas
- A cobertura de Treasuries é menor que o esquema. Quatro vencimentos anunciados (6 meses, 3, 7 e 20 anos) nunca foram preenchidos; a curva mostra os sete existentes, além da linha 2s10s.
- Um "reverse split" da Honeywell contradiz o tape. O feed contém o registro 1 da HON datado de 29 de junho: um reverse split convertendo 2 ações antigas em 1 novas. A HON fechou a $231.3 na sexta e a $227.71 na segunda — sem duplicar o valor. Não aplicamos o ajuste.
- A contagem de notícias é de um fornecedor, os 3 editores que utilizamos — não "todas as notícias do mercado".
- Os registros em nível de tick — cotações cruzadas, a correção de volume fantasma, o arquivo truncado de short-volume da FINRA (e por que short volume não é short interest) — estão em análise detalhada.
A sessão, verificada
O SQL exato por trás de cada número
WITH
(
SELECT (
round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') = '11:07')), 2),
round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') IN ('11:04', '11:05', '11:06', '11:08', '11:09', '11:10'))), 2)
)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'QQQ' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
) AS qqq_lone
SELECT
(SELECT count() FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-03 00:00:00' AND window_start < '2026-07-04 00:00:00') AS jul3_spy_bars,
formatDateTime(min(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS first_spy_bar_et,
formatDateTime(max(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS last_spy_bar_et,
count() AS spy_minute_bars,
countIf(window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00') AS regular_session_bars,
qqq_lone.1 AS qqq_1107_lone_low,
qqq_lone.2 AS qqq_1107_adjacent_bars_low,
round(qqq_lone.2 - qqq_lone.1, 2) AS qqq_lone_print_below_adjacent
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-29 00:00:00' AND window_start < '2026-06-30 00:00:00'As barras do SPY ocorrem de 04:00 a 19:59 no horário de Nova York, com exatamente 390 barras em janela regular — uma sessão completa, verificada pelo tape (o conjunto de dados do calendário da bolsa contém apenas fechamentos futuros). Naquela sexta-feira, 3 de julho, houve um fechamento completo — as barras do SPY registraram 0 durante todo o dia, com o dia 4 de julho caindo em um sábado; a semana de quatro sessões tem seu próprio resumo.
FAQ
Como foi o desempenho do mercado de ações em 29 de junho de 2026?
O dia foi de alta, liderado pelo setor de crescimento: o QQQ fechou 2.57% acima de sexta-feira, o SPY 1.62%, o DIA 0.81% e o IWM 0.45%, com 62.3% dos tickers com volume de US$ 1 milhão ou mais terminando em alta.
O dia 29 de junho de 2026 foi um dia importante para o Nasdaq?
Importante, mas não excepcional: a variação de fechamento sobre fechamento do QQQ de 2.57% ocupou a posição 5 entre as 21 sessões do último mês em termos de tamanho absoluto, comparado à máxima mensal de 4.76%.
Quais setores lideraram em 29 de junho de 2026?
Tecnologia (2.52%) e consumo discricionário (2.37%) lideraram as onze cestas de setores da SPDR; materiais ficou em último com -1.82%, um spread de 4.34 pontos percentuais. Utilities, bens de consumo, energia e real estate também fecharam em queda.
Qual foi a participação do volume de opções 0DTE em 29 de junho de 2026?
As opções com vencimento no mesmo dia representaram 35.8% dos 66.33 milhões de contratos negociados; o contrato individual mais movimentado, uma call de SPY de US$ 741 com vencimento no mesmo dia (788,133 contratos), terminou fora do dinheiro.
Por que as opções são negociadas antes da abertura do mercado de ações?
Apenas as opções de índice. Todas as 40,621 negociações de opções antes das 9:30 a.m. ET em 29 de junho ocorreram em índices com liquidação em dinheiro (RUTW, SPX, SPXW, VIX, VIXW, XSP), que listam sessões de horário de negociação global estendido; as negociações de opções de ações e ETF nesse intervalo somaram 0.
Metodologia
- Os timestamps são armazenados em UTC e convertidos para o horário de Nova York nas consultas. O "Close" refere-se ao último minuto da sessão regular, não ao print do leilão; as variações diárias comparam 29 de junho com 26 de junho, e a sessão foi verificada pelo intervalo de barras observado.
- O ranking do mês anterior utiliza as variações de fechamento sobre fechamento em horário regular, descartando a primeira sessão (sem fechamento anterior dentro do período). Os vencimentos de opções são reprocessados a partir do ticker da OCC (a coluna de vencimento da própria tabela apresenta erro).
- Cada painel é lido uma única vez, no momento da elaboração, através do caminho de leitura restrito. Estado do warehouse 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: 30 de junho.