Strasmore Research
Recap di mercato Matt ConnorDi Matt Connor · Aggiornato 2026-07-24

Recap mercato 30 giugno 2026

L'ultima sessione del trimestre vede il settore technology guidare il mercato contro una maggioranza di titoli in rosso. Analisi dei dati su SPY e QQQ.

Martedì 30 giugno 2026 — l'ultima sessione del trimestre — è stata una giornata rialzista guidata dal settore technology in un mercato prevalentemente in rosso: QQQ ha guadagnato 1.63% e SPY 0.73%, tuttavia solo 4 dei fondi del settore S&P 10 ha chiuso in rialzo (3,349 titoli liquidi in rialzo, 3,033 in ribasso). La sessione precedente: il riepilogo del 29 giugno. Ogni numero riportato di seguito è estratto da una query memorizzata — espandere ogni pannello per visualizzare la SQL.

Il tabellone

Ogni variazione confronta l'ultima barra della sessione regolare del 30 giugno con quella di lunedì 29 giugno.

QuerySPY / QQQ / DIA / IWM — 30 giugno vs chiusura 29 giugno, regular hours
L'esatto SQL dietro ogni numero
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.ticker

SPY ha aperto a $741.29 e ha chiuso a $746.32, vicino al suo massimo di $748.02. Il 1.63% di QQQ rispetto al 0.12% di DIA descrive l'andamento della giornata: forte crescita per i titoli growth, i blue chip sono rimasti quasi invariati e IWM è 0.49%.

La chiusura del trimestre

Il 30 giugno ha segnato l'ultima delle 62 sessioni del secondo trimestre; l'andamento della giornata ha riproposto in miniatura quello del trimestre.

QueryQ2 2026 end to end: ogni index ETF dall'apertura del 1° aprile alla chiusura del 30 giugno, regular hours
L'esatto SQL dietro ogni numero
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 ASC

Dal 1° aprile alla chiusura del 30 giugno: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08%. Il QQQ ha dominato il trimestre e la giornata del 30 giugno, sebbene l'ordine di performance sia cambiato a metà periodo: lo SPY ha superato l'IWM nella singola giornata, mentre l'IWM ha superato lo SPY nell'intero trimestre. Il QQQ ha chiuso in rialzo in 38 delle 62 sessioni (il riepilogo del Q2 lo analizza sezione per sezione).

La giornata è stata insolita?

QueryVariazione open-to-close di SPY rispetto all'ultimo mese di sessioni (rank 1 = maggiore variazione assoluta)
L'esatto SQL dietro ogni numero
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
)

Dall'apertura alla chiusura della sessione — una prospettiva diversa rispetto al confronto tra le chiusure — lo SPY si è mosso dello 0.68%, posizionandosi al 7 posto su 21 sessioni precedenti per variazione assoluta. L'indice è rimasto stabile; l'attività di trading sottostante non lo è stata.

Breadth: un vantaggio positivo limitato

QueryAdvancers vs decliners tra i ticker con almeno $1M scambiati il 30 giugno
L'esatto SQL dietro ogni numero
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 > 0

3,349 rialzi, 3,033 ribassi, 88 invariati: il 51.8% dei titoli liquidi è salito — un esito incerto in un contesto di crescita dell'indice pari a 1.63%. Il filtro sulla liquidità esclude il 5,055 di 11,525 ticker con scambi dual-session (sotto il milione di dollari scambiati), qui inclusi e mai omessi.

Settore per settore: dove si è spostato il capitale

Contare i singoli titoli non mostra la reale distribuzione dei flussi. I dieci fondi elencati di seguito detengono ciascuno una quota dell'S&P 500; lo spread tra il miglior e il peggior indicatore misura il grado di disomogeneità della sessione.

QueryI dieci S&P sector funds al 30 giugno: variazione vs chiusura di lunedì e scarto rispetto al leader
L'esatto SQL dietro ogni numero
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 ASC

Il settore Technology (XLK) ha guadagnato il 2.69% e si è mosso in isolamento: industrials 1.34%, materials 0.36% e discretionary 0.15% sono stati gli unici altri settori in rialzo. Il resto del mercato è in calo, dai financials (-0.17%) fino alle utilities (-1.48%), staples (-1.53%) e infine real estate al -2%. Differenza tra il miglior e il peggior valore: 4.69 punti percentuali, con il 4 dei 10 fondi in rialzo. Un indice con una crescita inferiore all'un percento e uno spread di quattro punti: un singolo settore ha guidato la sessione.

I principali movimenti della giornata, mercato totale

La breadth indica quanti titoli sono saliti; questo mostra i movimenti più rilevanti — i primi cinque e gli ultimi cinque per variazione percentuale tra i titoli con un volume di scambi pari o superiore a $10 milioni.

QueryTop 5 gainers e top 5 decliners tra i nomi con oltre $10M scambiati il 30 giugno (una listing con simbolo riutilizzato esclusa)
L'esatto SQL dietro ogni numero
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 ASC

Nessun board segue l'andamento dell'indice. JEM ha guidato i rialzi con il +256.76% su $141 milioni scambiati; SOC ha perso il 55.89% su $306 milioni. ABVX è salito del 38.56% su $942 milioni, il turnover più elevato di entrambi i board; NVCT è sceso del 35.62% e UNCY del 39.09%. La colonna dei record di split garantisce l'accuratezza del board — un reverse split di uno a dieci si traduce in un "guadagno" del +900% su un listino non rettificato — e ogni titolo qui riporta un 0: dati reali.

Tre righe rappresentano lo stesso trade ripetuto due volte: CRCA (-35.16%) e CRCG (-35.19%) sono scesi, mentre CRCD è salito del 35.47% — ciascuno vicino al doppio del movimento del -17.53% del titolo adiacente alle crypto riportato sotto: i wrapper a leva su singole azioni.

Il punto della giornata: i semiconduttori in fase di svolta trimestrale

Sei titoli, un unico tema, esiti molto diversi — si osserva solo co-movimento e magnitudo; i dati non ne spiegano la causa.

QueryNomi semiconductor e storage: variazione vs chiusura di lunedì, range e dollar volume
L'esatto SQL dietro ogni numero
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 ticker

SanDisk è salita del 10.79%, AMD del 7.7%, Intel del 5.93%, TSMC del 4.86% — mentre MU, con il volume di scambi più alto del mercato a $37.41 miliardi, ha chiuso in rialzo solo dello 0.52% e Western Digital (-2.01%) non ha partecipato. Questo è il complesso dietro il risultato del settore technology del 2.69% (MU a giugno, tick per tick).

Il trend contrario ha interessato i titoli finanziari legati alle crypto, in direzione opposta al mercato rialzista:

QueryFinancials crypto-adjacent: variazione vs chiusura di lunedì, range e dollar volume
L'esatto SQL dietro ogni numero
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 ticker

CRCL ha registrato un -17.53%, con il suo minimo di $62.52 raggiunto alle 15:59 ET — l'ultimo minuto della sessione — insieme a MSTR -6.2%, COIN -3.61% e HOOD -1.53%. Co-movimento osservato; la causa non è stata confermata.

Cosa ha riportato il feed di notizie

Un riepilogo che non si assume la responsabilità delle cause deve al lettore ciò che è stato effettivamente pubblicato quel giorno.

QueryNews feed del 30 giugno: numero di articoli e ultima headline del giorno per ogni nome in questo recap
L'esatto SQL dietro ogni numero
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 ASC

Il nome più trattato è stato NVDA con 21 articoli — non tra i titoli più dinamici della giornata — il suo ultimo pezzo della sessione (16:28 ET, Investing.com) intitolato "These Stocks Could Benefit as the Robotaxi Race Heats Up". MU ha ottenuto 7; l'unico articolo su SanDisk (The Motley Fool) è l'unico titolo dell'intera giornata a citare un movimento reale: "Why Sandisk Stock Is Skyrocketing Today".

Il dato rilevante è la discrepanza: il titolo con il maggior calo della giornata, il principale rialzo e il nome legato al settore crypto che ha registrato la perdita più pesante hanno generato 0, 0 e 0 articoli — zero ciascuno, all'interno di un feed di 211 pezzi. La copertura mediatica non è un indicatore dell'andamento dei prezzi.

Dove sono stati scambiati i capitali

QueryVolume leaders in due modi: top 6 per dollars traded, top 4 per shares traded (una listing con simbolo riutilizzato esclusa in attesa di verifica entity)
L'esatto SQL dietro ogni numero
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) DESC

In termini di dollari, MU ha dominato su tutto, inclusi gli index fund: $37.41 miliardi contro i $31.84 miliardi di SPY — è la seconda sessione consecutiva in cui ha superato per volumi il flagship index fund (il riepilogo di lunedì riporta il primo). Il book delle quotazioni indica dati diversi: SOXS, un ETF inverse sui semiconduttori con leva 3x (515.5 milioni di azioni), e due titoli sotto il dollaro il cui valore è trascurabile rispetto a MU — il volume presenta due interpretazioni.

Un titolo è escluso intenzionalmente da entrambi i book: una quotazione di giugno il cui ticker apparteneva precedentemente a un'altra società non correlata, pertanto i feed dei fornitori associano due entità diverse allo stesso ticker di tre lettere (ricevute qui).

QueryShares traded per bucket di 30 minuti, regular hours (miliardi)
L'esatto SQL dietro ogni numero
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_time

2.05 miliardi di azioni nella prima mezz'ora, un minimo di 0.78 miliardi alle 13:30, e il volume principale della giornata — 2.69 miliardi — verso la chiusura di fine trimestre, dove l'asta di chiusura e i relativi flussi di rebalancing registrano i dati (l'analisi approfondita del 29 giugno si trova sotto le barre]).

Il tape delle opzioni

QueryUna riga per l'intera giornata options: volume, same-day expiry, SPY's put/call skew per moneyness, settimana con spostamento festivo
L'esatto SQL dietro ogni numero
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'

Sono stati scambiati 61.95 milioni di contratti per un totale di 10.06 milioni di print; i call hanno rappresentato il 57.3% del volume totale e il 28% di essi è scaduto quel martedì. SPY ha seguito una direzione opposta: 12.04 milioni di contratti con un put/call ratio di 1.09 — più put che call, in una giornata di rialzo del fondo.

Confrontando le scadenze giornaliere di SPY con la sua chiusura a $746.32, lo skew risulta evidente: 3.33 milioni di put out-of-the-money (strike inferiori alla chiusura) e 2.28 milioni di call out-of-the-money, contro 1.77 milioni di call in-the-money e 0.63 milioni di put in-the-money — gli strike ribassisti scaduti senza valore sono stati la categoria più attiva della giornata 0DTE di SPY. Nessun titolo con codice di scadenza venerdì 3 luglio è stato scambiato (0 print — il mercato è chiuso quel venerdì); la weekly di giovedì ha registrato 10.52 milioni.

QueryI sei option contracts più attivi del 30 giugno, per contracts traded
L'esatto SQL dietro ogni numero
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 ASC

Il contratto più scambiato in assoluto è stato la call SPY $747 a scadenza giornaliera — 821,361 contratti con un premio medio di $0.641, conclusasi $0.68 sopra l'ultima barra regolare di SPY e senza valore. Il quadro generale è emblematico: cinque dei sei contratti più scambiati sul tape erano strike SPY a scadenza giornaliera, distanti un dollaro l'uno dall'altro intorno alla chiusura (SPY $748 call il successivo), ciascuno scambiato per pochi centesimi. L'eccezione, con il 65.1% del volume del leader, è stata la KWEB $29 call in scadenza il December 18, 2026, non un contratto a scadenza giornaliera: una posizione a sei mesi tra cinque biglietti della lotteria pomeridiani.

Tassi: la parte lunga è salita alla chiusura della prima metà

QueryLa Treasury curve, chiusura 30 giugno vs 29 giugno (solo maturities popolate)
L'esatto SQL dietro ogni numero
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 parte lunga ha registrato un rialzo nell'ultimo giorno della metà: il 10-year è salito di 6 bp portandosi al 4.44%, il 2-year di 4 bp al 4.14%, e lo spread 2s10s si è accentuato di 2 bp arrivando a 0.3 punti. I rendimenti a lunga scadenza sono aumentati durante una sessione in cui il settore più debole, il real estate (-2%), e il terzo settore più debole, le utilities (-1.48%), sono entrambi classici settori sensibili ai tassi: una coincidenza degna di nota, ma non un meccanismo che questi dati possano dimostrare (il recap della H1 determina la curva della metà).

Il calendario dietro la giornata

QueryCalendario corporate e information flow del 30 giugno, in un'unica riga (gap filing-index visualizzato)
L'esatto SQL dietro ogni numero
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_session

704 titoli sono andati ex-dividend nell'ultimo giorno del trimestre — un'ondata di fine trimestre, con la maggior parte delle società US che paga dividendi trimestrali — con 7 split e 2 nuove quotazioni (AACU — Ares Acquisition Corp III; OSPRU — Osprey Acquisition Corp. III). La colonna dei filing è il dato principale sulla qualità dei dati: l'indice SEC contiene 31 filing per il 30 giugno — 0 Insider Form 4s, 0 8-Ks — rispetto a 4439 della sessione precedente. Un pattern di fine mese nel feed, analizzato in nota sul gap di fine mese; qualsiasi conteggio che includa questo giorno risulta sottostimato finché non viene effettuato il backfill.

La sessione, verificata

QuerySession check: span osservato minute-bar di SPY
L'esatto SQL dietro ogni numero
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'

Le candele di SPY vanno da 04:00 a 19:59 ora di New York con esattamente 390 candele in finestra regolare — una sessione completa, verificata dal tape (il dataset del calendario di borsa contiene solo le chiusure imminenti).

What the session adds up to

A 0.73% SPY print with 51.8% of names higher, 4 of 10 sector funds green and 4.69 points between best and worst is not a broad rally — it is one sector's rally wearing an index's clothes, its heaviest half-hour in a quarter-end auction. An index change is an average, and this one was carried by technology while most sectors fell: check the dispersion before trusting the arrow.

FAQ

Com'è andato il mercato azionario il 30 giugno 2026?

Il mercato ha chiuso in rialzo: SPY ha guadagnato 0.73% e QQQ 1.63% rispetto alla chiusura del 29 giugno. La partecipazione è stata più limitata — 51.8% dei titoli liquidi è salito, mentre il 4 dei fondi settoriali S&P 10 è risultato in verde.

Quale settore ha guidato il mercato il 30 giugno 2026?

Technology: XLK ha guadagnato 2.69%, contro il 1.34% dei titoli industriali e l'ultimo posto con il -2% per il real estate — uno spread di 4.69 punti tra il miglior e il peggior settore.

Quali sono stati i titoli con la maggiore variazione il 30 giugno 2026?

Tra i titoli con scambi superiori a 10 milioni di dollari, JEM ha registrato il maggior guadagno (+256.76%) e SOC la maggior perdita (55.89%). Nessuno dei due ha registrato split: si tratta di variazioni di prezzo reali e non di effetti derivanti da corporate action.

Com'è andato il mercato azionario nel Q2 2026?

Dall'apertura del 1° aprile alla chiusura del 30 giugno, su 62 sessioni: QQQ +26.53%, IWM 20.21%, SPY 14.13%, DIA 12.08% — un trimestre guidato dai titoli growth, conclusosi con una giornata di rialzo guidata dai titoli growth.

Perché si scambia così tanto volume nell'ultima mezz'ora?

L'ultima mezz'ora ha registrato 2.69 miliardi di azioni contro i 2.05 miliardi dell'apertura. L'asta di chiusura stabilisce il prezzo ufficiale di chiusura di ogni titolo in un unico crossing; gli index fund operano in quella fase per allinearsi al prezzo. Il ribilanciamento di fine trimestre concentra i flussi.

Note sui dati e metodologia

  • I basket. Il pannello settoriale include i dieci fondi settoriali SPDR indicati nel panel — lo stesso basket per ogni sessione, così il valore della dispersion è confrontabile tra i giorni. I pannelli sui mover richiedono un turnover di 10 milioni di dollari e una chiusura precedente superiore a 1, escludono l'elenco di simboli riutilizzati sopra e includono una colonna relativa agli split.
  • Avvertenze. Il volume in dollari è un proxy al minuto (chiusura × volume per barra). L'indice relativo al filing del 30 giugno è quasi vuoto (la nota sul gap di fine mese ne spiega il motivo). Il conteggio delle news proviene da un unico feed di un vendor: l'assenza di un articolo qui non prova che non sia stato pubblicato nulla altrove.
  • Metodologia. Una sessione (1, verificata tramite le barre osservate); i timestamp sono salvati in UTC e convertiti in ora di New York nelle query; il "close" è l'ultima barra regolare al minuto, non il print dell'auction. Le scadenze delle option sono rielaborate dal ticker OCC (la colonna della tabella è errata); la moneyness è misurata rispetto all'ultima barra regolare di SPY. I panel vengono generati una sola volta, al momento della redazione, tramite il percorso di sola lettura protetto. Warehouse aggiornato al 13 luglio 2026.

Ogni panel è il risultato di una query salvata — grafico, tabella e SQL in un unico oggetto. Copia uno qualsiasi di essi nel terminale Strasmore. Prossima sessione: 1 luglio.