La prima metà del 2026 ha visto due mercati distinti uniti tra loro: un primo trimestre in cui ogni principale index ETF è sceso o è rimasto stabile, e un secondo trimestre che ha ampiamente recuperato le perdite. SPY ha chiuso il semestre con un aumento del 8.8%; QQQ in rialzo dello 18.7%; e il 21.3% di IWM è stato il miglior primo semestre registrato per l'ETF small-cap nei nostri dati — il dettaglio è riportato sotto, ricalcolato rispetto a ogni anno precedente in un'unica query. Il mercato dei tassi ha seguito un trend proprio: lo 2s10s spread si è appiattito da 72 punti base a 30 durante il semestre, senza mai invertire la curva. Questa pagina rappresenta il bilancio completo del semestre — il punteggio, il ranking storico, l'andamento mensile, l'intera yield curve per scadenza, gli undici settori, l'evoluzione mensile del mercato delle opzioni e i titoli singoli più rilevanti del semestre. Ogni numero qui presente è il risultato di una query salvata; espandere qualsiasi pannello per visualizzare il codice SQL.
Il bilancio semestrale
L'esatto SQL dietro ogni numero
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-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 h1_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)
/ 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-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS h1_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 tickerLa divisione in due trimestri definisce la forma del semestre: SPY -5.2% poi 14.1%; QQQ -6.9% poi 26.5%. IWM è stato il leader silenzioso del semestre a 21.3% — le small cap hanno superato ogni indice large-cap durante i sei mesi. Il dettaglio trimestrale è disponibile nel riepilogo del Q2. Una nota sul calcolo dei semestri: il 8.8% di SPY per i sei mesi è molto inferiore al solo Q2, poiché il semestre include un drawdown e una successiva ripresa — il compounding di -5.2% e 14.1% corrisponde ai dati in tabella, e qualsiasi titolo sul "rendimento del primo semestre" racchiude implicitamente l'intero ciclo di mercato.
La prima metà rispetto a tutte le altre
Una 8.8% metà è insolita? I pannelli sottostanti ricalcolano lo STESSO rendimento della prima metà — dall'apertura alla chiusura delle sessioni ordinarie, da gennaio a giugno — per ogni anno di cronologia a minuti, con una query per ogni coppia di ETF e aritmetica identica per ogni anno, per poi classificare questa metà rispetto alle altre. La data più remota della serie a minuti è verificata nella metodologia sottostante; la prima metà completa disponibile è quella indicata nei dati.
L'esatto SQL dietro ogni numero
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 h1_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')) <= 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 >= 100
ORDER BY y ASC, ticker ASCL'esatto SQL dietro ogni numero
SELECT ticker,
round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
count() AS halves_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')) <= 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 >= 100
)
GROUP BY ticker
ORDER BY ticker ASCIl 8.8% di SPY si posiziona nel 6 di 23 prime metà dal 2004 (il rango 1 è il migliore) — si tratta del terzo superiore, non è un record. Il 18.7% di QQQ si posiziona nel 3 di 16 metà comparabili — la serie QQQ è più breve — il fondo ha scambiato sotto un ticker diverso per alcuni anni — e ogni anno con meno di cento sessioni della prima metà per un simbolo viene escluso da un controllo del numero di sessioni mostrato nella tabella, pertanto le esclusioni sono visibili e non silenti.
L'esatto SQL dietro ogni numero
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 h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('DIA', 'IWM')
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')) <= 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 >= 100
ORDER BY y ASC, ticker ASCL'esatto SQL dietro ogni numero
SELECT ticker,
round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
count() AS halves_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 ('DIA', 'IWM')
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')) <= 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 >= 100
)
GROUP BY ticker
ORDER BY ticker ASCLa riga delle small-cap è il dato principale: IWM si posiziona nel 1 di 23 prime metà dal 2004 — il miglior dato registrato per il fondo, superiore a ogni metà di recovery nella tabella. Il 8.4% di DIA si posiziona nel 4 di 23. La base, spiegata chiaramente: rendimento dall'apertura alla chiusura delle sessioni ordinarie all'interno di ogni prima metà del calendario, aritmetica identica per ogni anno, limite superiore fissato alla fine di questo periodo in modo che il set di confronto non cresca silenziosamente con l'inserimento degli anni successivi.
Mese per mese
L'esatto SQL dietro ogni numero
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start, ticker,
round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS month_return_pct,
round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS month_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start, ticker
ORDER BY period_start, tickerL'andamento è stato altalenante: una leggera salita, poi cali, una forte risalita, ancora salita e infine un lieve calo. Aprile è stato il punto di svolta del semestre (SPY 9.9%, QQQ 14.8% — il miglior mese per QQQ tra i sei), mentre giugno si è concluso con un moderato -1.2% per SPY. Il riepilogo di giugno, con il dettaglio sulla breadth dietro quel valore, è disponibile qui. Analizzando la tabella mese per mese: l'anno è iniziato quasi in stallo (SPY 0.9% a gennaio), è sceso durante febbraio (-0.5%) e marzo (-4.2%), poi aprile ha invertito la tendenza in un solo mese, maggio ha continuato il trend (4.9%) e giugno ha rallentato. Tre mesi su sei sono stati negativi — un numero di mesi pari a una probabilità del cinquanta per cento per un semestre che si è concluso con un saldo solido e positivo. Questa è la struttura tipica dei semestri azionari, un dettaglio importante da ricordare quando un singolo mese sembra indicare un verdetto definitivo.
Tassi: l'intera curva, per ogni scadenza
La curva Treasury ha subito un twist invece di uno shift. La parte ultra-short — le scadenze che seguono più da vicino la politica monetaria — è rimasta quasi invariata; il due anni è salito di due terzi di un punto percentuale; il trenta anni è rimasto quasi stabile. Il panel analizza l'intera curva, confrontando l'inizio del semestre con la fine.
L'esatto SQL dietro ogni numero
SELECT maturity, start_pct, end_pct, round((end_pct - start_pct) * 100, 0) AS change_bp FROM (
SELECT '1-month' AS maturity, (SELECT round(argMin(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS start_pct, (SELECT round(argMax(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS end_pct, 1 AS o
UNION ALL SELECT '3-month', (SELECT round(argMin(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), (SELECT round(argMax(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), 2
UNION ALL SELECT '1-year', (SELECT round(argMin(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), (SELECT round(argMax(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), 3
UNION ALL SELECT '2-year', (SELECT round(argMin(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), (SELECT round(argMax(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), 4
UNION ALL SELECT '5-year', (SELECT round(argMin(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), (SELECT round(argMax(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), 5
UNION ALL SELECT '10-year', (SELECT round(argMin(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), (SELECT round(argMax(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), 6
UNION ALL SELECT '30-year', (SELECT round(argMin(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), (SELECT round(argMax(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), 7
) ORDER BY oLeggendo la colonna delle variazioni dall'alto verso il basso, il twist è inequivocabile: l'1-month è variato di -2 basis point in sei mesi, mentre il 2-year è salito di 67 e il 30-year solo di 5. Uno shift parallelo muove tutte le scadenze nella stessa direzione; questo semestre ha invece spostato la parte centrale della curva e ha bloccato entrambe le estremità — i tassi brevi sono rimasti ancorati alla politica monetaria, i tassi lunghi sono stati appena riprezzati.
L'impatto sulla pendenza
L'esatto SQL dietro ogni numero
SELECT
round((argMin(yield_10_year - yield_2_year, date)) * 100, 0) AS start_bp,
round((argMax(yield_10_year - yield_2_year, date)) * 100, 0) AS end_bp,
round(min((yield_10_year - yield_2_year)) * 100, 0) AS min_bp,
count() AS prints
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)Il rialzo della parte breve della curva più rapido rispetto alla parte lunga definisce il flattening: lo 2s10s spread è sceso da 72 a 30 basis points durante le rilevazioni di 124 — il valore minimo del semestre è stato di 27, quindi la curva si è appiattita senza mai raggiungere l'inversione. Determinare se un appiattimento della curva indichi l'andamento futuro è una previsione, e questa tabella non fornisce previsioni.
L'esatto SQL dietro ogni numero
SELECT toString(date) AS d, round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
ORDER BY dateLa serie giornaliera mostra che l'appiattimento non è stato un evento isolato ma un processo graduale — 124 rilevazioni in calo durante il semestre, con lo spread che ha iniziato l'anno a 72 basis points per terminare a 30.
Settori: la dispersione nascosta dall'indice
Quali parti del mercato hanno generato effettivamente i profitti del semestre? Gli undici ETF settoriali SPDR, suddivisi tra metà e quarto, in un'unica analisi.
L'esatto SQL dietro ogni numero
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-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 h1_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)
/ 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(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
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 tickerLa dispersione è l'elemento chiave: il settore technology (XLK) ha chiuso il semestre in rialzo del 30.8% — con un 42% secondo trimestre — mentre i servizi di comunicazione (XLC) hanno chiuso a -9.3%, con uno spread di circa quaranta punti percentuali tra il miglior e il peggior settore in sei mesi. Possedere "il mercato" significava detenere entrambi gli estremi. L'Energy è l'esempio cautelativo sulla durata dei trend: XLE mostra un sano 18.8% semestrale — costruito su un 36.9% primo trimestre seguito da un -11% secondo. È stato il settore large-cap più forte del mercato nel trimestre in cui gli indici sono scesi, e tra i più deboli in quello della ripresa. I Financials (XLF) hanno seguito lo stesso percorso al contrario: -9.9% nel Q1, poi 7.7% nel Q2. Un singolo dato semestrale appiattisce entrambi i cicli; la suddivisione trimestrale offre la visione più accurata.
Il costo per fare trading in ogni settore
Le tabelle dei rendimenti sono ovunque; i listini delle quotazioni no. Questo pannello misura lo spread bid-ask mediano di ogni ETF di settore durante un'intera sessione rappresentativa — 123 sessioni nel semestre, e quella misurata qui è del 29 giugno, indicata come tale — basandosi su ogni aggiornamento NBBO di quel giorno.
L'esatto SQL dietro ogni numero
SELECT ticker,
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), 2) 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 IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
AND sip_timestamp >= toDateTime64('2026-06-29 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-29 20:00:00', 9)
GROUP BY ticker
ORDER BY med_spread_bpsTutte le undici quotazioni si attestano a pochi punti base o meno — la più economica a 0.62 bps (XLV), la più ampia a 2.23 bps (XLRE) — il che rappresenta il significato pratico di "gli ETF di settore sono liquidi": il costo per assumere una posizione su qualsiasi settore si misura in centesimi di percentuale. Per un confronto con i singoli titoli, il analisi approfondita del 29 giugno misura lo spread di un titolo poco liquido a centinaia di volte questi livelli, nella stessa sessione.
Ampiezza su scala semestrale
L'ampiezza su scala semestrale si divide in due livelli. Il livello macroscopico: SPY ha registrato 64 sessioni rialziste contro 59 sessioni ribassiste durante il 123 del semestre — quasi una probabilità del cinquanta e cinquanta per i giorni, nonostante un semestre solidamente positivo, che è ciò che indica una salita lenta e costante dai dati giornalieri. Il livello microscopico — considerando ogni singolo ticker — si osserva su scala mensile: il rapporto tra advancer e decliner di giugno è disponibile in riepilogo di giugno (in quel periodo sono scesi più ticker di quelli saliti), mentre il conteggio al limite del trimestre è in riepilogo del Q2. Una scansione semestrale degli advancer dell'intero mercato supera il budget di query generato da questa pagina; tale limite viene dichiarato qui invece di restringere silenziosamente i dati.
L'esatto SQL dietro ogni numero
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-01-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY d
)Il tape delle opzioni, mese per mese
Ciò che può mostrare solo un semestre: l'evoluzione del tape delle opzioni. Ogni pannello sottostante rappresenta uno scan completo di un mese — volume totale dei contratti e la quota scambiata nel giorno della propria scadenza (0DTE). Il dato rilevato: il volume è passato da 1316.1 milioni di contratti a gennaio a 1477.9 milioni a giugno — il mese più attivo del semestre — e la quota di scadenza in giornata è salita da 26.5% a gennaio a 34.3% a giugno, il mese con il valore più alto del semestre. Un terzo del volume delle opzioni di giugno è stato scambiato su contratti in scadenza lo stesso giorno.
L'esatto SQL dietro ogni numero
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-01-01 00:00:00')
AND window_start < toDateTime('2026-02-01 00:00:00')L'esatto SQL dietro ogni numero
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-02-01 00:00:00')
AND window_start < toDateTime('2026-03-01 00:00:00')L'esatto SQL dietro ogni numero
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-03-01 00:00:00')
AND window_start < toDateTime('2026-04-01 00:00:00')L'esatto SQL dietro ogni numero
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')L'esatto SQL dietro ogni numero
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')L'esatto SQL dietro ogni numero
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')Il costo di negoziazione, campionato mensilmente
L'esatto SQL dietro ogni numero
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-01-14 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-01-14 21:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-02-11 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-02-11 21:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-03-11 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-03-11 20:00:00', 9))
OR (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 ASCLo spread mediano quotato di SPY il secondo mercoledì di ogni mese: 0.145 bps nel campione di gennaio, 0.144 in quello di febbraio, circa il doppio durante i campioni primaverili, e 0.409 bps nel campione di giugno — il più ampio dei sei. Nota sul basis: si tratta di sessioni campionate con etichetta singola (il secondo mercoledì di ogni mese), non di mediane mensili — una scansione dell'intero tape per sei mesi eccederebbe il budget di query di questa pagina. Le date dei campioni sono presenti nel pannello, e le quotazioni non valide vengono conteggiate lì, non eliminate silenziosamente.
I nomi rilevanti del semestre
Rilevanza misurata, non scelta editoriale: l'elenco di seguito rappresenta la parte superiore della classifica per volume di scambi in dollari del trimestre, ricalcolata qui per fornire una prova documentale alla pagina; ogni nome che ha generato un'analisi approfondita rimanda alla relativa sezione.
L'esatto SQL dietro ogni numero
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 8MU ha registrato volumi superiori a SPY durante il secondo trimestre ($2047.5 miliardi contro $2032 miliardi) — lo stesso dato riportato nel riepilogo del Q2. Per i sei singoli titoli in cima alla classifica, il semestre:
L'esatto SQL dietro ogni numero
SELECT ticker,
round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, window_start >= toDateTime('2026-04-01 00:00:00') 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(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'NVDA', 'TSLA', 'SNDK', 'AMD', 'INTC')
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 tickerIl settore della memoria e dei semiconductor domina il semestre: SNDK ha reso 830.1% in sei mesi, MU 290% — la sua analisi tick per tick di giugno è disponibile qui — e INTC 269.3%. NVDA, il titolo con il maggior volume del gruppo con 3287.9 miliardi di turnover semestrale, ha reso 5.2% — una cifra a una sola cifra mentre i titoli della memoria hanno moltiplicato i valori; la sua analisi approfondita di giugno riporta tale divergenza sessione per sessione. TSLA è l'unico titolo in calo del gruppo con -8.2%. Il mega-listing di giugno è scambiato sotto un simbolo riutilizzato ed è escluso dalle scansioni dei leader in attesa della verifica dell'entità — il suo primo mese ha un post dedicato con i relativi dati. Base: il SET dei leader è scelto in base al volume di dollari durante l'orario regolare del Q2 (la scansione sopra); le colonne dei rendimenti si riferiscono al semestre, dalla prima apertura in orario regolare all'ultima chiusura in orario regolare.
L'ondata di IPO del semestre, mese per mese
L'esatto SQL dietro ogni numero
SELECT toString(toStartOfMonth(listing_date)) AS m, count() AS listings
FROM global_markets.stocks_ipos
WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')
GROUP BY m
ORDER BY mLa serie di quotazioni è stata concentrata nei primi mesi e poco omogenea: febbraio è stato il mese più intenso del semestre con 47 listing e marzo il più calmo con 17 — la celebre mega-quotazione di giugno è avvenuta in un mese con volumi altrimenti ordinari (35 listing).
Il calendario del semestre
L'esatto SQL dietro ogni numero
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-01-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-01-01') AND execution_date <= toDate('2026-06-30')) AS splits,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-01-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-01-01') AND filing_date <= toDate('2026-06-30')) AS h1_filings,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-03-31')) AS filings_mar31,
(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_jun30205 società sono quotate nel semestre — un'ondata di listing il cui debutto più rilevante a giugno ha il proprio post dettagliato per singola ricevuta — insieme a 830 split e 28356 eventi ex-dividend. Per dare un'idea, si tratta di più di una nuova quotazione per ogni sessione di trading durante il semestre. Il totale dei filing presenta una triplice discrepanza: l'indice SEC è quasi vuoto in ogni fine mese del semestre il cui ultimo giorno di calendario era un giorno lavorativo (55 filing indicizzati al 31 marzo, 34 al 30 aprile e 31 al 30 giugno, contro migliaia nei giorni adiacenti), pertanto il conteggio dei filing semestrali è sottostimato finché il feed non effettua il backfill — il gap di fine mese ha la sua nota diagnostica.
Il riepilogo della sessione
L'esatto SQL dietro ogni numero
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-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')) AS h1_sessionsNote sui dati
Note complete sui dati
- Lo short interest termina con il settlement del 15 giugno alla data di generazione (in attesa della rilevazione di fine giugno — dettagli completi nel riepilogo di giugno; questo post si aggiorna al momento della pubblicazione).
- Tre giorni di filing-index di fine mese per il 2026 sono quasi vuoti (31 marzo, 30 aprile, 30 giugno — ogni fine mese del semestre il cui ultimo giorno di calendario era un giorno lavorativo); i dati sono riportati insieme ai conteggi, come analizzato nel nota sul gap di fine mese. Le fine mese dell'anno precedente presentano migliaia di filing, quindi si tratta di un gap nel feed e non di un giorno festivo.
- La leaderboard a scala semestrale è limitata: una scansione semestrale dell'intero mercato supera il budget di query generato da questa pagina, pertanto il set dei nomi rilevanti è selezionato tramite la scansione della leaderboard a scala trimestrale mostrata nel testo; i rendimenti semestrali sono calcolati per quel set fisso — la base è indicata dove viene utilizzata. I riepiloghi di Q2 e giugno contengono le tabelle complete delle leader alle rispettive scale.
- Anche la breadth dell'intero mercato è limitata a scala semestrale — è mostrata la suddivisione giornaliera; i conteggi a livello di ticker sono disponibili a scala mensile e trimestrale, collegati nella sezione breadth.
- La serie storica di QQQ è più breve di quella di SPY: il fondo è stato scambiato sotto un simbolo radice differente per un periodo di anni; il limite del conteggio delle sessioni esclude visibilmente quegli anni (i conteggi delle sessioni per anno sono presenti nella tabella).
- I sei pannelli delle opzioni sono scansioni mensili dell'intero tape e il trend dello spread campiona una sessione etichettata al mese — entrambi vengono eseguiti tramite percorso batch; le basi del campione sono indicate nel testo.
- La microstructure è disponibile nel deep-dive del 29 giugno.
Metodologia
- Il periodo va dal 1° gennaio al 30 giugno 2026 — 123 sessioni, verificate tramite le barre osservate. I rendimenti sono calcolati dall'apertura alla chiusura delle ore regolari all'interno di ogni finestra, utilizzando le stesse query mostrate.
- I confronti storici vengono ricalcolati LIVE rispetto alla cronologia completa al minuto al momento della generazione — non vengono mai letti da valori memorizzati. Verifica della profondità: la data della prima barra al minuto nella visualizzazione ritardata utilizzata qui coincide con quella della tabella base (settembre 2003), verificata in fase di redazione; pertanto, la prima semestralità completa disponibile è quella del 2004. Ogni query storica fissa il limite superiore alla fine di questo periodo (il set di confronto non può espandersi con l'ingestione di anni successivi) e applica un limite minimo di sessioni con i conteggi annuali mostrati.
- Gli timestamp sono memorizzati in UTC con limiti UTC grezzi. I blocchi storici pluriennali filtrano le ore regolari secondo l'orario Eastern (9:30–15:59, convertito per riga — l'unica convenzione sicura per il DST attraverso i decenni); i blocchi a singola finestra in intervalli EDT utilizzano la banda UTC grezza equivalente. Entrambe le convenzioni sono indicate qui.
- La generazione avviene tramite il percorso di sola lettura protetto; la pagina pubblica non interroga mai i dati live. Stato del warehouse al 5 luglio 2026.
Questa è la prima edizione del recap semestrale standard; l'edizione annuale completa seguirà a gennaio. Dettaglio trimestrale: Q2 2026. I dati macroeconomici contro cui viene confrontato il semestre si trovano in quadro macro.