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

Analisi mercato 29 giugno 2026

Analisi dei dati del 29 giugno 2026: crescita degli indici, spread settoriale di quattro punti e dinamiche 0DTE. Scopri i dettagli della sessione qui.

Lunedì 29 giugno 2026 è stata una giornata rialzista guidata dalla crescita, con una leadership limitata: QQQ ha guadagnato 2.57%, SPY 1.62%, 3968 titoli liquidi sono saliti contro 2327 titoli in calo — eppure quasi la metà dei basket settoriali ha chiuso in rosso. Ogni numero è estratto da una query memorizzata; espandere qualsiasi pannello per visualizzare la SQL. Il livello tick-by-tick della stessa sessione: l'analisi approfondita della microstruttura del 29 giugno.

Il tabellone

Ogni variazione confronta l'ultima barra di un minuto della sessione regolare del 29 giugno con quella di venerdì 26 giugno.

QuerySPY / QQQ / DIA / IWM — 29 giugno vs chiusura del 26 giugno, regular hours
L'esatto SQL dietro ogni numero
WITH friday AS (
    SELECT ticker, argMax(close, window_start) AS friday_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00'
    GROUP BY ticker
),
monday AS (
    SELECT ticker,
           argMin(open, window_start) AS monday_open,
           argMax(close, window_start) AS monday_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-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
)
SELECT
    m.ticker AS ticker,
    toFloat64(f.friday_close) AS jun26_close,
    toFloat64(m.monday_open) AS jun29_open,
    toFloat64(m.monday_close) AS jun29_close,
    round((toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) * 100, 2) AS pct_change,
    round(100 * (toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) / max(toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) OVER (), 1) AS pct_of_best_change,
    toFloat64(m.day_high) AS day_high,
    toFloat64(m.day_low) AS day_low,
    m.shares_traded_m AS shares_traded_m
FROM monday m
JOIN friday f ON m.ticker = f.ticker
ORDER BY m.ticker

SPY ha aperto a $736.525 rispetto alla chiusura di venerdì a $729.09 e ha terminato a $740.88, sotto il suo massimo di $741.56. Il rendimento di QQQ del +2.57% rispetto al +0.81% di DIA indica una giornata favorevole ai titoli growth e tech; IWM ha registrato un incremento del 0.45% per le small-cap.

La giornata è stata insolita?

Un movimento percentuale ha poco valore senza un parametro di riferimento. Questo pannello confronta il 29 giugno con l'ultimo mese in base all'entità assoluta della variazione chiusura su chiusura.

QueryQQQ e SPY: ranking del 29 giugno rispetto all'ultimo mese di sessioni (rank 1 = maggior movimento assoluto)
L'esatto SQL dietro ogni numero
SELECT
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-06-29'))) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ') AS qqq_sessions_compared,
    round(max(if(ticker = 'QQQ', abs(cc_pct), 0)), 2) AS qqq_biggest_move_of_month_pct,
    countIf(ticker = 'QQQ' AND cc_pct > 0) AS qqq_up_sessions,
    round(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'SPY' AND d != toDate('2026-06-29'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_open_to_close_pct,
    concat(monthName(min(d)), ' ', toString(toDayOfMonth(min(d))), ', ', toString(toYear(min(d)))) AS first_session
FROM (
    SELECT ticker, d,
           (close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct,
           oc_pct
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS close_px,
               (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'QQQ')
          AND window_start >= toDateTime('2026-05-28 00:00:00')
          AND window_start < toDateTime('2026-06-30 00:00:00')
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker, d
    )
)
WHERE isFinite(cc_pct)

Significativo, ma non un record: il movimento del 2.57% di QQQ si posiziona al 5 delle sessioni del 21 a partire dal May 29, 2026, in un mese il cui singolo movimento più ampio è stato del 4.76%; il 1.62% di SPY si posiziona al 4 del 21. L'origine del movimento è rilevante: la variazione di SPY dall'apertura alla chiusura è stata solo del 0.59%, quindi la maggior parte del guadagno è derivata dal gap overnight, prima della prima candela durante l'orario regolare. QQQ ha chiuso in rialzo nel 10 di quelle sessioni: un mese con probabilità pari al cinquanta e cinquanta.

Breadth: quanto è stato ampio il rally?

Un advancer è un ticker il cui prezzo di chiusura di lunedì è superiore a quello di venerdì, tra i titoli con scambi superiori a un milione di dollari — un filtro che esclude il 5,108 di 11,475 ticker con doppia sessione.

QueryAdvancers vs decliners tra i ticker con almeno $1M scambiati il 29 giugno
L'esatto SQL dietro ogni numero
WITH per_ticker AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') AS monday_dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE (window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
       OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
    GROUP BY ticker
)
SELECT
    countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000) AS advancers,
    countIf(monday_close < friday_close AND monday_dollar_volume >= 1000000) AS decliners,
    countIf(monday_close = friday_close AND monday_dollar_volume >= 1000000) AS unchanged,
    countIf(monday_dollar_volume >= 1000000) AS liquid_tickers,
    count() AS tickers_traded_both_sessions,
    reverse(arrayStringConcat(extractAll(reverse(toString(count())), '[0-9]{1,3}'), ',')) AS tickers_traded_both_sessions_label,
    count() - countIf(monday_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
    reverse(arrayStringConcat(extractAll(reverse(toString(count() - countIf(monday_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS dropped_by_liquidity_filter_label,
    round(100.0 * countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000)
        / countIf(monday_dollar_volume >= 1000000), 1) AS advancer_pct
FROM per_ticker
WHERE friday_close > 0 AND monday_close > 0

3968 advancers, 2327 decliners, 72 unchanged: il 62.3% del tape liquido è salito — conteggiato un titolo alla volta, una giornata di ampia portata.

Settore per settore: il rally era meno ampio di quanto sembrasse

Contare i titoli in modo paritario è una prospettiva; ponderarli per capitalizzazione è un'altra. Gli undici ETF settoriali SPDR rappresentano la seconda opzione — un paniere per settore dell'S&P 500 ponderato per capitalizzazione di mercato. I risultati divergono nettamente dal conteggio della partecipazione.

QueryGli undici basket settoriali: 29 giugno vs chiusura del 26 giugno, regular hours
L'esatto SQL dietro ogni numero
WITH per_etf AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') / 1e6, 0) AS dollar_volume_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    sector,
    ticker,
    round((monday_close / friday_close - 1) * 100, 2) AS pct_change,
    round((day_high / day_low - 1) * 100, 2) AS range_pct,
    dollar_volume_m,
    round((monday_close / friday_close - 1) * 100 - min((monday_close / friday_close - 1) * 100) OVER (), 2) AS pct_above_worst_sector
FROM (
    SELECT *,
        multiIf(ticker = 'XLB', 'Materials',
                ticker = 'XLC', 'Communication services',
                ticker = 'XLE', 'Energy',
                ticker = 'XLF', 'Financials',
                ticker = 'XLI', 'Industrials',
                ticker = 'XLK', 'Technology',
                ticker = 'XLP', 'Consumer staples',
                ticker = 'XLRE', 'Real estate',
                ticker = 'XLU', 'Utilities',
                ticker = 'XLV', 'Health care',
                'Consumer discretionary') AS sector
    FROM per_etf
)
ORDER BY pct_change DESC

Il settore Technology ha guidato con 2.52%, seguito da consumer discretionary con 2.37%; materials ha chiuso a -1.82% e real estate a -0.64%. La dispersione settoriale della giornata — la differenza tra il miglior e il peggior settore — è stata di 4.34 punti percentuali, con utilities, staples, energy, real estate e materials tutti in rosso in una giornata di rialzo dell'indice. Ampia per numero di titoli, ristretta per peso: ecco cosa può nascondere il guadagno di un fondo indicizzato.

Il punto della giornata: memory e storage

Quattro titoli hanno seguito lo stesso trend con esiti molto diversi — solo co-movimento e magnitudo; i dati non spiegano il motivo.

QueryNomi memory/storage: variazione vs chiusura di venerdì e intraday range
L'esatto SQL dietro ogni numero
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-06-29 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-29 00:00:00') AS high_bar
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(friday_close, 2) AS jun26_close,
    round(monday_close, 2) AS jun29_close,
    round((monday_close / friday_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
FROM per_name
ORDER BY ticker

MU è il caso esemplare di range rispetto al variazione netta: un range intraday di 12.22% — un minimo di $1023.65 a 10:18 ET, un massimo di $1148.79 a 15:59 — eppure una chiusura 1.97% superiore a quella di venerdì. Western Digital è salita del 11.15% e Seagate del 8.17%; SanDisk ha chiuso al -1.9% su un range di 10.33% — l'unica chiusura in calo del cluster. La chiusura nasconde la volatilità subita dai possessori.

Dove sono stati scambiati i capitali

Per volume di dollari scambiati, Micron (MU) ha dominato il mercato, inclusi i fondi indicizzati: $58.47 miliardi contro i $33.97 miliardi di SPY. Per numero di azioni scambiate, la situazione è diversa.

QueryVolume leaders in due modalità: top 6 per dollari scambiati, top 4 per azioni scambiate
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-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    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-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    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

I dati sul numero di azioni possono trarre in inganno: i titoli più scambiati sono stati SOXS, un ETF inverse a leva 3x sui semiconduttori (695.3 milioni di azioni), e INLF, un penny stock le cui 353.8 milioni di azioni hanno valenza di circa $23 milioni per l'intera giornata. Il volume in dollari indica dove si sono spostati i capitali; il volume relativo indica se l'attività di un titolo è insolita rispetto alla sua media.

Nelle fasce temporali di 30 minuti di New York, il 29 giugno segue il classico "sorriso" dei volumi:

QueryAzioni scambiate 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,
    round(100 * (sum(toFloat64(volume)) / min(sum(toFloat64(volume))) OVER () - 1), 1) AS pct_above_trough
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'
GROUP BY et_time
ORDER BY et_time

2.3 miliardi di azioni nella prima mezz'ora di apertura, un minimo di 0.77 miliardi alle 13:30, e la fascia più ampia — 2.39 miliardi — nell'ultima mezz'ora di chiusura, dove si concentrano le auction di chiusura e i flussi di gestione indicizzata.

Il tape delle opzioni

Sono stati scambiati 66.33 milioni di contratti attraverso 11.04 milioni di operazioni.

QueryUna riga per l'intera giornata options: volume, 0DTE, 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-29 00:00:00' AND sip_timestamp < '2026-06-30 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-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS spy_regular_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) = '260629') / 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,
    countIf(sip_timestamp < '2026-06-29 13:30:00') AS premarket_prints,
    reverse(arrayStringConcat(extractAll(reverse(toString(countIf(sip_timestamp < '2026-06-29 13:30:00'))), '[0-9]{1,3}'), ',')) AS premarket_prints_label,
    countIf(sip_timestamp < '2026-06-29 13:30:00'
        AND underlying_symbol NOT IN ('SPX', 'SPXW', 'XSP', 'RUTW', 'VIX', 'VIXW')) AS premarket_non_index_prints,
    arrayStringConcat(arraySort(groupUniqArrayIf(underlying_symbol, sip_timestamp < '2026-06-29 13:30:00')), ', ') AS premarket_underlyings,
    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,
    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,
    reverse(arrayStringConcat(extractAll(reverse(toString(assumeNotNull(top_contract.5))), '[0-9]{1,3}'), ',')) AS top_contract_volume_label,
    round(top_contract.7, 3) AS top_contract_avg_price,
    round(top_contract.2 - spy_regular_close, 2) AS top_strike_minus_spy_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

I Call hanno rappresentato il 55.7% del volume dei contratti, e il 35.8% di tutto il volume scambiato è scaduto lo stesso lunedì — la sezione sui zero-days-to-expiry (0DTE). Il singolo contratto più scambiato è stato la call SPY con strike $741 in scadenza in giornata: 788,133 contratti con un premio medio di $0.474, con la chiusura di SPY posizionata 0.12 dollari sotto lo strike — l'opzione più scambiata della giornata è terminata out of the money. SPY ha registrato 12.01 milioni di contratti come sottostante; QQQ 7.32 milioni.

Il panel include anche 40,621 operazioni su opzioni prima dell'apertura azionaria delle 9:30 — tutte su un indice con regolamento in contanti (RUTW, SPX, SPXW, VIX, VIXW, XSP), con 0 operazioni su opzioni di stock o ETF nello stesso intervallo temporale. Si tratta di una regola, non di un caso: le opzioni sugli indici estendono le sessioni di trading globale, mentre le opzioni su stock ed ETF aprono con il mercato azionario. Gli stock sono scambiati in anticipo — si veda il trading premarket e after-hours — le loro opzioni no.

Nessun contratto con scadenza venerdì 3 luglio è stato scambiato durante la giornata (0 operazioni) — il mercato è chiuso quel venerdì — mentre sono stati scambiati 10.73 milioni di contratti con scadenza giovedì 2 luglio.

Il nastro delle quotazioni: il costo operativo della giornata

Ogni prezzo riportato in questa pagina deriva da un flusso di quotazioni — il National Best Bid and Offer, ripubblicato continuamente per ogni titolo quotato. La differenza tra il miglior bid e il miglior offer, lo spread bid-ask, rappresenta il costo che un ordine deve pagare per essere eseguito.

QueryCosto per crossare lo spread: aggiornamenti NBBO e median quoted width, regular hours
L'esatto SQL dietro ogni numero
SELECT
    ticker,
    round(count() / 1e6, 2) AS nbbo_updates_m,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00'), 2) AS open_30min_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS midday_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00')
        - quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS open_minus_midday_bps,
    countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid_quotes
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'MU', 'WDC')
  AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY ticker

La larghezza mediana delle quotazioni per SPY è stata pari a 0.41 punti base rispetto al mid-price, contro 0.84 per QQQ, 4.6 per Micron e 8.2 per Western Digital — il valore più elevato tra i quattro. Un punto base su un ordine da 10.000 dollari equivale a un dollaro; pertanto, acquistare e vendere istantaneamente 10.000 dollari di SPY al prezzo di quotazione costa circa 0.41; lo stesso round trip su Western Digital costa 8.2. La dimensione dell'operazione è rimasta invariata; è cambiato il titolo.

Tutti e quattro i titoli hanno presentato spread più ampi nella prima mezz'ora di negoziazione rispetto alla finestra di controllo di metà giornata — SPY 0.41 bps contro 0.27, Western Digital 14.33 contro 7.55, con un premio all'apertura di 6.78 bp sul titolo con lo spread maggiore. L'altra metà del dato riguarda il churn: 3.98 milioni di aggiornamenti NBBO su SPY durante l'orario regolare, 4.42 milioni su QQQ.

Tassi: la curva si è mossa appena

I Treasury hanno avuto un lunedì tranquillo. I rendimenti sono i valori di chiusura giornaliera, rispetto al 26 giugno.

QueryLa Treasury curve, chiusura 29 giugno vs 26 giugno (solo scadenze popolate)
L'esatto SQL dietro ogni numero
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jun29_yield_pct,
    round((t.2 - t.3) * 100) AS one_day_change_bp
FROM (
    SELECT arrayJoin([
        ('1 month',  toFloat64(mon.yield_1_month),  toFloat64(fri.yield_1_month)),
        ('3 month',  toFloat64(mon.yield_3_month),  toFloat64(fri.yield_3_month)),
        ('1 year',   toFloat64(mon.yield_1_year),   toFloat64(fri.yield_1_year)),
        ('2 year',   toFloat64(mon.yield_2_year),   toFloat64(fri.yield_2_year)),
        ('5 year',   toFloat64(mon.yield_5_year),   toFloat64(fri.yield_5_year)),
        ('10 year',  toFloat64(mon.yield_10_year),  toFloat64(fri.yield_10_year)),
        ('30 year',  toFloat64(mon.yield_30_year),  toFloat64(fri.yield_30_year)),
        ('2s10s spread', toFloat64(mon.yield_10_year - mon.yield_2_year), toFloat64(fri.yield_10_year - fri.yield_2_year))
    ]) AS t
    FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-29') AS mon,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-26') AS fri
)

Il titolo a 10 anni ha chiuso al 4.38%, invariato nella giornata (0 bp), mentre il titolo a 3 mesi ha aggiunto 4 bp a 3.87%. Lo 2s10s spread — il 10-year meno il 2-year — ha chiuso a 0.28 punti percentuali (-3 bp): ancora positivo, leggermente più piatto.

Il calendario della giornata

QueryCalendario corporate e information flow del 29 giugno, in un'unica riga
L'esatto SQL dietro ogni numero
WITH
    (
        SELECT (argMax(d, n), max(n))
        FROM (
            SELECT ex_dividend_date AS d, count() AS n
            FROM global_markets.stocks_dividends
            WHERE ex_dividend_date BETWEEN '2026-06-22' AND '2026-07-02'
            GROUP BY d
        )
    ) AS peak_ex_div,
    (
        SELECT (countIf(form_type = '424B2'), countIf(form_type = '4'), countIf(form_type = '8-K'), count())
        FROM global_markets.stocks_sec_edgar_index
        WHERE filing_date = '2026-06-29'
    ) AS filings,
    (
        SELECT (count(), uniqExact(publisher), countIf(has(tickers, 'NVDA')))
        FROM global_markets.stocks_news
        WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
    ) AS news,
    (
        SELECT 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-29'
            )
            WHERE t NOT IN ('NVDA', 'SPCX')
            GROUP BY t
        )
    ) AS runner_up_articles,
    (
        SELECT (any(split_from), any(split_to), count())
        FROM global_markets.stocks_splits
        WHERE ticker = 'HON' AND execution_date = '2026-06-29'
    ) AS hon_split,
    (
        SELECT (
            round(toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')), 2),
            round(toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'HON'
          AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
            OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    ) AS hon_close
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29') AS ex_dividend_records_jun29,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29'
        AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
                       'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
                       'SPY', 'QQQ', 'DIA', 'IWM', 'VTI')) AS household_name_ex_dividends,
    length(['AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
            'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
            'SPY', 'QQQ', 'DIA', 'IWM', 'VTI']) AS household_names_checked,
    concat(monthName(peak_ex_div.1), ' ', toString(toDayOfMonth(peak_ex_div.1))) AS busiest_ex_div_day_of_window,
    peak_ex_div.2 AS busiest_ex_div_day_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-29') AS splits_executed,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-29') AS ipos_listed_jun29,
    (SELECT arrayStringConcat(groupArray(ticker), ', ') FROM (
        SELECT ticker FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-01' ORDER BY ticker
    )) AS jul1_ipo_debuts,
    filings.4 AS sec_filings,
    filings.1 AS prospectus_424b2_filings,
    filings.2 AS insider_form4_filings,
    filings.3 AS filings_8k,
    news.1 AS news_articles,
    news.2 AS news_publishers,
    news.3 AS nvda_articles,
    runner_up_articles AS next_most_covered_articles,
    news.3 - runner_up_articles AS nvda_minus_next_most_covered,
    hon_split.3 AS hon_split_records,
    hon_split.1 AS hon_split_from,
    hon_split.2 AS hon_split_to,
    hon_close.1 AS hon_close_jun26,
    hon_close.2 AS hon_close_jun29

449 record di dividendi sono andati ex-dividend il 29 giugno — è necessario possedere il titolo prima della data ex-dividend per ricevere il pagamento — tuttavia, tra i 25 nomi noti da noi verificati, sono apparsi 0. L'ondata di fine trimestre ha raggiunto un picco di 745 record il July 1. Sono stati eseguiti 23 split e quotati 0 IPO; i debutti di mercoledì (BSP, ITG, LIME) sono già a calendario.

La SEC ha registrato 6173 filing datati 29 giugno: 1473 supplementi di pricing per structured-product (form 424B2) e 1277 report di insider-trade (Form 4) superano in numero i 231 8-K che dominano le notizie. Il nostro feed di notizie ha riportato 170 articoli da 3 editori; escludendo un simbolo riutilizzato con tag ambiguo (scartato nella query), il nome più coperto è stato NVDA con 14 articoli contro i 12 del secondo classificato.

Note sui dati

I dati anomali ricevono una nota, non vengono mai esclusi silenziosamente — questi quattro elementi influenzano i valori principali.

  • I basket settoriali seguono un metodo dichiarato. Il termine "settore" si riferisce agli undici ETF settoriali SPDR, ponderati per capitalizzazione di mercato — gli stessi nomi ogni sessione, non la classificazione per ticker di un vendor.
  • Il volume in dollari è un proxy al minuto — prodotto tra prezzo di chiusura e volume sommato per barra al minuto; è vicino, ma non identico, alla somma dei valori di print.
  • Gli spread quotati escludono quote non valide (record NBBO unidirezionali o incrociati); il panel indica quanti record sono stati scartati (1544 su SPY). La larghezza mediana della quotazione è una statistica di quoting, non un costo per singola operazione — gli ordini vengono spesso eseguiti all'interno della quota.
  • Un singolo print può contaminare il massimo o il minimo di una barra al minuto. La barra delle 11:07 ET di QQQ presenta un minimo di $709.58, mentre nessuna barra circostante è scesa sotto i $715.09 — un singolo print di $5.51 sotto il mercato concorrente. Ogni massimo e minimo superiore è stato verificato rispetto alle barre adiacenti; il minimo di sessione di QQQ a $705.172 è stato confermato.
Note complete sui dati
  • La copertura Treasury è più ridotta rispetto allo schema. Le quattro scadenze pubblicizzate (6 mesi, 3, 7 e 20 anni) non sono mai state popolate; la curva mostra i sette titoli esistenti, più la riga 2s10s.
  • Un "reverse split" di Honeywell contraddice il tape. Il feed riporta il record 1 di HON datato 29 giugno: un reverse split che converte 2 vecchie azioni in 1 nuove. HON ha chiuso a $231.3 venerdì e $227.71 lunedì — senza raddoppio. Non abbiamo applicato la correzione.
  • Il conteggio delle news proviene dal feed di un singolo vendor, i 3 editori che utilizziamo — non da "tutte le news di mercato".
  • I dati a livello di tick — quote incrociate, la correzione del volume fantasma, il file troncato del volume short di FINRA (e il motivo per cui il volume short non è lo short interest) — si trovano in l'analisi approfondita.

La sessione, verificata

QuerySession check: span minute-bar osservato di SPY e chiusura di venerdì sul tape
L'esatto SQL dietro ogni numero
WITH
    (
        SELECT (
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') = '11:07')), 2),
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') IN ('11:04', '11:05', '11:06', '11:08', '11:09', '11:10'))), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'QQQ' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS qqq_lone
SELECT
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= '2026-07-03 00:00:00' AND window_start < '2026-07-04 00:00:00') AS jul3_spy_bars,
    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-29 13:30:00' AND window_start < '2026-06-29 20:00:00') AS regular_session_bars,
    qqq_lone.1 AS qqq_1107_lone_low,
    qqq_lone.2 AS qqq_1107_adjacent_bars_low,
    round(qqq_lone.2 - qqq_lone.1, 2) AS qqq_lone_print_below_adjacent
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-29 00:00:00' AND window_start < '2026-06-30 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 riporta solo le chiusure imminenti). Quel venerdì 3 luglio è stata una chiusura completa — le candele di SPY hanno registrato 0 per tutta la giornata, il 4 luglio cadendo di sabato; la settimana di quattro sessioni ha il suo riepilogo.

FAQ

Come si è comportato il mercato azionario il 29 giugno 2026?

Una giornata positiva guidata dai titoli growth: QQQ ha chiuso 2.57% sopra venerdì, SPY 1.62%, DIA 0.81% e IWM 0.45%, con il 62.3% dei ticker con volumi superiori a 1m che ha chiuso in rialzo.

Il 29 giugno 2026 è stata una giornata importante per il Nasdaq?

Importante, ma non eccezionale: il movimento di chiusura su chiusura del 2.57% di QQQ si è posizionato al 5 delle sessioni del mese precedente per 21 in termini di valore assoluto, rispetto al massimo mensile di 4.76%.

Quali settori hanno guidato il mercato il 29 giugno 2026?

Technology (2.52%) e consumer discretionary (2.37%) hanno guidato gli undici basket settoriali SPDR; materials è stato l'ultimo al -1.82%, con uno spread di 4.34 punti percentuali. Anche Utilities, staples, energy e real estate hanno chiuso in ribasso.

Quale quota del volume delle opzioni il 29 giugno 2026 era composta da 0DTE?

Le scadenze in giornata hanno rappresentato il 35.8% dei 66.33 milioni di contratti scambiati; il singolo contratto più attivo, una call SPY da $741 con scadenza in giornata (788,133 contratti), è terminata out of the money.

Perché le opzioni vengono scambiate prima dell'apertura del mercato azionario?

Solo le opzioni sugli indici. Tutti i 40,621 segnali di opzioni prima delle 9:30 a.m. ET del 29 giugno erano legati a indici con regolamento in contanti (RUTW, SPX, SPXW, VIX, VIXW, XSP), che includono sessioni di trading globale estese; i segnali di opzioni su azioni ed ETF in quella finestra sono stati 0.

Metodologia

  • I timestamp sono memorizzati in UTC e convertiti nell'orario di New York all'interno delle query. Il "Close" rappresenta l'ultima barra dell'ultimo minuto della sessione regolare, non il prezzo dell'auction; i cambiamenti giornalieri confrontano il 29 giugno con il 26 giugno, e la sessione è stata verificata tramite l'intervallo delle barre osservate.
  • Il ranking dell'ultimo mese utilizza le variazioni close-over-close durante l'orario regolare; la prima sessione è stata esclusa (nessun close precedente all'interno della finestra temporale). Le scadenze delle opzioni sono rielaborate dal ticker OCC (la colonna delle scadenze della tabella è errata).
  • Ogni panel viene letto una sola volta, al momento della redazione, tramite il percorso di sola lettura protetto. Stato del Warehouse al 13 luglio 2026.

Ogni panel è il risultato di una query memorizzata — grafico, tabella e SQL in un unico oggetto. Copiare uno qualsiasi di essi nel terminale Strasmore. Prossima sessione: 30 giugno.