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

Recap mercato 2 luglio 2026

Rotazione pre-festività con Nasdaq in calo e breadth positiva. Settore tech e memory in selloff mentre otto fondi settoriali chiudono in rialzo.

Giovedì 2 luglio 2026 — l'ultima sessione prima della chiusura per l'Independence Day — è stata una giornata di rotazione con un titolo focalizzato sul selloff. QQQ ha registrato -1.71% mentre DIA è salito di 1.04%, e la breadth era POSITIVA: 3398 titoli liquidi sono saliti contro 2758, con 54.6% del mercato in territorio positivo mentre l'indice growth è sceso. Otto degli undici fondi settoriali hanno chiuso in rialzo; le vendite si sono concentrate nel tech e nel complesso memory che aveva rotto il giorno prima.

Il tabellone

QuerySPY / QQQ / DIA / IWM — 2 luglio vs chiusura 1 luglio, 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-07-01 13:30:00' AND window_start < '2026-07-01 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-07-02 13:30:00' AND window_start < '2026-07-02 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

Il rendimento di DIA al 1.04% rispetto a QQQ al -1.71% riassume la giornata: il settore industriale e il growth presentano una differenza di quasi tre punti nel rendimento giornaliero. SPY ha registrato una media del -0.12%; IWM ha chiuso al -0.59%.

Was the day unusual?

Two lenses in one panel: SPY's open-to-close move and QQQ's close-over-close move, each ranked against the trailing month by absolute size (rank 1 = biggest).

QuerySPY e QQQ rispetto all'ultimo mese di sessioni (rank 1 = massimo movimento assoluto)
L'esatto SQL dietro ogni numero
WITH per_day AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct,
           argMax(toFloat64(close), window_start) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ')
      AND window_start >= toDateTime('2026-06-02 00:00:00')
      AND window_start < toDateTime('2026-07-03 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
    GROUP BY ticker, d
),
with_prev AS (
    SELECT ticker, d, oc_pct,
           lagInFrame(rth_close) OVER (PARTITION BY ticker ORDER BY d) AS prev_close,
           (rth_close / lagInFrame(rth_close) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct
    FROM per_day
)
SELECT
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-02')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-02'))),
               groupArrayIf(abs(oc_pct), ticker = 'SPY' AND d != toDate('2026-07-02'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-02')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-02'))),
               groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-07-02') AND isFinite(cc_pct) AND prev_close > 0)) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ' AND isFinite(cc_pct) AND prev_close > 0) AS qqq_sessions_compared,
    toString(minIf(d, ticker = 'SPY')) AS first_session
FROM with_prev

At the index level, no. SPY's -0.35% open-to-close ranks 15 of 22 trailing sessions — the bottom half. QQQ was louder but still not extreme: its -1.71% close-over-close ranks 9 of 21 sessions with a defined prior close, back to 2026-06-02 — a mid-pack bad day for the growth index. The single-name tape is where July 2 was loud.

Breadth: tape in verde, indice di crescita in rosso

QueryAdvancers vs decliners tra i ticker con almeno $1M scambiati il 2 luglio
L'esatto SQL dietro ogni numero
WITH per_ticker AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-02 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-02 00:00:00')) AS day_close,
        sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-02 00:00:00') AS day_dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE (window_start >= '2026-07-01 13:30:00' AND window_start < '2026-07-01 20:00:00')
       OR (window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 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,
    reverse(arrayStringConcat(extractAll(reverse(toString(countIf(day_close > prior_close AND day_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS advancers_fmt,
    reverse(arrayStringConcat(extractAll(reverse(toString(countIf(day_close < prior_close AND day_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS decliners_fmt,
    reverse(arrayStringConcat(extractAll(reverse(toString(count() - countIf(day_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS dropped_by_liquidity_filter_fmt,
    reverse(arrayStringConcat(extractAll(reverse(toString(count())), '[0-9]{1,3}'), ',')) AS tickers_traded_both_sessions_fmt
FROM per_ticker
WHERE prior_close > 0 AND day_close > 0

3,398 rialzi, 2,758 ribassi, 63 invariati — 54.6% dei ticker liquidi è salito mentre QQQ è sceso. Gli indici ponderati per capitalizzazione e la breadth a uguale peso hanno risposto in modo differente; giornate come questa spiegano perché entrambi ricevano un panel. Il filtro esclude 5,317 di 11,536 ticker con scambi dual-session sotto il milione di dollari.

Settore per settore: dove si è concentrato il rialzo

La breadth conta il numero di titoli, ma non ne indica la tipologia. Gli undici ETF settoriali SPDR hanno analizzato la sessione per industria; il divario tra il miglior e il peggior settore rappresenta la dispersione della giornata in un unico valore.

QueryGli undici SPDR sector ETF — chiusura 2 luglio vs chiusura 1 luglio, regular hours
L'esatto SQL dietro ogni numero
WITH per_etf AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-02 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-02 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-02 00:00:00') / 1e9, 2) AS day_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 >= '2026-07-01 13:30:00' AND window_start < '2026-07-01 20:00:00')
        OR (window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 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_close / prior_close - 1) * 100 - min((day_close / prior_close - 1) * 100) OVER (), 2) AS pts_above_worst_sector,
    day_dollar_bn
FROM per_etf
ORDER BY ticker

Il settore Health care (XLV) ha guidato la classifica con 2.63%, seguito da utilities 2.23%, staples 2% e materials 1.94%. Il settore Technology (XLK) si è classificato ultimo con -2.71%, l'unico settore in calo di oltre un punto; consumer discretionary (-0.81%) e communication services (-0.13%) sono stati gli altri due fondi in rosso, mentre gli altri otto sono rimasti in rialzo. Dispersione dal miglior al peggior: 5.34 punti percentuali. La divergenza tra il rialzo del DIA e il calo del QQQ ha interessato l'intero mercato e non solo quattro megacap — motivo per cui una linea advance-decline in rialzo sotto un Nasdaq in calo non è una contraddizione.

Il punto della giornata: fuga dalla memoria, secondo giorno

Il settore che ha subito il crollo mercoledì è sceso ulteriormente giovedì — per magnitudo e co-movimento, non per causa.

QueryMemory e storage: variazione vs chiusura di mercoledì, range timing e dollar volume
L'esatto SQL dietro ogni numero
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-02 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-02 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-02 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-02 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-07-02 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-07-02 00:00:00') AS high_bar,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-02 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
      AND ((window_start >= '2026-07-01 13:30:00' AND window_start < '2026-07-01 20:00:00')
        OR (window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 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 ha registrato -14.32%, Seagate -10.38%, Western Digital -9.92%, MU -5.57% — su $51.4 miliardi di turnover di MU, circa una volta e mezza rispetto a quello di SPY. MU e SanDisk hanno toccato i minimi in tarda serata (15:26, 15:26 ET), Seagate e Western Digital prima (14:23, 13:59). Contesto: mercoledì e l'analisi approfondita su MU.

L'altra metà della rotazione, nelle megacap:

QueryMegacap rotation: variazione vs chiusura di mercoledì, range timing e dollar volume
L'esatto SQL dietro ogni numero
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-02 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-02 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-02 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-02 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-07-02 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-07-02 00:00:00') AS high_bar,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-02 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'TSLA')
      AND ((window_start >= '2026-07-01 13:30:00' AND window_start < '2026-07-01 20:00:00')
        OR (window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 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

AAPL è salita del 4.75% con un trend unidirezionale — minimo a 09:30 ET, massimo a 15:57, tre minuti prima della chiusura — mentre TSLA ha seguito l'andamento opposto a -7.65%. MSFT ha aggiunto 1.41%; NVDA ha chiuso a -1.55%. Stesso indice, giornate opposte.

Dove sono stati scambiati i capitali

QueryVolume leaders: top 6 per dollars traded, top 4 per shares traded (un simbolo duplicato escluso in attesa di verifica)
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-07-02 13:30:00' AND window_start < '2026-07-02 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-07-02 13:30:00' AND window_start < '2026-07-02 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

I $51.4 miliardi di MU hanno guidato gli scambi per la quarta sessione consecutiva (lunedì, martedì, mercoledì) rispetto ai $32.7 miliardi di SPY; i $26.57 miliardi di SanDisk hanno portato un secondo titolo del settore memory tra i primi quattro. SOXS — l'ETF 3x-inverse sui semiconduttori — ha dominato la classifica delle azioni con 748.2 milioni: le azioni a basso costo dominano per numero di titoli, quelle costose per valore monetario, mentre il volume relativo confronta il dato rispetto alla media abituale del titolo. Base: sessione regolare del 2 luglio, esclusa una quotazione con simbolo riutilizzato (ricevute).

QueryShares traded per bucket di 30 minuti, regular hours (billions)
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-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00'
GROUP BY et_time
ORDER BY et_time

2.13 miliardi di azioni nella prima mezz'ora di apertura, un minimo di 0.81 miliardi alle 14:30, 2.3 miliardi alla chiusura della vigilia festiva — quest'ultima è stata la fascia più rilevante della giornata, poiché l'asta di chiusura aggrega tutti gli ordini pendenti in un unico prezzo.

Il tape delle opzioni: le scadenze settimanali spostate

QueryRiga unica per l'intera giornata options: volume, same-day expiry, settimana con spostamento festivo e luglio mensile
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-07-02 00:00:00' AND sip_timestamp < '2026-07-03 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-07-02 13:30:00' AND window_start < '2026-07-02 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) = '260702') / 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, substring(ticker, length(ticker) - 14, 6) = '260710')) / 1e6, 2) AS jul10_weekly_contracts_m,
    round(toFloat64(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260717')) / 1e6, 2) AS jul17_monthly_contracts_m,
    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_fmt,
    round(top_contract.7, 3) AS top_contract_avg_price,
    round(top_contract.2 - spy_regular_close, 2) AS top_strike_minus_spy_close,
    round(spy_regular_close - top_contract.2, 2) AS spy_close_minus_strike
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'

Sono stati scambiati 80.96 milioni di contratti su 13.15 milioni di operazioni, e il 47.4% di quel volume è scaduto lo stesso giovedì. Nessun contratto con codice di scadenza 3 luglio è stato scambiato durante la giornata (0 operazioni), pertanto il giovedì ha comportato contemporaneamente la scadenza giornaliera e la scadenza settimanale spostata della settimana. Il contratto più scambiato è stato il put SPY $740 con scadenza in giornata — 540,403 contratti con un premio medio di $0.499, con lo SPY chiuso 4.8 dollari sopra lo strike: out of the money, e un put su un mercato dove martedì e mercoledì avevano call. Le call hanno rappresentato comunque il 58.4% del volume; la successiva weekly ha registrato 9.64 milioni di contratti, la monthly di luglio 8.82 milioni (meccaniche di scadenza).

Il nastro delle quotazioni: il costo del trading

I prezzi indicano cosa è successo; le quotazioni indicano quanto è costato. Lo bid-ask spread rappresenta il pedaggio su ogni operazione di andata e ritorno, espresso in basis points rispetto al mid-price (un basis point è un centesimo di punto percentuale). Lo misuriamo in ogni sessione, ordinaria o meno — il che rende l'affermazione "gli spread sono esplosi" verificabile.

QueryConteggio update NBBO azionario: 2 luglio vs 1 luglio, con update per ticker (millions)
L'esatto SQL dietro ogni numero
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-02')) / 1e6, 2) AS jul2_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-01')) / 1e6, 2) AS jul1_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-02')) / countIf(toDate(sip_timestamp) = toDate('2026-07-01')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-02') AND ticker = 'SPY') / 1e6, 2) AS jul2_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-02') AND ticker = 'QQQ') / 1e6, 2) AS jul2_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-02') AND ticker = 'MU') / 1e6, 2) AS jul2_mu_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-01 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'

Il national best bid and offer — il top del book consolidato — è stato aggiornato 597.22 milioni di volte il 2 luglio rispetto ai 449.15 milioni del 1 luglio: un incremento del 33% verso la chiusura. QQQ ha registrato 7.56 milioni, superando i 5.42 milioni di SPY; MU 1.01 milioni.

QueryMedian quoted spread in basis points, regular hours — index ETF, megacaps e memory names
L'esatto SQL dietro ogni numero
SELECT
    ticker,
    round(med_bps, 2) AS median_spread_bps,
    round(med_dollars * 100, 1) AS median_spread_cents,
    round(med_bps / min(med_bps) OVER (), 1) AS times_the_spy_spread,
    round(quote_updates / 1e6, 2) AS rth_updates_m,
    invalid_quotes_dropped
FROM (
    SELECT
        ticker,
        quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000,
                             toFloat64(bid_price) > 0 AND toFloat64(ask_price) > toFloat64(bid_price)) AS med_bps,
        quantileExactIf(0.5)(toFloat64(ask_price) - toFloat64(bid_price),
                             toFloat64(bid_price) > 0 AND toFloat64(ask_price) > toFloat64(bid_price)) AS med_dollars,
        count() AS quote_updates,
        countIf(NOT (toFloat64(bid_price) > 0 AND toFloat64(ask_price) > toFloat64(bid_price))) AS invalid_quotes_dropped
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'TSLA', 'NVDA', 'MU', 'SNDK', 'WDC')
      AND sip_timestamp >= '2026-07-02 13:30:00' AND sip_timestamp < '2026-07-02 20:00:00'
    GROUP BY ticker
)
ORDER BY median_spread_bps ASC

SPY ha quotato uno spread mediano di 0.27 basis points: circa 2 centesimi su un ETF da $744.8. QQQ si è attestato a 0.83 bps, NVDA 1.03. I titoli che hanno subito il caliero erano i più costosi da scambiare: MU 5.52 bps, SanDisk 10.4, Western Digital 10.7940 volte lo spread di SPY. Scambiare un paniere di titoli della memoria è costato molte volte più che scambiare l'indice, prima ancora di qualsiasi price impact. Le quotazioni non valide (unilaterali o incrociate) vengono contate per singolo titolo, non vengono nascoste.

QueryLa liquidità era insolita? Median spread di SPY in regular hours vs l'ultimo mese di sessioni
L'esatto SQL dietro ogni numero
WITH per_day AS (
    SELECT toDate(sip_timestamp) AS d,
           quantileExact(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000) AS med_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= '2026-06-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
      AND toFloat64(bid_price) > 0 AND toFloat64(ask_price) > toFloat64(bid_price)
    GROUP BY d
)
SELECT
    round(anyIf(med_bps, d = toDate('2026-07-02')), 3) AS jul2_median_spread_bps,
    round(quantileExact(0.5)(med_bps), 3) AS trailing_median_bps,
    round(anyIf(med_bps, d = toDate('2026-07-02')) - quantileExact(0.5)(med_bps), 3) AS jul2_minus_trailing_bps,
    arrayCount(x -> x > anyIf(med_bps, d = toDate('2026-07-02')), groupArrayIf(med_bps, d != toDate('2026-07-02'))) + 1 AS wider_rank,
    count() AS sessions_compared,
    round(max(med_bps), 3) AS widest_session_bps
FROM per_day

Una giornata ordinaria per la liquidità, ed è questa la conclusione: lo spread mediano di SPY di 0.27 bps si trova a 0 bps dalla mediana dell'ultimo mese (0.27 bps), posizionandosi nel 11 delle 22 sessioni per ampiezza — lontano dal valore massimo del mese di 0.409 bps. Un crollo concentrato in un contesto di prezzi in rialzo non ha messo sotto stress l'infrastruttura.

Tassi: i dati del 2 luglio sono disponibili

QueryIl receipt: il print Treasury del 2 luglio è archiviato
L'esatto SQL dietro ogni numero
SELECT
    (SELECT count() FROM global_markets.treasury_yields WHERE date = '2026-07-02') AS jul2_rows,
    (SELECT count() FROM global_markets.treasury_yields WHERE date = '2026-07-01') AS jul1_rows

Il feed Treasury pubblica i dati con uno o due giorni di ritardo rispetto al mercato: al momento della prima pubblicazione, la chiusura del 2 luglio non presentava righe registrate e questa pagina lo ha indicato invece di fare congetture. I dati sono ora disponibili — 1 righe per il 2 luglio, 1 per il 1 luglio — pertanto il pannello sottostante riporta la curva della sessione.

QueryPrint della curva della sessione: 2 luglio vs 1 luglio (solo scadenze popolate)
L'esatto SQL dietro ogni numero
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jul2_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-07-02') AS d,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-07-01') AS p
)

Alla chiusura, il 10 anni si è attestato al 4.49%, con lo spread 2s10s a 0.35 punti.

Il calendario della giornata

QueryCalendario corporate e information flow del 2 luglio, in un'unica riga (inclusi gli otto split dietro un falso movimento dello screener)
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-07-02'
    ) 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-07-02'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news,
    (
        SELECT (count(), countIf(split_to > split_from), countIf(split_to < split_from),
                arrayStringConcat(groupArray(concat(ticker, ' ', toString(split_to), '-for-', toString(split_from))), '; '))
        FROM global_markets.stocks_splits
        WHERE execution_date = '2026-07-02' AND ticker NOT IN ('SPCX')
    ) AS splits
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-02') AS ex_dividend_records,
    splits.1 AS splits_executed,
    splits.2 AS forward_splits,
    splits.3 AS reverse_splits,
    splits.4 AS split_records,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-02') AS ipos_listed,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-02') AS sec_filings,
    (SELECT uniqExactIf(accession_number, form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-02') AS insider_form4_filings,
    (SELECT uniqExactIf(accession_number, form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-02') AS filings_8k,
    (SELECT arrayStringConcat(groupArray(concat(ticker, ' — ', issuer_name)), '; ') FROM (
        SELECT ticker, issuer_name FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-02' 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 any(split_from) FROM global_markets.stocks_splits WHERE ticker = 'CRWD' AND execution_date = '2026-07-02') AS crwd_split_from,
    (SELECT any(split_to) FROM global_markets.stocks_splits WHERE ticker = 'CRWD' AND execution_date = '2026-07-02') AS crwd_split_to,
    (SELECT round(toFloat64(argMax(close, window_start)), 2) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'CRWD' AND window_start >= '2026-07-01 13:30:00' AND window_start < '2026-07-01 20:00:00') AS crwd_prev_close,
    (SELECT round(toFloat64(argMax(close, window_start)), 2) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'CRWD' AND window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00') AS crwd_day_close,
    (SELECT round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 2) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'CRWD' AND window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00') AS crwd_dollar_m,
    (SELECT count() FROM (
        SELECT ticker FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date = '2026-07-02')
          AND window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00'
        GROUP BY ticker
    )) AS split_names_with_bars

319 record di dividendi sono andati ex-dividend, sono arrivate 2 nuove quotazioni (MIACU — Meridian3 Industrials Acquisition Corp.; VIIU — Viking Acquisition Corp. II), e l'indice SEC ha registrato 5200 comunicazioni prima della festività — 2109 Form 4s, 258 8-Ks. Il feed di notizie ha riportato 201 articoli di 3 editori (NVDA i più coperti, 18 di essi).

I frazionamenti delle azioni (split) traggono in inganno chiunque legga i prezzi di chiusura grezzi. CRWD ha effettuato uno split di tipo 4 per 1, quindi il listino non rettificato mostra $772.45 mercoledì e $193.67 giovedì — un falso calo che in realtà corrisponde a quattro nuove azioni per ogni vecchia. Non è stato l'unico caso: sono stati eseguiti 8 record di split, 5 forward e 3 reverse (la colonna split_records li elenca), e uno split inverso crea l'effetto opposto — un prezzo grezzo che aumenta improvvisamente durante la notte. Solo 2 di quei titoli sono stati scambiati sul nostro listino; il turnover di $1473.51 milioni di CRWD è l'unico sufficientemente grande da contaminare uno schermo, e ogni screener dei top mover qui lo esclude.

In programma

Dati a calendario, non previsioni — ciò che i dati indicano per le prossime sessioni.

QueryDopo la festività: la prossima sessione, ex-dividends e split, prossima chiusura programmata e short-interest lag
L'esatto SQL dietro ogni numero
SELECT
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00') AS jul6_spy_regular_bars,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-06') AS exdiv_records_jul6,
    (SELECT arrayStringConcat(groupArray(ticker), ', ') FROM global_markets.stocks_dividends
     WHERE ex_dividend_date = '2026-07-06'
       AND ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'XOM', 'KO', 'PG', 'WMT', 'CVX', 'HD')) AS household_exdivs_jul6,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06') AS splits_jul6,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-02') AS next_scheduled_closure,
    (SELECT any(name) FROM global_markets.stocks_market_holidays
     WHERE date = (SELECT min(date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-02')) AS next_closure_name,
    (SELECT any(status) FROM global_markets.stocks_market_holidays
     WHERE date = (SELECT min(date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-02')) AS next_closure_status,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest
     WHERE settlement_date <= '2026-07-02') AS latest_si_settlement,
    (SELECT dateDiff('day', max(settlement_date), toDate('2026-07-02')) FROM global_markets.stocks_short_interest
     WHERE settlement_date <= '2026-07-02') AS si_settlement_age_days

Lunedì 6 luglio ha riaperto con una sessione completa da 390-bar, verificata tramite le proprie barre. Ha registrato 118 record ex-dividend — un nome noto tra i dieci che monitoriamo (JPM) — e 15 esecuzioni di split. Prossima chiusura prevista: Labor Day, 2026-09-07 (closed). Lo short interest era già noto, come di consueto — l'ultimo settlement registrato è di 2026-06-30, 2 giorni fa, con la pubblicazione che segue il settlement di circa due settimane (perché).

La sessione, verificata — e il venerdì che non c'è stato

QuerySession check: span osservato minute-bar di SPY e chiusura del 3 luglio sul tape
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-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00') AS day_sessions,
    (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
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-02 00:00:00' AND window_start < '2026-07-03 00:00:00'

Il 2 luglio è stata una sessione completa, non una chiusura anticipata: le candele di SPY vanno da 04:00 a 19:59 ora di New York (incluse le candele pre-market e after-hours), con esattamente 390 candele nella finestra regolare. Venerdì 3 luglio sono state registrate 0 candele di SPY — una chiusura completa per l'Independence Day, dato che il 4 luglio cadeva di sabato. La settimana di quattro sessioni: il riepilogo settimanale.

FAQ

Perché il Dow è salito mentre il Nasdaq è sceso il 2 luglio 2026?

I due indici contengono società differenti: DIA ha chiuso a 1.04%, QQQ a -1.71%. Il settore presenta la stessa divisione — health care, utilities e beni di consumo in testa, tecnologia per ultima a -2.71%, con un divario di 5.34 punti dal miglior al peggior.

La borsa era aperta il venerdì della settimana di Independence Day?

No. L'Independence Day è caduto di sabato e le borse hanno osservato la festività con la chiusura completa del venerdì successivo a questa sessione: i nostri dati mostrano 0 candele minute di SPY per tale data.

Cosa comporta un forward stock split sul prezzo delle azioni?

Moltiplica il numero di azioni per quattro e divide il prezzo per quattro; il valore della posizione rimane invariato. CRWD, 2 luglio: una chiusura non aggiustata di $772.45 mercoledì, $193.67 giovedì — un calo fittizio su qualsiasi screener che non consideri lo split.

Qual era l'ampiezza degli spread bid-ask il 2 luglio 2026?

Lo spread mediano quotato di SPY era di 0.27 punti base rispetto al mid-price durante l'orario regolare — 11 di 22 sessioni precedenti per ampiezza, una giornata ordinaria. I singoli titoli hanno registrato spread più ampi: MU 5.52 bps, WDC 10.79.

Note sui dati

  • Il volume in Dollar è un proxy al minuto — prezzo di chiusura × volume, sommati per barra.
  • Il dato Treasury di luglio è arrivato dopo la prima pubblicazione — la nota originale segnalava l'assenza tramite un conteggio delle righe; questa revisione include il dato, con relativo conteggio.
  • La variazione del close grezzo di CRWD è un artefatto dovuto a un split — esclusa dai monitor dei mover.
Note complete sui dati
  • Il board di settore comprende gli undici fondi SPDR Select Sector (XLB, XLC, XLE, XLF, XLI, XLK, XLP, XLRE, XLU, XLV, XLY) — un basket fisso e dichiarato, non un campo settore del vendor.
  • Il conteggio del quote-tape è suddiviso per data UTC del timestamp SIP; una sessione estiva rientra in un unico giorno UTC.
  • Una quotazione di giugno con simbolo riutilizzato è esclusa dalle classifiche (ricevute); l'analisi forense dei tick è disponibile nei deep-dives.

Metodologia

  • Il periodo è di una sessione di trading (sessione 1, verificata tramite le candele osservate). I timestamp sono memorizzati in UTC e convertiti nell'ora di New York all'interno delle query; "close" indica l'ultima candela al minuto della sessione regolare, e il cambio di giorno confronta il 2 luglio con il 1 luglio. La chiusura del 3 luglio è stata verificata tramite le candele, non è stata assunta.
  • Gli spread sono quotati (ask meno bid) in punti base rispetto al mid-price, mediana delle quotazioni NBBO durante l'orario regolare, su un quantile deterministico. I decimali vengono convertiti in float prima dell'aritmetica dei rapporti; le scadenze delle option vengono rielaborate dal ticker OCC. Ogni pannello viene letto una sola volta, al momento della redazione, tramite il percorso di sola lettura protetto.

Grafico, tabella e SQL sono un unico oggetto. Incolla qualsiasi pannello nel terminale Strasmore per personalizzarlo. Sessione precedente: 1 luglio. La settimana: la settimana festiva di quattro sessioni.