Récapitulatif marché 29 juin 2026 chiffres clés
Analyse du 29 juin 2026 : hausse des indices, spread sectoriel de quatre points, retournement d'une action mémoire, flux 0DTE et cotations penny-tight.
Le lundi 29 juin 2026 a été une journée de hausse portée par la croissance, avec une concentration étroite des gains : le QQQ a progressé de 2.57%, le SPY de 1.62%, et 3968 titres liquides ont progressé face à 2327 titres en baisse — pourtant, près de la moitié des paniers sectoriels ont clôturé en territoire négatif. Chaque chiffre est extrait d'une requête stockée ; développez n'importe quel panneau pour accéder au SQL. La couche tick-by-tick de cette même session : l'analyse approfondie de la microstructure du 29 juin.
Le tableau de bord
Chaque variation compare la dernière bougie de la séance régulière du 29 juin à celle du vendredi 26 juin.
Le SQL exact derrière chaque chiffre
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.tickerLe SPY a ouvert à 736.525 contre une clôture de 729.09 vendredi, et a terminé à 740.88, sous son plus haut de 741.56. La performance de +2.57% du QQQ face au +0.81% du DIA caractérise une journée axée sur la croissance et la tech ; l'IWM (small-cap) a progressé de 0.45%.
La journée était-elle inhabituelle ?
Une variation en pourcentage n'a que peu de sens sans point de comparaison. Ce tableau classe la journée du 29 juin par rapport au mois précédent selon la taille absolue de la variation de clôture à clôture.
Le SQL exact derrière chaque chiffre
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)Une variation importante, mais pas record : le mouvement de 2.57% de QQQ se classe dans les 5 des sessions de 21 depuis May 29, 2026, dans un mois dont la plus forte variation unique était de 4.76% ; le mouvement de 1.62% de SPY se classe dans les 4 des 21. L'origine du mouvement est déterminante : la progression de SPY entre l'ouverture et la clôture n'était que de 0.59%, la majeure partie du gain provenant donc du gap de nuit, avant la première bougie en séance régulière. QQQ a clôturé en hausse lors de 10 de ces sessions : un mois équivalent à un pile ou face.
Breadth : quelle était l'ampleur du rallye ?
Un actionnaire est un ticker dont la clôture du lundi est supérieure à celle du vendredi, parmi les titres échangés à au moins un million de dollars — un filtre qui exclut 5,108 de 11,475 tickers sur deux sessions.
Le SQL exact derrière chaque chiffre
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 haussiers, 2327 baissiers, 72 inchangés : 62.3% de la tape liquide a progressé — comptabilisés un par un, une journée de large étendue.
Par secteur : le rally était moins large qu'il n'y paraissait
Le comptage par nombre de titres est une approche ; la pondération par capitalisation boursière en est une autre. Les onze ETF sectoriels SPDR représentent la seconde méthode — un panier par secteur de l'S&P 500, pondéré par la capitalisation. Ces données divergent fortement du comptage par nombre de titres.
Le SQL exact derrière chaque chiffre
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 DESCLa technologie a progressé de 2.52%, suivie par la consommation discrétionnaire à 2.37% ; les matériaux ont clôturé à -1.82% et l'immobilier à -0.64%. La dispersion sectorielle — l'écart entre le meilleur et le pire — s'est établie à 4.34 points de pourcentage, avec les services publics, la consommation de base, l'énergie, l'immobilier et les matériaux tous en baisse malgré la hausse de l'indice. Une large progression en nombre de titres, mais étroite en pondération : voilà ce que la performance d'un fonds indiciel peut masquer.
L'essentiel de la journée : mémoire et stockage
Quatre titres ont suivi la même thématique avec des résultats très différents — une corrélation et une amplitude uniquement ; les données n'expliquent pas la cause.
Le SQL exact derrière chaque chiffre
WITH per_name AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-29 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-29 00:00:00') AS high_bar
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(friday_close, 2) AS jun26_close,
round(monday_close, 2) AS jun29_close,
round((monday_close / friday_close - 1) * 100, 2) AS pct_chg,
round(day_high, 2) AS day_high,
formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
round(day_low, 2) AS day_low,
formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
round((day_high / day_low - 1) * 100, 2) AS range_pct
FROM per_name
ORDER BY tickerMU illustre parfaitement la différence entre l'amplitude et la variation nette : une amplitude intraday de 12.22% — un point bas de $1023.65 à 10:18 ET, un point haut de $1148.79 à 15:59 — mais une clôture 1.97% supérieure à celle de vendredi. Western Digital a progressé de 11.15% et Seagate de 8.17% ; SanDisk a clôturé à -1.9% sur une amplitude de 10.33% — la seule clôture en baisse du groupe. La clôture occulte la volatilité subie par les détenteurs.
Où les capitaux ont été échangés
En volume de transactions en dollars, Micron (MU) a dominé le marché, y compris les fonds indiciels : 58.47 milliards de dollars contre 33.97 milliards pour le SPY. En nombre d'actions, la situation était différente.
Le SQL exact derrière chaque chiffre
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) DESCLes classements par nombre d'actions peuvent être trompeurs : les leaders étaient SOXS, un ETF inverse à effet de levier de 3x (695.3 millions d'actions), et INLF, une penny stock dont les 353.8 millions d'actions valaient environ 23 millions de dollars sur la journée. Le volume en dollars indique la direction des flux de capitaux ; le volume relatif indique si l'activité d'un titre est inhabituelle pour ce titre.
Dans les tranches de 30 minutes de New York, le 29 juin présente le "smile" de volume classique :
Le SQL exact derrière chaque chiffre
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 milliards d'actions durant la première demi-heure, un creux de 0.77 milliard à 13:30, et la tranche la plus importante — 2.39 milliard — durant la dernière demi-heure, où se concentrent les enchères de clôture et les flux indiciels.
Le carnet des options
Les options ont enregistré 66.33 millions de contrats sur 11.04 millions de transactions.
Le SQL exact derrière chaque chiffre
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'Les calls représentaient 55.7% du volume de contrats, et 35.8% de l'ensemble des échanges ont expiré ce même lundi — le partage sur les options à expiration le jour même (0DTE). Le contrat individuel le plus actif était le call SPY $741 à expiration le jour même : 788,133 contrats avec une prime moyenne de $0.474, alors que la clôture du SPY s'est établie 0.12 dollars en dessous du strike — l'option la plus échangée de la journée a terminé "out of the money". Le SPY a échangé 12.01 millions de contrats en tant que sous-jacent ; le QQQ 7.32 millions.
Le panel comptabilise également 40,621 transactions d'options avant l'ouverture des actions à 9h30 — toutes sur un indice à règlement en espèces (RUTW, SPX, SPXW, VIX, VIXW, XSP), avec 0 transactions d'options sur actions ou ETF sur la même période. Ce n'est pas un hasard mais une règle : les options sur indices s'étendent sur les sessions de trading mondiales, tandis que les options sur actions et ETF ouvrent avec le marché boursier. Les actions s'échangent en avance — voir le trading en pré-marché et après-séance — pas leurs options.
Aucun contrat avec une date d'expiration au vendredi 3 juillet n'a été échangé de la journée (0 transactions) — le marché est fermé ce vendredi — tandis que l'expiration du jeudi 2 juillet a échangé 10.73 millions de contrats.
The quote tape: what the day cost to trade
Every price on this page sits on a quote stream — the National Best Bid and Offer, re-published continuously for every listed name. The gap between best bid and best offer, the bid-ask spread, is what an order pays to cross.
Le SQL exact derrière chaque chiffre
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 tickerSPY's median quoted width was 0.41 basis points of its mid-price, against 0.84 for QQQ, 4.6 for Micron and 8.2 for Western Digital — the widest of the four. One basis point of a $10,000 order is one dollar, so buying and instantly selling $10,000 of SPY at the quote costs about $0.41; the same round trip in Western Digital costs $8.2. The trade size did not change; the name did.
All four quoted wider in the opening half hour than in the midday control window — SPY 0.41 bps against 0.27, Western Digital 14.33 against 7.55, a 6.78 bp opening premium on the widest name. Churn is the other half: 3.98 million NBBO updates on SPY in regular hours, 4.42 million on QQQ.
Taux : la courbe a peu bougé
Les Treasuries ont connu un lundi calme. Les rendements sont basés sur les clôtures quotidiennes, par rapport au 26 juin.
Le SQL exact derrière chaque chiffre
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
)Le titre à 10 ans a clôturé à 4.38%, inchangé sur la journée (0 bp), tandis que le billet à 3 mois a progressé de 4 bp pour atteindre 3.87%. Le spread 2s10s — la différence entre le 10 ans et le 2 ans — a clôturé à 0.28 points de pourcentage (-3 bp) : il reste positif, mais s'aplatit légèrement.
Le calendrier de la journée
Le SQL exact derrière chaque chiffre
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 dates de référence de dividendes sont passées en date ex-dividend le 29 juin — vous devez détenir l'action avant la date ex-dividend pour recevoir le paiement — pourtant, parmi les 25 noms familiers que nous avons examinés, 0 sont apparus. La vague de fin de trimestre a atteint un pic de 745 dates de référence le July 1. 23 splits ont été exécutés et 0 IPO ont été cotées ; les débuts de mercredi (BSP, ITG, LIME) sont déjà inscrits au calendrier.
La SEC a enregistré 6173 dépôts datés du 29 juin : 1473 suppléments de tarification de produits structurés (formulaire 424B2) et 1277 rapports de transactions d'initiés (Form 4) surpassent largement les 231 8-Ks qui font la une. Notre flux d'actualités a diffusé 170 articles provenant de 3 éditeurs ; en excluant un symbole réutilisé avec un étiquetage ambigu (supprimé de la requête), le nom le plus couvert était NVDA avec 14 articles contre 12 pour le second.
Notes sur les données
Toute donnée aberrante fait l'objet d'une note, elle n'est jamais exclue silencieusement — ces quatre points impactent les chiffres principaux.
- Les paniers sectoriels suivent une méthode déclarée. Le terme « secteur » désigne les onze ETF sectoriels SPDR, pondérés par la capitalisation boursière — les mêmes noms chaque session, et non une classification par ticker d'un fournisseur.
- Le volume en dollars est un indicateur par minute — cours de clôture × volume cumulés par barre de minute ; c'est une valeur proche, mais non identique, de la somme des valeurs d'exécution.
- Les spreads cotés excluent les cotations invalides (enregistrements NBBO unilatéraux ou croisés) ; le panel comptabilise ce qu'il a rejeté (1544 sur SPY). La largeur médiane du spread est une statistique de cotation, pas un coût par transaction — les ordres s'exécutent souvent à l'intérieur du spread.
- Une transaction isolée peut fausser le plus ou le moins d'une barre de minute. La barre de 11:07 ET de QQQ affiche un plus bas de $709.58 alors qu'aucune barre adjacente n'est descendue sous $715.09 — une transaction de $5.51 sous le marché au même moment. Chaque plus haut et chaque plus bas a été vérifié par rapport aux barres adjacentes ; le plus bas de session de QQQ à $705.172 a été validé.
Notes complètes sur les données
- La couverture des Treasuries est plus restreinte que le schéma. Quatre échéances annoncées (6 mois, 3, 7 et 20 ans) n'ont jamais été renseignées ; la courbe affiche les sept échéances existantes, plus la ligne 2s10s.
- Une "division inversée" (reverse split) de Honeywell contredit la série. Le flux contient l'enregistrement 1 de HON daté du 29 juin : une division inversée convertissant 2 anciennes actions en 1 nouvelles. HON a clôturé à $231.3 vendredi et $227.71 lundi — sans doublement. Nous ne l'avons pas appliquée.
- Le nombre d'actualités provient du flux d'un seul fournisseur, les 3 éditeurs que nous utilisons — et non de "toutes les actualités du marché".
- Les données au tick — cotations croisées, correction du volume fantôme, fichier FINRA short-volume tronqué (et pourquoi le short volume n'est pas le short interest) — se trouvent dans l'analyse approfondie.
La session, vérifiée
Le SQL exact derrière chaque chiffre
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'Les bougies du SPY s'étendent de 04:00 à 19:59 heure de New York avec exactement 390 bougies en session régulière — une session complète, vérifiée par le tape (le jeu de données du calendrier de la bourse ne contient que les clôtures à venir). Ce vendredi 3 juillet était une journée complète de clôture — 0 les bougies du SPY ont été imprimées toute la journée, le 4 juillet tombant un samedi ; la semaine de quatre sessions a son propre récapitulatif.
FAQ
Quel a été l'état du marché boursier le 29 juin 2026 ?
Une journée positive portée par la croissance : le QQQ a clôturé à 2.57% au-dessus de vendredi, le SPY à 1.62%, le DIA à 0.81% et l'IWM à 0.45%, avec 62.3% des tickers échangeant pour 1 million de dollars ou plus finissant en hausse.
Le 29 juin 2026 a-t-il été une journée importante pour le Nasdaq ?
Importante, mais pas exceptionnelle : le mouvement de clôture sur clôture du QQQ de 2.57% se classe au 5 des sessions du mois écoulé selon la taille absolue de son 21, par rapport à un maximum mensuel de 4.76%.
Quels secteurs ont été les moteurs le 29 juin 2026 ?
La technologie (2.52%) et la consommation discrétionnaire (2.37%) ont mené les onze paniers sectoriels SPDR ; les matériaux étaient en dernière position à -1.82%, soit un spread de 4.34 points de pourcentage. Les services publics, la consommation de base, l'énergie et l'immobilier ont également clôturé en baisse.
Quelle part du volume des options le 29 juin 2026 était composée de 0DTE ?
Les expirations le jour même représentaient 35.8% des 66.33 millions de contrats échangés ; le contrat individuel le plus actif, un call SPY à 741 $ (788,133 contrats) expirant le jour même, a fini out of the money.
Pourquoi les options s'échangent-elles avant l'ouverture du marché boursier ?
Seules les options sur indices le font. Toutes les transactions d'options 40,621 avant 9h30 ET le 29 juin reposaient sur des indices à règlement en espèces (RUTW, SPX, SPXW, VIX, VIXW, XSP), qui listent des sessions d'horaires de trading mondiaux étendus ; les transactions d'options sur actions et ETF dans ce créneau étaient de 0.
Méthodologie
- Les horodatages sont stockés en UTC, puis convertis en heure de New York lors de l'exécution des requêtes. La "clôture" correspond à la dernière bougie d'une minute de la séance régulière, et non au résultat de l'enchère. Les variations journalières comparent le 29 juin au 26 juin ; la séance a été vérifiée selon l'étendue des bougies observées.
- Le classement sur un mois glissant utilise les variations de clôture sur clôture durant les horaires réguliers ; la première séance est exclue (aucune clôture précédente n'est présente dans la période). Les échéances d'options sont extraites du ticker de l'OCC (la colonne d'échéance du tableau est erronée).
- Chaque panneau est lu une seule fois, au moment de la rédaction, via le canal de lecture seule sécurisé. État de l'entrepôt au 13 juillet 2026.
Chaque panneau est le résultat d'une requête stockée — comprenant le graphique, le tableau et le SQL dans un seul objet. Vous pouvez copier l'un d'eux dans le terminal Strasmore. Prochaine séance : 30 juin.