Het tweede kwartaal van 2026 was het herstelkwartaal: na een negatief eerste kwartaal steeg elke belangrijke index ETF met dubbele cijfers, aangevoerd door QQQ op 26.5%. De onderstaande panelen tonen het verloop van het kwartaal — de maandelijkse stijging, de context van de rentestanden, de kalender — en de twee datacaveats die in de tekst worden vermeld. Elk getal is een resultaat van een opgeslagen query; klik op een paneel voor de exacte SQL.
Het kwartaal in beeld
Hoe groot was de verschuiving ten opzichte van Q1? Dit paneel berekent de rendementen van beide kwartalen in één enkele query — de Q1 referentie wordt live opnieuw berekend volgens dezelfde definities.
De exacte SQL achter elk getal
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 tickerQQQ steeg met 26.5% voor het kwartaal na een -6.9% in Q1; SPY steeg met 14.1% na -5.2%; IWM steeg met 20.2%. Elke index die in het eerste kwartaal daalde, herstelde in het tweede kwartaal meer dan volledig. De vier vertellen drie verschillende verhalen: de groei-index had de diepste drawdown in Q1 en boekte het grootste herstel; DIA — de prijsgewogen industriële index — verschoof van -3.9% naar 12.1%; en IWM daalde eigenlijk nooit (0.1% in Q1), waardoor het 20.2% kwartaal een vlak begin versterkte in plaats van een drawdown te herstellen. Herstel en momentum lijken identiek in een kolom met kwartaalrendementen; de Q1-kolom is wat het verschil aangeeft.
Het kwartaal ten opzichte van elk tweede kwartaal in de marktdata
Herstelkwartalen voelen van binnenuit historisch aan; de marktdata kan bevestigen of dit kwartaal dat ook is. De panels berekenen de DEZELFDE rendementen van april tot en met juni voor elk jaar in de volledige geschiedenis binnen één query. De berekening is elk jaar identiek, waarna dit kwartaal wordt gerangschikt ten opzichte van de rest.
De exacte SQL achter elk getal
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 ASCDe exacte SQL achter elk getal
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 ASCDe meting komt dicht in de buurt van historische data: de 26.5% van QQQ staat op plek 2 van de 17 vergelijkbare tweede kwartalen (rang 1 = beste) — precies één eerder tweede kwartaal eindigde hoger, zoals de tabel hierboven per jaar laat zien. De 14.1% van SPY staat op plek 3 van de 23 sinds 2004. Er zijn twee kanttekeningen: de reeks van QQQ is korter (het fonds handelde gedurende enkele jaren onder een andere ticker — een beveiliging op basis van het aantal handelsdagen sluit die jaren zichtbaar uit, zie de aantallen per jaar in de tabel), en elke geschiedenisquery stelt de bovengrens vast op de afsluiting van dit kwartaal. Hierdoor kan de vergelijkingsset niet ongemerkt groeien wanneer latere jaren worden toegevoegd. De basis voor elke rangschikking op deze pagina: de koers van opening tot afsluiting tijdens reguliere handelsuren binnen het kalenderkwartaal.
De maandelijkse trap
De exacte SQL achter elk getal
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, tickerHet kwartaal begon sterk: april leverde de grootste bijdrage (SPY 9.9%, QQQ 14.8%), mei voegde daar meer aan toe (4.9% en 10.3%), en juni leverde een kleine achteruitgang — SPY -1.2%. De juni recap bevat de details van de maand, inclusief de spreiding in marktbreedte daaronder.
De marktleiders, per kwartaal
De exacte SQL achter elk getal
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 8Gedurende het volledige kwartaal nam MU ($2047.5 miljard) de positie aan de top van de tape over van SPY ($2032 miljard) — een enkele aandeel die de belangrijkste indexfondsen overtrof gedurende drie maanden, met 99.2% van de totale omzet van de leider. Daarachter volgden: QQQ ($1658.5 miljard), gevolgd door NVDA met $1591.8 miljard — waarvan de juni-periode afzonderlijk wordt geanalyseerd tick by tick hier — en TSLA met $1198.8 miljard. Let op de aard van deze lijst: het betreft de omzet tijdens de reguliere handelsuren, niet de performance — een aandeel kan de markt domineren in een maand met dalende koersen. De juni-periode van de leider wordt geanalyseerd tick by tick in de diepgaande analyse. Basis: 1 april–30 juni tijdens reguliere handelsuren; één vermelding uit juni met een hergebruikt symbool is uitgesloten in afwachting van verificatie van de entiteit (de bewijsstukken).
Breedte: de dagelijkse trend
De exacte SQL achter elk getal
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 van de 62 sessies van het kwartaal sloot SPY hoger tegenover 26 lager — een dominantie van stijgende dagen die overeenkomt met een kwartaal met dubbelcijferige waarden. De ticker-grain count (elke advancer en decliner) is beperkt op kwartaalschaal: de volledige marktscan overschrijdt het querybudget dat deze pagina genereert (gemeten tijdens het schrijven), waardoor de equal-count breedte op maandelijkse schaal wordt weergegeven — de verdeling tussen advancers en decliners van juni, waarbij meer koersen daalden dan stegen, vindt u in de juni recap — en de limiet wordt hier vermeld in plaats van stilletjes te worden verkleind.
De options tape, maand voor maand
Het verhaal over de microstructuur van het kwartaal, verteld op de enige schaal die dit mogelijk maakt — maand over maand over de gehele listed options tape. Het volume steeg richting het einde van het kwartaal: van 1386.9 miljoen contracten in april naar 1477.9 miljoen in juni, de drukste maand van het kwartaal. Het aandeel van same-day-expiry (0DTE) steeg eveneens, van 30.3% naar 34.3% — het aandeel in juni is het hoogste van de H1, en de evolutie vanaf januari staat in de H1 recap.
De exacte SQL achter elk getal
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')De exacte SQL achter elk getal
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')De exacte SQL achter elk getal
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')De handelskosten, maandelijkse steekproef
De exacte SQL achter elk getal
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 ASCDe mediane quoted spread van SPY op de maandelijkse steekproefsessies van het kwartaal: 0.286 bps in de steekproef van april, 0.27 in die van mei, 0.409 in die van juni — de steekproef van juni is de breedste. Basis: de gegevens zijn gebaseerd op individuele gelabelde steekproefsessies (de tweede woensdag van elke maand), niet op medianen over de gehele maand; ongeldige quotes worden in de panel opgenomen en niet verwijderd.
Rentes: het kwartaal waarin de curve afvlakte
De exacte SQL achter elk getal
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 dateDe 2s10s spread begon het kwartaal op 52 basis points en eindigde op 30 — een kwartaal van afvlakking, waarbij de 10-jarige op 4.44% eindigde. De zesmaandse versie van dit scenario vindt u in de H1 recap. Mechanisch gezien betekent afvlakking dat de korte rente dichter bij de lange rente is gekomen; of dit zich voortzet is niet af te leiden uit deze tabel, en deze pagina probeert dat ook niet te verklaren.
De kalender, kwartaalschaal
De exacte SQL achter elk getal
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 bedrijven die in het kwartaal zijn genoteerd, 435 uitgevoerde splits en 15402 ex-dividend gebeurtenissen die zijn uitgekeerd. Het aantal ingediende documenten (235075) bevat de geopenbaarde discrepantie: de index bevat slechts 31 documenten op 30 juni — de laatste dag van het kwartaal — en 34 op 30 april, tegenover duizenden op omliggende dagen. Hierdoor mist het kwartaaltotaal twee maandelijkse einddata en is het ondergemeten totdat de feed de gegevens achteraf aanvult. De discrepantie aan het einde van de maand heeft een eigen diagnostische noot.
De naderende kwartaalafsluiting in de kalender
De exacte SQL achter elk getal
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 oDe bedrijfsagenda werd drukker naarmate het kwartaal vorderde: het aantal ex-dividend gebeurtenissen nam elke maand toe, van 3947 in april tot 6651 in juni, en ook het aantal splits steeg (129 naar 164). Het aantal beursnoteringen bleef gedurende de drie maanden stabiel — de metafoor van een golf is van toepassing op dividenden, niet op IPO's in dit kwartaal.
Het sessieoverzicht
De exacte SQL achter elk getal
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 sessies, geverifieerd op basis van geobserveerde bars in plaats van aannames op basis van de kalender: 21 in april, 20 in mei (Memorial Day), 21 in juni (Juneteenth). De overzichten op maandniveau en bewijslast voor de sluiting vindt u in de juni recap en de uitleg over feestdagen.
Datanotities
Volledige datanotities
- Short interest eindigt bij de settlement van 15 juni op het moment van generatie — de gegevens van eind juni zijn nog in afwachting; de recap van juni bevat de volledige verklaring. Dit bericht wordt opnieuw gegenereerd zodra deze gegevens beschikbaar zijn.
- Het gat tussen de maandelijkse indiening en de index wordt hierin vermeld: 30 juni EN 30 april vallen binnen dit kwartaal, en 31 maart vertoont dezelfde kenmerken — elke maandelijkse afsluiting van 2026 waarvan de laatste kalenderdag een werkdag was, is nagenoeg leeg. De diagnostische nota bevat de bewijsstukken en de beperkte diagnose.
- Microstructure (tick-level infrastructuur) is hier opzettelijk weggelaten — de diepgaande analyse van 29 juni bevat een volledige anatomie van de tape gedurende een sessie.
- Uitsluiting van volume-leiders: één hergebruikte symbool-notering van juni is uitgesloten in afwachting van verificatie van de entiteit.
Methodologie
- De periode loopt van 1 april tot 30 juni 2026 — 62 sessies, geverifieerd op basis van geobserveerde bars. Quarterly returns worden berekend van de opening van de reguliere handel tot de sluiting van de reguliere handel binnen de periode; het contrast voor Q1 wordt live opnieuw berekend met identieke definities.
- Timestamps worden opgeslagen in UTC en gefilterd met ruwe UTC-grenzen; reguliere uren zijn 13:30–20:00 UTC gedurende de (EDT) kwartaal. De dollar volume is het product van de minute close en de minute volume tijdens de reguliere uren. Meerjarige historische blokken filteren de reguliere uren op basis van de Eastern wall clock (geconverteerd per rij — de DST-veilige conventie over decennia heen) en leggen de bovengrens vast op de einddatum van dit kwartaal; de verificatie van de diepte (minute history tot september 2003) staat in de methodologie van de H1 recap.
- De generatie vindt plaats via het beveiligde read-only pad; de publieke pagina voert nooit live queries uit. Status van het warehouse per 5 juli 2026.
Dit is de eerste editie van de vaste quarterly recap; de editie voor Q3 zal hiernaar terugverwijzen. Details per maand: Juni. Het voltooide deel van dit kwartaal: H1 2026.