Strasmore Research
Récap des marchés Matt ConnorPar Matt Connor · Mis à jour le 2026-07-23

Récapitulatif marché 2 juillet 2026

Rotation sectorielle avant le congé : largeur de marché positive malgré la baisse du Nasdaq. La tech et le secteur mémoire subissent un drawdown important.

Le jeudi 2 juillet 2026 — dernière séance avant la fermeture pour l'Independence Day — a été une journée de rotation masquée par une vente massive. Le QQQ a affiché -1.71% tandis que le DIA a progressé de 1.04%, avec une largeur de marché POSITIVE : 3398 titres liquides ont progressé contre 2758, et 54.6% du flux était dans le vert alors que l'indice growth chutait. Huit des onze fonds sectoriels ont clôturé en hausse ; la pression vendeuse s'est concentrée sur la tech et le complexe mémoire qui avait cassé la veille.

Le tableau des scores

RequêteSPY / QQQ / DIA / IWM — 2 juillet vs clôture du 1er juillet, séance régulière
Le SQL exact derrière chaque chiffre
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

Le DIA à 1.04% face au QQQ à -1.71% résume la journée : l'écart de rendement quotidien entre les valeurs industrielles et les valeurs de croissance est de près de trois points. Le SPY a fait la moyenne à -0.12% ; l'IWM a clôturé à -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).

RequêteClassement SPY et QQQ par rapport au mois de sessions précédent (rang 1 = plus gros mouvement absolu)
Le SQL exact derrière chaque chiffre
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.

Largeur du marché : tape verte, indice de croissance rouge

RequêteAvances vs déclins parmi les tickers avec au moins 1M$ échangés le 2 juillet
Le SQL exact derrière chaque chiffre
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 hausses, 2,758 baisses, 63 inchangés — 54.6% des titres liquides ont progressé alors que le QQQ a chuté. Les indices pondérés par la capitalisation et la largeur par nombre égal ont réagi différemment ; ce type de journée explique pourquoi les deux reçoivent un panel. Le filtre exclut 5,317 des 11,536 tickers à double session avec un volume inférieur à un million de dollars.

Par secteur : l'analyse de la performance

La largeur du marché (breadth) indique le nombre de titres, mais pas leur nature. Les onze fonds sectoriels SPDR ont découpé la séance par industrie ; l'écart entre le meilleur et le pire représente la dispersion de la journée en une seule valeur.

RequêteLes onze ETF sectoriels SPDR — clôture du 2 juillet vs clôture du 1er juillet, séance régulière
Le SQL exact derrière chaque chiffre
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

La santé (XLV) arrive en tête avec 2.63%, suivie des services publics 2.23%, de la consommation de base 2% et des matériaux 1.94%. La technologie (XLK) termine dernier à -2.71%, étant le seul secteur en baisse de plus d'un point ; la consommation discrétionnaire (-0.81%) et les services de communication (-0.13%) sont les deux autres fonds en territoire négatif, les huit autres étant en hausse. Dispersion du meilleur au pire : 5.34 points de pourcentage. La divergence entre la hausse du DIA et la baisse du QQQ s'est étendue à l'ensemble du marché et ne s'est pas limitée aux quatre méga-capitalisations — c'est pourquoi une ligne advance-decline en hausse malgré un Nasdaq en baisse n'est pas une contradiction.

L'événement de la journée : la vente massive se poursuit, deuxième jour

Le secteur qui a chuté mercredi a subi une baisse plus forte jeudi — en termes d'amplitude et de corrélation, pas de causalité.

RequêteValeurs mémoire et stockage : variation vs clôture de mercredi, timing du range et volume en dollars
Le SQL exact derrière chaque chiffre
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 a affiché -14.32%, Seagate -10.38%, Western Digital -9.92%, MU -5.57% — sur un volume de $51.4 milliards pour MU, soit environ une fois et demie le volume du SPY. MU et SanDisk ont atteint leurs plus bas en fin de séance (15:26, 15:26 ET), Seagate et Western Digital plus tôt (14:23, 13:59). Contexte : mercredi et l'analyse détaillée de MU.

L'autre versant de la rotation, sur les megacaps :

RequêteRotation Megacap : variation vs clôture de mercredi, timing du range et volume en dollars
Le SQL exact derrière chaque chiffre
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 a progressé de 4.75% de manière unidirectionnelle — plus bas à 09:30 ET, plus haut à 15:57, trois minutes avant la clôture — tandis que TSLA a suivi la trajectoire inverse à -7.65%. MSFT a gagné 1.41% ; NVDA a clôturé à -1.55%. Même indice, journées opposées.

Flux de capitaux

RequêteLeaders de volume de deux manières : top 6 par dollars échangés, top 4 par actions échangées (un symbole dupliqué exclu en attente de vérification)
Le SQL exact derrière chaque chiffre
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

Avec 51.4 milliards de dollars, MU a dominé les échanges pour la quatrième séance consécutive (lundi, mardi, mercredi), face aux 32.7 milliards de dollars de SPY. SanDisk, avec 26.57 milliards de dollars, est le deuxième titre du secteur de la mémoire dans le top quatre. SOXS — l'ETF inverse 3x sur les semi-conducteurs — arrive en tête du tableau des actions avec 748.2 millions : les actions peu chères dominent en nombre d'unités, tandis que les actions chères dominent en valeur monétaire. Le volume relatif compare chaque valeur à sa propre moyenne. Base : séance régulière du 2 juillet, excluant une cotation avec symbole réutilisé (reçus).

RequêteActions échangées par tranche de 30 min, séance régulière (milliards)
Le SQL exact derrière chaque chiffre
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 milliards d'actions échangées durant la première demi-heure, un creux de 0.81 milliards à 14:30, et 2.3 milliards jusqu'à la clôture de la veille du jour férié — cette dernière tranche est la plus importante de la journée, car l'enchère de clôture regroupe les ordres en attente en une seule transaction.

Le tape des options : les échéances hebdomadaires décalées

RequêteUne ligne pour la journée d'options : volume, expiration le jour même, semaine décalée (férié) et mois de juillet
Le SQL exact derrière chaque chiffre
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'

Le volume d'options échangé s'est élevé à 80.96 millions de contrats pour 13.15 millions de transactions, et 47.4% de ce volume a expiré le même jeudi. Aucun contrat avec un code d'expiration au 3 juillet n'a été enregistré durant la journée (0 transactions) ; le jeudi a donc combiné l'expiration quotidienne et l'échéance hebdomadaire décalée de la semaine. Le contrat le plus actif était le put SPY $740 à échéance le jour même — 540,403 contrats avec une prime moyenne de $0.499, le SPY clôturant 4.8 dollars au-dessus du strike : il était donc out of the money, avec un put sur un marché où mardi et mercredi avaient enregistré des calls. Les calls représentaient toujours 58.4% du volume ; la prochaine échéance hebdomadaire a attiré 9.64 millions de contrats, et l'échéance mensuelle de juillet 8.82 millions (mécanismes d'expiration).

Le tape : le coût de la transaction

Les prix indiquent ce qui s'est passé ; les quotes indiquent ce que cela a coûté. Le bid-ask spread représente la taxe sur chaque transaction aller-retour, exprimée en points de base du mid-price (un point de base équivaut à un centième de pour cent). Nous le mesurons à chaque session, ordinaire ou non — ce qui permet de vérifier la validité de l'affirmation selon laquelle « les spreads se sont élargis ».

RequêteNombre de mises à jour NBBO des actions : 2 juillet vs 1er juillet, avec mises à jour par ticker (millions)
Le SQL exact derrière chaque chiffre
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'

Le NBBO (National Best Bid and Offer) — le sommet du carnet consolidé — a été réécrit 597.22 millions de fois le 2 juillet contre 449.15 millions le 1er juillet : soit une hausse de 33% avant la clôture. Le QQQ a atteint 7.56 millions, dépassant les 5.42 millions du SPY ; le MU a atteint 1.01 millions.

RequêteSpread médian coté en points de base, séance régulière — ETF indices, megacaps et valeurs mémoire
Le SQL exact derrière chaque chiffre
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

Le SPY présentait un spread médian de 0.27 points de base : environ 2 cents pour un ETF à 744.8 $. Le QQQ était à 0.83 bps, et le NVDA à 1.03. Les titres subissant la baisse étaient les plus coûteux à négocier : le MU à 5.52 bps, le SanDisk à 10.4, le Western Digital à 10.79 — soit 40 fois le spread du SPY. Passer un panier de titres de mémoire coûtait plusieurs fois plus cher que de passer l'indice, avant même l'impact sur les prix. Les quotes invalides (unilatérales ou croisées) sont comptabilisées par titre, sans être occultées.

RequêteLa liquidité était-elle inhabituelle ? Spread médian en séance régulière du SPY vs mois de sessions précédent
Le SQL exact derrière chaque chiffre
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

La liquidité était normale, tel est le constat : le spread médian du SPY de 0.27 bps se situe à 0 bps de la médiane du mois précédent (0.27 bps, classant cette journée 11 sur 22 sessions en termes d'élargissement — loin du maximum mensuel de 0.409 bps). Une chute concentrée dans un marché haussier n'a pas mis la structure sous tension.

Taux : publication du 2 juillet disponible

RequêteLe print : le print du Treasury du 2 juillet est enregistré
Le SQL exact derrière chaque chiffre
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

Le flux des obligations du Trésor accuse un retard de un ou deux jours sur le marché : lors de la première publication, la clôture du 2 juillet ne contenait aucune ligne, et cette page l'indiquait au lieu de faire des suppositions. Les données sont désormais disponibles — 1 ligne pour le 2 juillet, 1 pour le 1er juillet — le tableau ci-dessous présente donc la courbe de la séance.

RequêtePrint de la courbe de la session : 2 juillet vs 1er juillet (uniquement maturités renseignées)
Le SQL exact derrière chaque chiffre
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
)

À la clôture, le 10 ans s'établissait à 4.49%, le spread 2s10s à 0.35 points.

Le calendrier de la journée

RequêteCalendrier corporate et flux d'informations du 2 juillet, sur une ligne (incluant les huit splits derrière un faux mouvement de screener)
Le SQL exact derrière chaque chiffre
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 registres de dividendes sont passés en ex-dividend, 2 nouvelles cotations sont arrivées (MIACU — Meridian3 Industrials Acquisition Corp.; VIIU — Viking Acquisition Corp. II), et l'indice SEC a enregistré 5200 dépôts avant le jour férié — 2109 Form 4s, 258 8-Ks. Le flux d'actualités a diffusé 201 articles provenant de 3 éditeurs (NVDA les plus cités, 18 d'entre eux).

Les splits piègent tout lecteur de cours de clôture bruts. CRWD a effectué un split forward de 4 pour 1, donc la série non ajustée affiche $772.45 mercredi et $193.67 jeudi — une baisse fictive qui correspond en réalité à quatre nouvelles actions pour chaque ancienne action. Ce n'était pas un cas isolé : 8 splits ont été exécutés, 5 forward et 3 reverse (la colonne split_records les répertorie), et un split reverse produit l'effet inverse — un prix brut qui bondit du jour au lendemain. Seuls 2 de ces titres ont été échangés sur notre tape ; le turnover de 1473.51 millions de dollars de CRWD est le seul assez important pour contaminer un écran, et chaque filtre de mouvement ici l'exclut.

À venir

Faits calendaires et non prévisions — ce que les données indiquent pour les prochaines sessions.

RequêteAprès le jour férié : prochaine session, ex-dividendes et splits, prochaine clôture prévue et décalage du short-interest
Le SQL exact derrière chaque chiffre
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

La séance du lundi 6 juillet a rouvert avec une barre 390 complète, confirmée par ses propres bougies. Elle a enregistré 118 ex-dividend — dont une valeur de premier plan parmi les dix que nous analysons (JPM) — et 15 exécutions de split. Prochaine clôture prévue : Labor Day, 2026-09-07 (closed). Le short interest n'est pas une nouveauté, comme toujours — le dernier règlement enregistré est au 2026-06-30, 2 jours, la publication ayant environ deux semaines de retard sur le règlement (pourquoi).

La séance, confirmée — et le vendredi qui n'a pas eu lieu

RequêteCheck de session : span observé en minute-bar du SPY, et clôture du 3 juillet sur le tape
Le SQL exact derrière chaque chiffre
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'

Le 2 juillet était une séance complète, et non une clôture anticipée : les bougies du SPY s'étendent de 04:00 à 19:59 heure de New York (incluant les bougies pre-market et after-hours), avec exactement 390 bougies en séance régulière. Le vendredi 3 juillet a affiché 0 bougies sur le SPY — une clôture complète pour l'Independence Day, le 4 juillet tombant un samedi. La semaine de quatre séances : le récapitulatif de la semaine.

FAQ

Pourquoi le Dow a-t-il progressé alors que le Nasdaq a reculé le 2 juillet 2026 ?

Les deux indexes composent des entreprises différentes : le DIA a clôturé à 1.04% et le QQQ à -1.71%. La composition sectorielle présente la même répartition — la santé, les services publics et la consommation de base dominent, tandis que la technologie arrive en dernier à -2.71%, soit un écart de 5.34 points entre les meilleurs et les moins bons secteurs.

Le marché boursier était-il ouvert le vendredi de la semaine de l'Independence Day ?

Non. L'Independence Day tombait un samedi, et les bourses ont observé ce jour férié par une fermeture complète le vendredi suivant cette session : nos données affichent 0 barres de minutes pour le SPY pour cette journée.

Quel est l'impact d'un stock split sur le cours de l'action ?

Cela multiplie le nombre d'actions par quatre et divise le prix par quatre ; la valeur de la position reste inchangée. CRWD, 2 juillet : une clôture non ajustée de $772.45 mercredi et de $193.67 jeudi — une baisse fictive sur tout screener qui ne prend pas en compte le split.

Quelle était l'ampleur des bid-ask spreads le 2 juillet 2026 ?

Le spread médian coté pour le SPY était de 0.27 points de base par rapport au mid-price pendant les heures régulières — soit 11 de 22 des sessions précédentes en termes d'écart, une journée ordinaire. Les titres individuels présentaient des spreads plus larges : MU 5.52 bps, WDC 10.79.

Notes sur les données

  • Le volume en dollars est une approximation par minute — cours de clôture × volume, cumulés par barre.
  • La publication du 2 juillet pour le Treasury est arrivée après la première parution — la note originale signalait son absence via un reçu de nombre de lignes ; cette révision inclut la publication, le reçu est affiché.
  • La variation du cours de clôture brut de CRWD est un artefact lié à un split — exclue des écrans de momentum.
Notes complètes sur les données
  • Le tableau sectoriel est composé des onze fonds SPDR Select Sector (XLB, XLC, XLE, XLF, XLI, XLK, XLP, XLRE, XLU, XLV, XLY) — un panier fixe et divulgué, et non un champ sectoriel fournisseur.
  • Le comptage du quote-tape s'effectue selon la date UTC de l'horodatage SIP ; une séance estivale peut s'inscrire dans une seule journée UTC.
  • Une cotation de juin avec symbole réutilisé est exclue des classements (reçus) ; l'analyse détaillée des ticks est disponible dans les études approfondies.

Méthodologie

  • La période correspond à une séance de trading (1 séance, vérifiée par l'observation des barres). Les horodatages sont stockés en UTC et convertis en heure de New York lors des requêtes ; le terme « close » désigne la dernière barre de minute de la séance régulière, et le changement de journée compare le 2 juillet au 1er juillet. La clôture du 3 juillet a été vérifiée par les barres et n'est pas une simple supposition.
  • Les spreads sont exprimés (ask moins bid) en points de base du mid-price, selon la médiane des mises à jour NBBO pendant les heures régulières, sur un quantile déterministe. Les décimales sont converties en floats avant les calculs de ratio ; les échéances d'options sont extraites du ticker OCC. Chaque panel est lu une seule fois, lors de la rédaction, via le chemin de lecture seule sécurisé.

Le graphique, le tableau et le SQL constituent un seul objet. Copiez n'importe quel panel dans le terminal Strasmore pour l'utiliser. Séance précédente : 1er juillet. La semaine : la semaine de quatre séances de vacances.