Le deuxième trimestre 2026 a marqué la reprise. Après un premier trimestre négatif, tous les principaux ETF d'indices ont progressé de deux chiffres, portés par le QQQ à 26.5%. Les panneaux ci-dessous présentent la structure du trimestre : l'évolution mensuelle, le contexte des taux, le calendrier, ainsi que deux limites liées aux données. Chaque chiffre est le résultat d'une requête stockée ; vous pouvez développer n'importe quel panneau pour obtenir la requête SQL exacte.
Le bilan du trimestre
Quelle a été l'ampleur de la variation par rapport au T1 ? Ce tableau calcule les rendements des deux trimestres en une seule requête — la référence du T1 est recalculée en temps réel selon les mêmes définitions.
Le SQL exact derrière chaque chiffre
SELECT ticker,
round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-04-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-03-31') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q1_return_pct,
round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS q2_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY tickerLe QQQ a progressé de 26.5% sur le trimestre après une baisse de -6.9% au T1 ; le SPY de 14.1% après -5.2% ; l'IWM de 20.2%. Chaque indice en baisse au premier trimestre a connu une reprise supérieure à ses pertes au second. Les quatre indicateurs présentent trois scénarios distincts : l'indice de croissance a subi le drawdown le plus important au T1 mais a affiché la plus forte reprise ; le DIA — l'indice des industrielles pondéré par les cours — est passé de -3.9% à 12.1% ; et l'IWM n'a pratiquement pas baissé (0.1% au T1), sa progression de 20.2% sur le trimestre a donc accentué une tendance stable plutôt que de compenser un drawdown. La reprise et le momentum semblent identiques dans une colonne de rendement trimestriel ; c'est la colonne du T1 qui permet de les distinguer.
Le trimestre comparé à tous les autres deuxièmes trimestres
Les trimestres de reprise semblent historiques lorsqu'on les vit ; les données de marché permettent de confirmer cette tendance. Les panels recalculent le rendement identique d'avril à juin pour chaque année de l'historique en une seule requête. Le calcul est identique pour chaque année, puis ce trimestre est classé par rapport aux autres.
Le SQL exact derrière chaque chiffre
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
ticker,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS q2_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
AND window_start >= toDateTime('2003-01-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND toMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 4 AND 6
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 50
ORDER BY y ASC, ticker ASCLe SQL exact derrière chaque chiffre
SELECT ticker,
round(anyIf(ret, y = 2026), 1) AS q2_2026_pct,
arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
count() AS q2s_compared,
min(y) AS first_year,
anyIf(sessions, y = 2026) AS sessions_2026
FROM (
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
ticker,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
(argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
AND window_start >= toDateTime('2003-01-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND toMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 4 AND 6
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 50
)
GROUP BY ticker
ORDER BY ticker ASCLa mesure est proche de l'historique : le rendement de 26.5% de QQQ se classe 2 sur 17 deuxièmes trimestres comparables (le rang 1 est le meilleur) — un seul deuxième trimestre précédent a terminé avec un rendement supérieur, comme l'indique le tableau annuel ci-dessus. Le rendement de 14.1% de SPY se classe 3 sur 23 depuis 2004. Deux précisions sont nécessaires : la série de QQQ est plus courte (le fonds a été échangé sous un autre ticker pendant plusieurs années — une limite basée sur le nombre de sessions exclut ces années, comme le montrent les décomptes annuels dans le tableau), et chaque requête d'historique fixe sa limite supérieure à la fin de ce trimestre, afin que l'ensemble de comparaison ne s'élargisse pas automatiquement lors de l'arrivée des années suivantes. La base de chaque rang sur cette page est le cours de l'ouverture à la clôture en séance régulière au sein du trimestre civil.
L'escalier mensuel
Le SQL exact derrière chaque chiffre
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start, ticker,
round((argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / argMinIf(toFloat64(open), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS month_return_pct,
round(argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS month_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
AND window_start >= toDateTime('2026-04-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start, ticker
ORDER BY period_start, tickerLe trimestre a été porté par le début de période : le mois d'avril a réalisé l'essentiel de la performance (SPY 9.9%, QQQ 14.8%), mai a poursuivi la hausse (4.9% et 10.3%), tandis que juin a légèrement reculé — SPY -1.2%. Le récapitulatif de juin présente le détail du mois, incluant la répartition de la breadth.
Les leaders du marché, bilan trimestriel
Le SQL exact derrière chaque chiffre
SELECT ticker,
round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS dollar_bn,
round(100 * sum(toFloat64(close) * toFloat64(volume)) / max(sum(toFloat64(close) * toFloat64(volume))) OVER (), 1) AS pct_of_leader
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= toDateTime('2026-04-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY dollar_bn DESC
LIMIT 8Sur l'ensemble du trimestre, MU ($2047.5 milliards) a devancé le SPY ($2032 milliards) en tête du marché. Une action individuelle a ainsi surperformé l'indice de référence sur trois mois, avec un volume représentant 99.2% du total du leader. Derrière eux se trouvent : QQQ ($1658.5 milliards), puis NVDA à $1591.8 milliards — dont l'activité de juin est analysée tick by tick ici — et TSLA à $1198.8 milliards. Notez la nature de cette liste : il s'agit du turnover en séance régulière, et non de la performance — un titre peut dominer le marché lors d'un mois de baisse. L'activité de juin du leader est analysée tick by tick dans son analyse détaillée. Base : 1er avril – 30 juin en séance régulière ; une inscription de juin pour un symbole réutilisé est exclue en attente de vérification de l'entité (ses justificatifs).
Breadth : l'indicateur de tendance
Le SQL exact derrière chaque chiffre
SELECT countIf(day_ret > 0) AS up_sessions,
countIf(day_ret < 0) AS down_sessions,
countIf(day_ret = 0) AS flat_sessions,
count() AS sessions_total
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 2) AS day_ret
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-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 d
)36 des sessions du 62 ont clôturé en hausse pour le SPY contre 26 en baisse — une dominance des jours de hausse conforme à un trimestre à deux chiffres. Le compte des tickers (chaque advancer et decliner) est limité à l'échelle trimestrielle : le scan complet du marché dépasse le budget de requête de cette page (mesuré lors de la rédaction). Par conséquent, la breadth basée sur un compte égal est limitée à l'échelle mensuelle — la répartition advancer/decliner de juin, où les baisses ont été plus nombreuses que les hausses, est disponible dans le récapitulatif de juin — et cette limite est affichée ici plutôt que d'être réduite silencieusement.
Le tape des options, mois par mois
L'analyse de la microstructure du trimestre, présentée à l'échelle la plus pertinente : l'évolution mensuelle sur l'ensemble du tape des options cotées. Le volume a augmenté jusqu'à la fin du trimestre : 1386.9 millions de contrats en avril contre 1477.9 millions en juin, le mois le plus actif du trimestre. La part des options à expiration le jour même (0DTE) a également progressé, passant de 30.3% à 34.3% — la part de juin est la plus élevée du semestre. L'évolution depuis janvier est détaillée dans le récapitulatif du S1.
Le SQL exact derrière chaque chiffre
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-04-01 00:00:00')
AND window_start < toDateTime('2026-05-01 00:00:00')Le SQL exact derrière chaque chiffre
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-05-01 00:00:00')
AND window_start < toDateTime('2026-06-01 00:00:00')Le SQL exact derrière chaque chiffre
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')Coût de transaction, échantillon mensuel
Le SQL exact derrière chaque chiffre
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
round(quantileDeterministicIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price), 3) AS med_spread_bps,
round(count() / 1e6, 2) AS quote_updates_m,
countIf(NOT (bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price)) AS invalid_dropped
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY'
AND ((sip_timestamp >= toDateTime64('2026-04-15 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-04-15 20:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-05-13 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-05-13 20:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-06-10 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-10 20:00:00', 9)))
GROUP BY session
ORDER BY session ASCLe spread médian coté du SPY sur les sessions mensuelles de l'échantillon trimestriel : 0.286 bps en avril, 0.27 en mai, 0.409 en juin — l'échantillon de juin présente l'écart le plus large. Base de calcul : sessions échantillonnées avec étiquette unique (le deuxième mercredi de chaque mois), et non les médianes mensuelles ; les cotations invalides sont incluses dans le panel et non exclues.
Taux : un trimestre marqué par l'aplatissement de la courbe
Le SQL exact derrière chaque chiffre
SELECT toString(date) AS d,
round(yield_10_year, 2) AS y10,
round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-04-01') AND date <= toDate('2026-06-30')
AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
ORDER BY dateLe spread 2s10s est passé de 52 points de base en début de trimestre à 30 en fin de période. La courbe s'est aplatie, le taux à 10 ans terminant à 4.44%. La dynamique sur six mois est détaillée dans le récapitulatif H1. Techniquement, un aplatissement signifie que la partie courte de la courbe s'est rapprochée de la partie longue ; ce tableau ne permet pas de déterminer si cette tendance va se poursuivre, et cette page ne cherche pas à le faire.
Le calendrier, échelle trimestrielle
Le SQL exact derrière chaque chiffre
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-04-01') AND ex_dividend_date <= toDate('2026-06-30')) AS ex_div_events,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-04-01') AND execution_date <= toDate('2026-06-30')) AS splits,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-04-01') AND listing_date <= toDate('2026-06-30')) AS ipos,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= toDate('2026-04-01') AND filing_date <= toDate('2026-06-30')) AS q2_filings,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-04-30')) AS filings_apr30,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-30')) AS filings_jun30105 sociétés cotées au cours du trimestre, 435 splits effectués, et 15402 événements ex-dividend versés. Le nombre de filings (235075) présente un écart de déclaration : l'indice ne contient que 31 filings au 30 juin — le dernier jour du trimestre — et 34 au 30 avril, contre des milliers les jours adjacents. Le total trimestriel omet donc DEUX jours de fin de mois et est sous-estimé jusqu'à la mise à jour du flux par backfill. L'écart de fin de mois fait l'objet d'une note de diagnostic spécifique.
L'accélération du calendrier vers la fin du trimestre
Le SQL exact derrière chaque chiffre
SELECT m, ipos, splits, ex_divs FROM (
SELECT '2026-04' AS m,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-04-01') AND listing_date <= toDate('2026-04-30')) AS ipos,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-04-01') AND execution_date <= toDate('2026-04-30')) AS splits,
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-04-01') AND ex_dividend_date <= toDate('2026-04-30')) AS ex_divs, 1 AS o
UNION ALL SELECT '2026-05',
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-05-01') AND listing_date <= toDate('2026-05-31')),
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-05-01') AND execution_date <= toDate('2026-05-31')),
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-05-01') AND ex_dividend_date <= toDate('2026-05-31')), 2
UNION ALL SELECT '2026-06',
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-06-01') AND listing_date <= toDate('2026-06-30')),
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-06-01') AND execution_date <= toDate('2026-06-30')),
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-06-01') AND ex_dividend_date <= toDate('2026-06-30')), 3
) ORDER BY oLe calendrier des entreprises s'est densifié au fil du trimestre : le nombre d'événements ex-dividend a augmenté chaque mois, passant de 3947 en avril à 6651 en juin, parallèlement à la hausse des splits (129 à 164). Le nombre de listings est resté stable sur les trois mois — la dynamique de croissance concerne les dividendes et non les IPO ce trimestre.
Le compte rendu de la session
Le SQL exact derrière chaque chiffre
SELECT
(SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-04-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')) AS q2_sessions,
(SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-04-01 00:00:00') AND window_start < toDateTime('2026-05-01 00:00:00')) AS april_sessions,
(SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-05-01 00:00:00') AND window_start < toDateTime('2026-06-01 00:00:00')) AS may_sessions,
(SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) 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')) AS june_sessions62 sessions, vérifiées à partir des bougies observées et non par déduction du calendrier : 21 en avril, 20 en mai (Memorial Day), 21 en juin (Juneteenth). Les récapitulatifs mensuels et les preuves de clôture sont disponibles dans le récapitulatif de juin et l'explication des jours fériés.
Notes sur les données
Notes complètes sur les données
- Le short interest s'arrête au règlement du 15 juin à la date de génération — la publication de fin juin est en attente ; le récapitulatif de juin contient l'intégralité des informations. Ce post est mis à jour dès la publication.
- L'écart entre les dépôts de fin de mois et l'indice est précisé ici : le 30 juin ET le 30 avril font partie de ce trimestre, et le 31 mars présente la même signature — chaque fin de mois de 2026 dont le dernier jour calendaire est un jour ouvré est quasi vide. La note de diagnostic contient les preuves et le diagnostic limité.
- La microstructure (mécanismes de l'order book au tick) est volontairement absente — le analyse approfondie du 29 juin présente l'anatomie complète de la tape sur une session.
- Exclusion des leaders de volume : une liste de juin avec un symbole réutilisé a été exclue en attente de vérification de l'entité.
Méthodologie
- La période s'étend du 1er avril au 30 juin 2026 — 62 sessions, vérifiées à partir des bougies observées. Les rendements trimestriels sont calculés de l'ouverture à la clôture de la séance régulière au cours de la période ; le contraste du Q1 est recalculé en direct selon des définitions identiques.
- Les horodatages sont stockés en UTC et filtrés avec des limites UTC brutes ; les horaires de séance régulière sont de 13:30 à 20:00 UTC sur l'ensemble du trimestre (EDT). Le volume en dollars correspond au produit du cours de clôture par le volume sur les horaires de séance régulière. Les blocs d'historique pluriannuels filtrent les horaires de séance régulière selon l'heure de l'Est (convertie par ligne — la convention sécurisée pour le passage à l'heure d'été sur plusieurs décennies) et fixent leur limite supérieure à la fin de ce trimestre ; la vérification de la profondeur (historique minute jusqu'en septembre 2003) se trouve dans la méthodologie du récapitulatif H1.
- La génération s'effectue via le chemin de lecture seule sécurisé ; la page publique n'interroge jamais les données en direct. État de l'entrepôt de données au 5 juillet 2026.
Ceci est la première édition du récapitulatif trimestriel permanent ; l'édition du Q3 fera un lien vers cette page. Détail mensuel : juin. Le semestre complété ce trimestre : H1 2026.