Récapitulatif marché du 30 juin 2026
Analyse de la dernière séance du trimestre : hausse des indices portée par la tech malgré un breadth négatif et une activité intense sur le marché des options.
Le mardi 30 juin 2026 — dernière séance du trimestre — a été une journée de hausse portée par la technologie dans un marché majoritairement rouge : le QQQ a gagné 1.63% et le SPY 0.73%, mais seulement 4 des fonds sectoriels du 10 S&P ont terminé en hausse (3,349 titres liquides en hausse, 3,033 en baisse). La séance précédente : le récapitulatif du 29 juin. Tous les chiffres ci-dessous proviennent d'une requête stockée — développez n'importe quel panneau pour voir le SQL.
Le tableau de bord
Chaque variation compare la dernière bougie de la séance régulière du 30 juin à celle du lundi 29 juin.
Le SQL exact derrière chaque chiffre
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.tickerLe SPY a ouvert à 741.29 $ et a clôturé à 746.32 $, près de son plus haut à 748.02 $. La performance de QQQ à 1.63% face à celle de DIA à 0.12% résume la journée : les valeurs de croissance ont progressé, les blue chips ont peu bougé, et l'IWM a fait 0.49%.
Clôture du trimestre
Le 30 juin a marqué la fin des 62 sessions du deuxième trimestre. La dynamique de la journée a reflété celle du trimestre.
Le SQL exact derrière chaque chiffre
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 ASCDu 1er avril au 30 juin : QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08%. Le QQQ a surperformé sur l'ensemble du trimestre et lors de la journée du 30 juin. Les positions relatives ont toutefois évolué : le SPY a légèrement battu l'IWM sur la journée, tandis que l'IWM a devancé le SPY sur le trimestre. Le QQQ a terminé en hausse sur 38 des 62 sessions (le récapitulatif du T2 présente l'analyse détaillée).
La journée était-elle inhabituelle ?
Le SQL exact derrière chaque chiffre
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
)L'évolution entre l'ouverture et la clôture de la séance — une perspective différente du rendement de clôture à clôture — le SPY a progressé de 0.68%, se classant au 7 rang sur 21 sessions précédentes en valeur absolue. L'indice était calme, mais la dynamique des transactions ne l'était pas.
Largeur de marché : un avantage positif limité
Le SQL exact derrière chaque chiffre
WITH per_ticker AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') AS day_dollar_volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00')
GROUP BY ticker
)
SELECT
countIf(day_close > prior_close AND day_dollar_volume >= 1000000) AS advancers,
countIf(day_close < prior_close AND day_dollar_volume >= 1000000) AS decliners,
countIf(day_close = prior_close AND day_dollar_volume >= 1000000) AS unchanged,
countIf(day_dollar_volume >= 1000000) AS liquid_tickers,
count() AS tickers_traded_both_sessions,
count() - countIf(day_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
round(100.0 * countIf(day_close > prior_close AND day_dollar_volume >= 1000000)
/ countIf(day_dollar_volume >= 1000000), 1) AS advancer_pct,
countIf(ticker IN ('XLB', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')) AS sector_funds_counted,
countIf(ticker IN ('XLB', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
AND day_close > prior_close) AS sector_funds_up
FROM per_ticker
WHERE prior_close > 0 AND day_close > 03,349 hausses, 3,033 baisses, 88 inchangés : 51.8% des titres du tape liquide ont progressé — un résultat aléatoire face à une hausse de l'indice de 1.63. Le filtre de liquidité exclut 5,055 des 11,525 tickers sur deux sessions (volume inférieur à 1 million de dollars), comptabilisés ici sans omission.
Par secteur : la répartition réelle des flux
Se baser uniquement sur le nombre de titres actifs occulte la répartition réelle des capitaux. Les dix fonds ci-dessous détiennent chacun une part du S&P 500 ; l'écart entre la performance la plus haute et la plus basse mesure l'hétérogénéité de la séance.
Le SQL exact derrière chaque chiffre
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 ASCLe secteur Technology (XLK) a progressé de 2.69% et s'est distingué : les secteurs Industrials 1.34%, Materials 0.36% et Discretionary 0.15% étaient les seuls autres en hausse. Le reste du marché est dans le rouge, des Financials (-0.17%) aux Utilities (-1.48%), en passant par les Consumer Staples (-1.53%) et enfin le Real Estate à -2%. Écart entre le meilleur et le pire : 4.69 points de pourcentage, 4 des 10 fonds sont en hausse. L'indice a progressé de moins d'un pour cent avec un spread de quatre points : un seul secteur a porté le marché.
Les plus fortes variations du jour, marché global
La breadth mesure le nombre de titres en hausse ; ce tableau présente les cinq plus fortes variations, à la hausse comme à la baisse, parmi les titres ayant échangé plus de 10 millions de dollars.
Le SQL exact derrière chaque chiffre
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 ASCAucun des deux marchés ne suit la tendance de l'indice. JEM a progressé de 256.76% avec 141 millions échangés ; SOC a perdu 55.89% sur 306 millions. ABVX a grimpé de 38.56% pour 942 millions, représentant le turnover le plus élevé des deux marchés ; NVCT a chuté de 35.62% et UNCY de 39.09%. La colonne des split évite les erreurs d'interprétation — un reverse split de 1 pour 10 affiche un "gain" de +900% sur un flux non ajusté — et chaque titre ici présente un 0 : des données réelles.
Trois lignes correspondent à deux transactions distinctes : CRCA (-35.16%) et CRCG (-35.19%) ont baissé tandis que CRCD a progressé de 35.47% — soit presque le double du mouvement de -17.53% du titre lié aux cryptos ci-dessous : les wrappers d'actions individuelles à effet de levier.
L'essentiel de la journée : les semi-conducteurs en plein pivot trimestriel
Six valeurs, un seul thème, des résultats très divergents — 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-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
maxIf(toFloat64(high), window_start >= '2026-06-30 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-30 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-30 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-30 00:00:00') AS high_bar,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') / 1e9, 2) AS day_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AMD', 'INTC', 'MU', 'SNDK', 'TSM', 'WDC')
AND ((window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(prior_close, 2) AS prior_close,
round(day_close, 2) AS day_close,
round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
round(day_high, 2) AS day_high,
formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
round(day_low, 2) AS day_low,
formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
round((day_high / day_low - 1) * 100, 2) AS range_pct,
day_dollar_bn
FROM per_name
ORDER BY tickerSanDisk a bondi de 10.79%, AMD de 7.7%, Intel de 5.93% et TSMC de 4.86% — tandis que MU, avec un volume d'échange de 37.41 milliards de dollars, a clôturé en hausse de seulement 0.52% et Western Digital (-2.01%) est restée stable. Voici les composantes du résultat du secteur technologie de 2.69% (MU en juin, tick par tick).
Une tendance inverse a touché les valeurs financières liées aux cryptomonnaies, à l'opposé de la tendance haussière du marché :
Le SQL exact derrière chaque chiffre
WITH per_name AS (
SELECT
ticker,
toFloat64(argMaxIf(close, window_start, window_start < '2026-06-30 00:00:00')) AS prior_close,
toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-30 00:00:00')) AS day_close,
maxIf(toFloat64(high), window_start >= '2026-06-30 00:00:00') AS day_high,
minIf(toFloat64(low), window_start >= '2026-06-30 00:00:00') AS day_low,
argMinIf(window_start, toFloat64(low), window_start >= '2026-06-30 00:00:00') AS low_bar,
argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-30 00:00:00') AS high_bar,
round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-30 00:00:00') / 1e9, 2) AS day_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('COIN', 'CRCL', 'HOOD', 'MSTR')
AND ((window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
OR (window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'))
GROUP BY ticker
)
SELECT
ticker,
round(prior_close, 2) AS prior_close,
round(day_close, 2) AS day_close,
round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
round(day_high, 2) AS day_high,
formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
round(day_low, 2) AS day_low,
formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
round((day_high / day_low - 1) * 100, 2) AS range_pct,
day_dollar_bn
FROM per_name
ORDER BY tickerCRCL a affiché -17.53%, avec un point bas de 62.52 dollars à 15:59 ET — la dernière minute de la séance — parallèlement à MSTR -6.2%, COIN -3.61% et HOOD -1.53%. Une corrélation a été observée, mais la cause n'est pas établie.
Contenu du flux d'actualités
Un récapitulatif qui refuse d'affirmer des causes doit au lecteur ce qui a été réellement publié ce jour-là.
Le SQL exact derrière chaque chiffre
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 ASCLe titre le plus couvert était NVDA avec 21 articles — sans être parmi les plus fortes variations de la journée — son dernier article de la session (16:28 ET, Investing.com) s'intitule "These Stocks Could Benefit as the Robotaxi Race Heats Up". MU a généré 7 articles ; l'unique article sur SanDisk (The Motley Fool) est le seul titre de la journée mentionnant un mouvement réel : "Why Sandisk Stock Is Skyrocketing Today".
Le constat est le suivant : le plus fort déclin, la plus forte hausse et le titre lié aux cryptos ayant subi la plus forte baisse ont généré 0, 0 et 0 articles — soit zéro article chacun, au sein d'un flux de 211 articles. La couverture médiatique n'est pas un indicateur du price action.
Flux de capitaux
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-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY dollar_volume_bn DESC
LIMIT 6
UNION ALL
SELECT
'by shares traded' AS leaderboard,
ticker,
round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY shares_m DESC
LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESCEn volume financier, MU a dominé le marché, y compris les fonds indiciels : 37.41 milliards de dollars contre 31.84 milliards pour le SPY. C'est la deuxième séance consécutive où son volume dépasse celui de l'ETF de référence (le récapitulatif de lundi contient le premier). Le carnet d'ordres présente une réalité différente : SOXS, un ETF inverse à effet de levier 3x (515.5 millions d'actions), et deux titres sous la barre du dollar dont le volume est négligeable face à celui de MU — le volume présente deux lectures.
Un titre est volontairement absent des deux tableaux : une introduction en bourse en juin dont le ticker appartenait auparavant à une autre société sans lien, ce qui amène les flux de données à identifier deux entités avec les mêmes trois lettres (détails ici).
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
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-30 13:30:00' AND window_start < '2026-06-30 20:00:00'
GROUP BY et_time
ORDER BY et_time2.05 milliards d'actions lors de la première demi-heure, un creux de 0.78 milliards à 13:30, et le volume principal de la journée — 2.69 milliards — lors de la clôture de fin de trimestre, où l'enchère de clôture et ses flux de rebalancing s'expriment (l'analyse approfondie du 29 juin détaille le sujet).
Le tape des options
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-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'61.95 millions de contrats ont été échangés via 10.06 millions de transactions. Les calls représentaient 57.3 du volume total, dont 28% ont expiré ce mardi. Le SPY a suivi une tendance inverse : 12.04 millions de contrats avec un ratio put/call de 1.09 — soit plus de puts que de calls, alors que le fonds progressait.
La comparaison entre les expirations du jour du SPY et sa clôture à $746.32 illustre le skew : 3.33 millions de puts out-of-the-money (strikes inférieurs à la clôture) et 2.28 millions de calls out-of-the-money, contre 1.77 millions de calls in-the-money et 0.63 millions de puts in-the-money. Les strikes à la baisse ayant expiré sans valeur constituaient la catégorie la plus active de la journée 0DTE du SPY. Aucun contrat avec une échéance au vendredi 3 juillet n'a été échangé (0 transactions — le marché est fermé ce vendredi) ; le weekly du jeudi a enregistré 10.52 millions.
Le SQL exact derrière chaque chiffre
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 ASCLe contrat le plus actif était le call SPY $747 à expiration le jour même — 821,361 contrats avec une prime moyenne de $0.641, terminant à $0.68 au-dessus de la dernière bougie régulière du SPY, et sans valeur. Les données confirment cette tendance : cinq des six contrats les plus échangés sur le tape étaient des strikes SPY à expiration le jour même, séparés d'un dollar autour de la clôture (SPY $748 call suivant), chacun s'échangeant pour quelques centimes. L'exception, représentant 65.1% du volume du leader, était le contrat KWEB $29 call expirant le December 18, 2026, qui n'était pas un contrat à expiration le jour même : une position à six mois parmi cinq tickets de loterie de l'après-midi.
Taux : la partie longue a progressé en fin de semestre
Le SQL exact derrière chaque chiffre
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
)La partie longue a progressé lors de la dernière journée du semestre : le 10 ans a augmenté de 6 bp pour atteindre 4.44%, le 2 ans de 4 bp pour atteindre 4.14%, et le spread 2s10s s'est accentué de 2 bp pour atteindre 0.3 points. Les rendements longs ont augmenté lors d'une séance où les secteurs les plus faibles, l'immobilier (-2%) et le troisième secteur le plus faible, les services publics (-1.48%), sont tous deux classiquement sensibles aux taux. Cette coïncidence est notable, bien que ces données ne permettent pas d'en prouver le mécanisme (le récapitulatif du S1 porte la courbe du semestre).
Le calendrier de la journée
Le SQL exact derrière chaque chiffre
WITH
(
SELECT (count(), uniqExact(publisher))
FROM global_markets.stocks_news
WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-30'
) AS news,
(
SELECT (argMax(t, n), max(n))
FROM (
SELECT t, count() AS n
FROM (
SELECT arrayJoin(tickers) AS t
FROM global_markets.stocks_news
WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-30'
)
WHERE t != 'SPCX'
GROUP BY t
)
) AS top_news
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-30') AS ex_dividend_records,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-30') AS splits_executed,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-30') AS ipos_listed,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS sec_filings,
(SELECT uniqExactIf(accession_number, form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS insider_form4_filings,
(SELECT uniqExactIf(accession_number, form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-06-30') AS filings_8k,
(SELECT arrayStringConcat(groupArray(concat(ticker, ' — ', issuer_name)), '; ') FROM (
SELECT ticker, issuer_name FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-30' ORDER BY ticker
)) AS ipo_names,
news.1 AS news_articles,
news.2 AS news_publishers,
top_news.1 AS most_covered_ticker,
top_news.2 AS most_covered_articles,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-29')) AS filings_prior_session704 dividend records sont passés en ex-dividend lors du dernier jour du trimestre — une vague de fin de trimestre, la plupart des sociétés américaines versant des dividendes trimestriels — avec 7 splits et 2 nouvelles cotations (AACU — Ares Acquisition Corp III; OSPRU — Osprey Acquisition Corp. III). La colonne des dépôts est l'indicateur principal de la qualité des données : l'index de la SEC contient 31 dépôts pour le 30 juin — 0 Insider Form 4s, 0 8-Ks — contre 4439 lors de la séance précédente. Un modèle de fin de mois est observé dans le flux, identifié dans la note sur l'écart de fin de mois ; tout calcul incluant ce jour est sous-estimé jusqu'à la mise à jour des données historiques.
La session, vérifiée
Le SQL exact derrière chaque chiffre
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'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 boursier ne contient que les clôtures à venir).
Bilan de la séance
Un rendement du SPY de 0.73% avec 51.8% de titres en hausse, 4 des fonds sectoriels 10 dans le vert et un spread de 4.69 points entre les meilleures et les moins bonnes performances ne constitue pas un rallye généralisé. Il s'agit d'un rallye sectoriel prenant l'apparence d'un indice, marqué par une forte activité durant la demi-heure précédant l'enchère de fin de trimestre. La variation d'un indice est une moyenne ; ici, la performance a été portée par la technologie alors que la plupart des secteurs reculaient. Vérifiez la dispersion avant de suivre la direction de l'indice.
FAQ
Quel a été la performance du marché boursier le 30 juin 2026 ?
La clôture est en hausse : le SPY a progressé de 0.73% et le QQQ de 1.63% par rapport à la clôture du 29 juin. La largeur du marché était plus restreinte — 51.8% des titres liquides étaient en hausse, et 4 des 10 fonds sectoriels du S&P étaient dans le vert.
Quel secteur a tiré le marché le 30 juin 2026 ?
La technologie : le XLK a gagné 2.69%, contre 1.34% pour les industriels et -2% pour l'immobilier — un spread de 4.69 points entre le meilleur et le moins bon secteur.
Quelles ont été les plus fortes variations de titres le 30 juin 2026 ?
Parmi les titres échangés pour un volume de 10 millions de dollars ou plus, JEM a réalisé la plus forte hausse (+256.76%) et SOC la plus forte baisse (55.89%). Aucun de ces mouvements n'est lié à un split : il s'agit de variations de prix réelles et non d'effets de corporate action.
Quelle a été la performance du marché boursier au T2 2026 ?
Entre l'ouverture du 1er avril et la clôture du 30 juin, sur 62 séances : QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08% — un trimestre porté par les valeurs de croissance, clôturé par une séance portée par la croissance.
Pourquoi les volumes sont-ils si élevés durant la dernière demi-heure ?
La dernière demi-heure a enregistré 2.69 milliards d'actions échangées, contre 2.05 milliards à l'ouverture. L'enchère de clôture fixe le cours officiel de chaque action via un crossing unique, et les fonds indiciels y échangent pour s'aligner sur ce cours ; le rebalancing de fin de trimestre concentre les flux.
Notes sur les données et méthodologie
- Les paniers. Le tableau sectoriel comprend les dix fonds sectoriels SPDR listés dans son panel — le même panier est utilisé chaque session, ce qui permet de comparer la dispersion d'un jour à l'autre. Les tableaux des "movers" nécessitent un turnover de 10 millions de dollars et une clôture précédente supérieure à 1 $, excluent la liste de symboles réutilisés mentionnée plus haut, et incluent une colonne sur les split.
- Les limites. Le volume en dollars est une approximation par minute (clôture × volume par barre). L'indice des publications du 30 juin est quasi vide (voir la note sur l'écart de fin de mois). Le décompte des actualités provient d'un seul flux fournisseur : l'absence d'article ici ne prouve pas qu'aucune information n'a été publiée ailleurs.
- La méthodologie. Une session (1, vérifiée à partir des barres observées) ; les horodatages sont stockés en UTC et convertis en heure de New York lors des requêtes ; la "clôture" correspond à la dernière barre régulière de la minute, et non au print de l'enchère. Les expirations d'options sont extraites du ticker de l'OCC (la colonne du tableau est erronée) ; la moneyness est mesurée par rapport à la dernière barre régulière du SPY. Les panels sont générés une seule fois lors de la rédaction via le chemin de lecture seule. Données extraites du warehouse au 13 juillet 2026.
Chaque panel est le résultat d'une requête stockée — incluant graphique, tableau et SQL dans un seul objet. Vous pouvez copier l'un d'eux dans le terminal Strasmore. Prochaine session : 1er juillet.