Strasmore Research

bilan semaine 20 juillet 2026

Première semaine complète après expiration options juillet. Scoreboard des indices, dispersion sectorielle, breadth hebdomadaire et flux de capitaux analysés.

La semaine du 20 juillet 2026 était la première semaine complète après l'expiration des options mensuelles de juillet, et elle a compté 5 séances sans jour férié. La variation de clôture à clôture du SPY sur la semaine s'est élevée à -0.59%, et mesurée de l'ouverture à la clôture par rapport à l'année de semaines précédente, elle s'est classée 43 sur 53. Chaque chiffre ci-dessous provient d'une requête stockée, et chaque fenêtre est fixée à des dates explicites, donc réexécuter la requête SQL renvoie ces mêmes valeurs.

La semaine sur le tableau

Les variations hebdomadaires vont de la clôture régulière du vendredi 17 juillet à celle du vendredi 24 juillet. La dernière colonne reprend la semaine précédente, les deux sont donc côte à côte. Les lignes sont classées par ordre alphabétique.

RequêteSPY / QQQ / DIA / IWM : semaine du 20 juillet vs clôture du 17 juillet, avec la variation de la semaine précédente
Le SQL exact derrière chaque chiffre
SELECT ticker,
    round(argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00'), 2) AS prior_week_close,
    round(argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-24 20:00:00'), 2) AS week_close,
    round((argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-24 20:00:00')
         / argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00') - 1) * 100, 2) AS week_change_pct,
    round((argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
         / argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-10 13:30:00' AND window_start < '2026-07-10 20:00:00') - 1) * 100, 2) AS prior_week_change_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
  AND ((window_start >= '2026-07-10 13:30:00' AND window_start < '2026-07-10 20:00:00')
    OR (window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
    OR (window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-24 20:00:00'))
GROUP BY ticker
ORDER BY ticker

Sur la semaine : DIA a évolué de -0.38%, IWM de -0.98%, QQQ de -1.59% et SPY de -0.59%, pour une clôture à 738.85 dollars. Les lectures de la semaine précédente, dans le même ordre alphabétique, étaient de -0.95%, -0.63%, -4.17% et -1.55%. L'écart entre les quatre indices est la première chose que mesure un tableau de bord, et il n'est pas toujours faible.

La semaine par rapport à l'année glissante

Le chiffre d'une seule semaine ne signifie pas grand-chose sans la distribution sous-jacente. Ce panneau recalcule chaque semaine glissante selon une logique identique, d'ouverture à clôture via la session régulière, et classe celle-ci à l'intérieur.

RequêteSemaine de SPY dans le contexte de l'année glissante (rendements hebdomadaires open-to-close)
Le SQL exact derrière chaque chiffre
SELECT round(anyIf(ret, wk = toDate('2026-07-20')), 2) AS week_open_to_close_pct,
       arrayCount(x -> x > anyIf(ret, wk = toDate('2026-07-20')), groupArrayIf(ret, wk != toDate('2026-07-20'))) + 1 AS rank_best,
       count() AS weeks_compared,
       toString(min(wk)) AS first_week,
       anyIf(sessions_measured, wk = toDate('2026-07-20')) AS sessions_this_week
FROM (
    SELECT toStartOfWeek(toDate(toTimeZone(window_start, 'America/New_York')), 1) AS wk,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions_measured,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2025-07-21 00:00:00')
      AND window_start < toDateTime('2026-07-25 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY wk
    HAVING sessions_measured >= 3
)

Mesuré ainsi, SPY a rapporté -1.1% et s'est classé 43 sur 53 semaines remontant à 2025-07-21. Notez l'écart de définition : ce chiffre commence à la première ouverture de session régulière de la semaine, le tableau de bord ci-dessus commence à la clôture de la semaine précédente. Les deux sont étiquetés partout où ils apparaissent.

Cinq séances, une trajectoire

RequêteSPY par séance : clôture, variation et volume échangé, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(d) AS date,
       round(c, 2) AS spy_close,
       round((c / prev_c - 1) * 100, 2) AS change_pct,
       round(shares_m, 1) AS spy_shares_m
FROM (
    SELECT d, c, shares_m,
           lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_c
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS c,
               toFloat64(sum(volume)) / 1e6 AS shares_m
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY'
          AND ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-24 20:00:00'))
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY d
    )
)
WHERE d >= '2026-07-20'
ORDER BY date

Séance après séance, la variation de SPY s’établit à -0.15% lundi, 0.84% mardi, -0.12% mercredi, -1.22% jeudi et 0.08% vendredi, pour finir à 738.85 $ sur 40.1 millions de titres échangés. Le chiffre de lundi est mesuré par rapport à la clôture du 17 juillet, la séance qui précède immédiatement la période.

Largeur de marché, séance par séance

Un niveau d'indice n'est qu'un nombre. La largeur de marché compte combien de titres ont suivi son mouvement, et c'est ce nombre qui détermine si une semaine verte a été large ou étroite.

RequêteProgressions et baisses par séance, titres avec $5M+ échangés, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(d) AS date, advancers, decliners, unchanged, measured_names
FROM (
    SELECT d,
           countIf(c > prev_c) AS advancers,
           countIf(c < prev_c) AS decliners,
           countIf(c = prev_c) AS unchanged,
           count() AS measured_names
    FROM (
        SELECT d, c, dv,
               lagInFrame(c) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_c
        FROM (
            SELECT ticker,
                   toDate(toTimeZone(window_start, 'America/New_York')) AS d,
                   argMax(toFloat64(close), window_start) AS c,
                   sum(toFloat64(close) * toFloat64(volume)) AS dv
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
                OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-24 20:00:00'))
              AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
            GROUP BY ticker, d
        )
    )
    WHERE d >= '2026-07-20' AND prev_c > 0 AND dv >= 5000000
    GROUP BY d
)
ORDER BY date

Lundi, 1268 des 3945 titres mesurés ont monté et 2632 ont baissé. Vendredi, la répartition était de 2273 hausses contre 1635 baisses, sur 3950 titres. Les titres sans cours de clôture des deux côtés d'une séance sont exclus, ce qui explique pourquoi le nombre mesuré fluctue légèrement d'un jour à l'autre.

La même question posée une fois, sur l'ensemble de la semaine :

RequêteLargeur hebdomadaire : clôture régulière du 24 juillet vs clôture régulière du 17 juillet, titres avec $5M+ échangés durant la semaine
Le SQL exact derrière chaque chiffre
SELECT
    countIf(cw > cp AND liquid) AS advancers,
    countIf(cw < cp AND liquid) AS decliners,
    countIf(cw = cp AND liquid) AS unchanged,
    countIf(liquid) AS measured_names,
    countIf(NOT liquid) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(cw > cp AND liquid) / countIf(liquid), 1) AS advancer_pct
FROM (
    SELECT ticker, cp, cw, dv >= 5000000 AS liquid
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-18 00:00:00') AS cp,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00') AS cw,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-20 13:30:00') AS dv
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-25 00:00:00'))
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker
        HAVING cp > 0 AND cw > 0
    )
)

Sur 6100 titres franchissant le seuil de cinq millions de dollars de volume en horaire régulier, 2437 ont clôturé au-dessus de leur cours de clôture du 17 juillet et 3630 en dessous, soit une part de hausses de 40%. Le filtre de liquidité a écarté 5099 titres supplémentaires qui ont négocié sous ce seuil au cours de la semaine. Ils sont comptés ici plutôt que d'être discrètement éliminés.

Le tableau de bord sectoriel

Les onze ETF sectoriels SPDR, du 17 juillet au 24 juillet, classés du meilleur au moins bon.

RequêteETF sectoriels, variation sur la semaine complète : clôture du 24 juillet vs clôture du 17 juillet
Le SQL exact derrière chaque chiffre
SELECT sector, week_pct, round(max(week_pct) OVER () - week_pct, 2) AS points_behind_best
FROM (
    SELECT multiIf(ticker = 'XLK', 'Technology', ticker = 'XLC', 'Communications', ticker = 'XLE', 'Energy',
                   ticker = 'XLF', 'Financials', ticker = 'XLI', 'Industrials', ticker = 'XLB', 'Materials',
                   ticker = 'XLP', 'Staples', ticker = 'XLRE', 'Real Estate', ticker = 'XLU', 'Utilities',
                   ticker = 'XLV', 'Health Care', 'Consumer Discretionary') AS sector,
           round((cw / cp - 1) * 100, 2) AS week_pct
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-18 00:00:00') AS cp,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00') AS cw
        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-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-24 20:00:00'))
        GROUP BY ticker
        HAVING cp > 0 AND cw > 0
    )
)
ORDER BY week_pct DESC

Energy se trouvait en tête du tableau à 3.33%. Consumer Discretionary se trouvait en queue à -5.2%, soit 8.53 points de pourcentage derrière. Cet écart est la dispersion sectorielle de la semaine, et il mérite d'être interprété pour lui-même : une semaine où les onze secteurs se situent à moins d'un point les uns des autres correspond à un marché très différent de celui où l'écart atteint les deux chiffres.

Où sont passés les dollars

RequêtePremiers titres par volume dollar en heures régulières, semaine complète du 20 au 24 juillet
Le SQL exact derrière chaque chiffre
SELECT ticker, week_dollar_bn, round(100 * week_dollar_bn / max(week_dollar_bn) OVER (), 1) AS pct_of_leader
FROM (
    SELECT ticker,
           round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS week_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-24 20:00:00'
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
    ORDER BY week_dollar_bn DESC
    LIMIT 8
)
ORDER BY week_dollar_bn DESC

MU a enregistré 158.1 milliards de dollars de volume d'échanges en séance régulière sur les cinq séances, devant SPY (133.9 milliards) et QQQ (101.5 milliards). Huitième au classement, AAPL a négocié 34.5% des dollars du leader. Les records de volume indiquent où le marché a passé sa semaine à débattre, et cela ne coïncide pas forcément avec le prix. La version par titre de cette mesure est le volume relatif.

Les plus forts mouvements de la semaine

Les divisions d'actions modifient le cours sans changer la valeur : un reverse split produit artificiellement un gain à quatre chiffres, un forward split une chute factice de même ampleur. La semaine a compté 25 reverse splits et 11 forward splits. Les deux tableaux ci-dessous excluent tout titre dont le split a été exécuté entre la clôture du 17 juillet et celle du 24 juillet, soit l'intervalle exact sur lequel la variation est mesurée. Les deux exigent également cinq millions de dollars de volume échangé pendant les heures normales.

RequêteMovers hebdomadaires : dix plus forts haussiers et baissiers, clôtures en heures régulières, $5M+ échangés, hors splits
Le SQL exact derrière chaque chiffre
SELECT ticker, board, week_pct, week_dollar_m, sessions_traded,
       round(100 * week_dollar_m / max(week_dollar_m) OVER (), 1) AS pct_of_dollar_max
FROM (
    SELECT 'gainers' AS board, ticker, round((cw / cp - 1) * 100, 1) AS week_pct,
           round(dv / 1e6, 1) AS week_dollar_m, sessions_traded
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-18 00:00:00') AS cp,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00') AS cw,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-20 13:30:00') AS dv,
               uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-20 13:30:00') AS sessions_traded
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker NOT IN ('SPCX')
          AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date > '2026-07-17' AND execution_date <= '2026-07-24')
          AND ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-25 00:00:00'))
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker
        HAVING cp > 0 AND cw > 0 AND dv >= 5000000
    )
    ORDER BY week_pct DESC
    LIMIT 10
    UNION ALL
    SELECT 'decliners' AS board, ticker, round((cw / cp - 1) * 100, 1) AS week_pct,
           round(dv / 1e6, 1) AS week_dollar_m, sessions_traded
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-18 00:00:00') AS cp,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-24 13:30:00') AS cw,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-20 13:30:00') AS dv,
               uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-20 13:30:00') AS sessions_traded
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker NOT IN ('SPCX')
          AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date > '2026-07-17' AND execution_date <= '2026-07-24')
          AND ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-25 00:00:00'))
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker
        HAVING cp > 0 AND cw > 0 AND dv >= 5000000
    )
    ORDER BY week_pct ASC
    LIMIT 10
)
ORDER BY board DESC, abs(week_pct) DESC

Pour figurer dans l'un ou l'autre tableau, il fallait un mouvement réel. Le plus faible gain affiché a progressé de 92.3%, et la plus faible baisse a enregistré -47.8%. Aux extrêmes, STAK a varié de 383.7% sur 251.6 millions de dollars échangés, et LBGJ a varié de -98.8% sur 47.7 millions. Cette baisse est proche de la valeur totale cotée du titre, aussi le tableau comporte-t-il son propre justificatif : LBGJ a imprimé des barres en heures normales sur 5 des cinq séances, et aucun split n'a été exécuté sur ce titre entre les deux clôtures que le tableau mesure.

L'écart affiché, séance par séance

Le prix fait la une. Le coût d'exécution d'une transaction est l'écart affiché, mesuré ici sur SPY une séance à la fois, directement à partir de la bande NBBO brute plutôt que d'un quelconque résumé.

RequêteSpread médian coté de SPY et mises à jour NBBO par séance, heures régulières, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(toDate(sip_timestamp)) AS date,
       round(quantileExactIf(0.5)(
           10000 * (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2),
           bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
       round(count() / 1e6, 2) AS quote_updates_m,
       countIf(bid_price <= 0 OR ask_price <= 0) AS one_sided_quote_count,
       countIf(bid_price > ask_price AND bid_price > 0 AND ask_price > 0) AS crossed_quote_count
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY'
  AND sip_timestamp >= '2026-07-20 13:30:00'
  AND sip_timestamp < '2026-07-24 20:00:00'
  AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
GROUP BY toDate(sip_timestamp)
HAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0
ORDER BY toDate(sip_timestamp)

L'écart affiché médian de SPY mesurait 0.27 points de base du cours médian lundi et 0.27 vendredi, sur 3.89 millions et 4.4 millions de mises à jour NBBO. Les deux dernières colonnes sont la transparence plutôt que le constat : 0 cotations unilatérales et 1084 cotations croisées ont été comptabilisées dans la médiane de lundi au lieu d'être ignorées silencieusement. Une cotation croisée, où l'offre dépasse la demande, est un artefact courant d'un flux consolidé assemblé à partir de multiples plateformes avec une résolution nanoseconde.

La semaine d'options après l'échéance mensuelle

L'échéance mensuelle de juillet tombait le vendredi précédant l'ouverture de cette semaine. Chaque contrat négocié durant ces cinq séances en est donc un survivant. Le calendrier des échéances donne le rythme sur lequel la foule du jour même trade.

RequêteContrats d'options, part même-jour et part call par séance, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(toDate(sip_timestamp)) AS date,
       round(toFloat64(sum(size)) / 1e6, 1) AS contracts_m,
       round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = formatDateTime(toDate(sip_timestamp), '%y%m%d')) / sum(size), 1) AS pct_0dte,
       round(100.0 * sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'C') / sum(size), 1) AS pct_call,
       round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260724') / sum(size), 1) AS pct_expiring_jul24
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-20 00:00:00' AND sip_timestamp < '2026-07-25 00:00:00'
GROUP BY toDate(sip_timestamp)
ORDER BY toDate(sip_timestamp)

Le volume de contrats a atteint 64 millions lundi et 71.1 millions vendredi. La part du jour même, c'est-à-dire les contrats arrivant à échéance le jour de leur négociation, s'est établie à 40.2% lundi contre 49% vendredi, la séance d'échéance de la semaine. Les calls ont représenté 53.5% du volume de contrats de vendredi. L'attrait de ce vendredi était visible dès la séance d'ouverture : 15.1% du volume de lundi se trouvait déjà dans des contrats datés pour arriver à échéance ce jour-là.

Taux sur la semaine

RequêteCourbe des taux par séance, du print du 17 juillet au 24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(date) AS date,
       round(toFloat64(yield_2_year), 2) AS yield_2y_pct,
       round(toFloat64(yield_10_year), 2) AS yield_10y_pct,
       round(toFloat64(yield_30_year), 2) AS yield_30y_pct,
       round((toFloat64(yield_10_year) - toFloat64(yield_2_year)) * 100) AS spread_2s10s_bp,
       round((toFloat64(yield_10_year) - (SELECT toFloat64(any(yield_10_year)) FROM global_markets.treasury_yields WHERE date = '2026-07-17')) * 100) AS chg_10y_from_prior_close_bp
FROM global_markets.treasury_yields
WHERE date >= '2026-07-17' AND date <= '2026-07-24'
ORDER BY date

Mesuré à partir de la publication du 17 juillet, le taux à dix ans a évolué de 16 points de base pour atteindre 4.71% à la dernière publication enregistrée, le taux à deux ans s'établissant à 4.37% et le taux à trente ans à 5.17%. Le spread deux-dix ans a terminé la série à 34 points de base. Le fichier du Trésor accuse un décalage d'environ une séance par rapport à la cote, de sorte que ce panneau contient 5 publications, chacune datée dans le tableau.

Les shorts : les fichiers quotidiens

La FINRA publie un fichier quotidien des volumes de ventes à découvert. Le volume des ventes à découvert est un flux brut quotidien, et non une position. Ces fichiers arrivent parfois tronqués. La couverture est donc mesurée avant qu’un ratio ne soit cité à partir d’eux.

RequêteCouverture du fichier de volume court quotidien : tickers dans le fichier et actions courtes, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT date, tickers_on_file, short_shares_bn,
       round(100.0 * tickers_on_file / max(tickers_on_file) OVER (), 1) AS pct_of_fullest_file
FROM (
    SELECT toString(date) AS date,
           uniqExact(ticker) AS tickers_on_file,
           round(sum(short_shares) / 1e9, 2) AS short_shares_bn
    FROM (
        SELECT date, ticker, max(short_volume) AS short_shares
        FROM global_markets.stocks_short_volume
        WHERE date >= '2026-07-20' AND date <= '2026-07-24'
        GROUP BY date, ticker
    )
    GROUP BY date
)
ORDER BY date

5 fichiers quotidiens sont disponibles pour la semaine. Le premier contient 15098 tickers et 4.71 milliards d’actions marquées comme vendues à découvert. Le dernier contient 15062 tickers, soit 99.7% du nombre de tickers du fichier le plus complet. Toute donnée de volume court par nom tirée d’un fichier nettement en dessous de ses voisins reste invérifiable tant que ce fichier n’est pas redéposé.

Le calendrier derrière la semaine

RequêteDépôts SEC par séance et type de formulaire, 20-24 juillet
Le SQL exact derrière chaque chiffre
SELECT toString(filing_date) AS date,
       count() AS filings,
       countIf(form_type = '4') AS form4,
       countIf(form_type = '8-K') AS form8k,
       countIf(form_type = '424B2') AS f424b2
FROM global_markets.stocks_sec_edgar_index
WHERE filing_date >= '2026-07-20' AND filing_date <= '2026-07-24'
GROUP BY filing_date
ORDER BY date

La première session du fichier comptait 3012 dépôts, dont 632 rapports Formulaire 4 d’initiés et 166 formulaires 8-K. La dernière en comptait 3814, avec 644 Formulaire 4 et 223 8-K. 5 des sessions de la semaine disposent d’un index EDGAR quotidien dans le fichier ; cet index arrive selon son propre calendrier, qui retarde parfois la bande.

RequêteCalendrier corporate de la semaine : dividendes, splits, introductions, actualités
Le SQL exact derrière chaque chiffre
SELECT
    (SELECT count() FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= '2026-07-20' AND filing_date <= '2026-07-24') AS filings_week,
    (SELECT uniqExact(filing_date) FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= '2026-07-20' AND filing_date <= '2026-07-24') AS filing_days_on_file,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-20' AND ex_dividend_date <= '2026-07-24') AS ex_dividends_week,
    (SELECT countIf(ticker IN ('AAPL', 'MSFT', 'JPM', 'KO', 'JNJ', 'XOM', 'CVX', 'PG', 'WMT', 'HD')) FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-20' AND ex_dividend_date <= '2026-07-24') AS household_ex_dividends_week,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-20' AND execution_date <= '2026-07-24') AS reverse_splits_week,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-20' AND execution_date <= '2026-07-24') AS forward_splits_week,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= '2026-07-20' AND listing_date <= '2026-07-24') AS listings_week,
    (SELECT count() FROM global_markets.stocks_news WHERE published_utc >= '2026-07-20 04:00:00' AND published_utc < '2026-07-25 04:00:00') AS news_week,
    (SELECT uniqExact(JSONExtractString(publisher, 'name')) FROM global_markets.stocks_news WHERE published_utc >= '2026-07-20 04:00:00' AND published_utc < '2026-07-25 04:00:00') AS news_publishers_week

Le reste des documents de la semaine : 17106 dépôts SEC sur 5 jours indexés, 592 enregistrements ex-dividende, dont 1 provenant des dix grandes sociétés que ce panel surveille, 25 regroupements inverses et 11 divisions d’actions, 4 nouvelles cotations, et 1704 articles de 2 éditeurs. Cette dernière paire mesure l’attention d’un seul flux, pas celle des médias mondiaux.

Les sessions, vérifiées

RequêteVérification des séances : séances, barres, lignes de jours fériés, clôtures en hausse et en baisse, prochaine fermeture
Le SQL exact derrière chaque chiffre
WITH spy AS (
    SELECT d, c, lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS p
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY'
          AND ((window_start >= '2026-07-17 13:30:00' AND window_start < '2026-07-17 20:00:00')
            OR (window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-24 20:00:00'))
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY d
    )
)
SELECT
    uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions_in_week,
    toString(min(toDate(toTimeZone(window_start, 'America/New_York')))) AS first_session,
    toString(max(toDate(toTimeZone(window_start, 'America/New_York')))) AS last_session,
    count() AS regular_bars_in_week,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date >= '2026-07-20' AND date <= '2026-07-24') AS holiday_rows_in_week,
    (SELECT countIf(c > p) FROM spy WHERE d >= '2026-07-20') AS up_sessions,
    (SELECT countIf(c < p) FROM spy WHERE d >= '2026-07-20') AS down_sessions,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-24' AND date <= '2026-12-31' AND status = 'closed') AS next_closure_date,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-24' AND date <= '2026-12-31' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
  AND window_start >= '2026-07-20 13:30:00' AND window_start < '2026-07-24 20:00:00'
  AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199

5 sessions, de 2026-07-20 à 2026-07-24, avec 0 lignes de jours fériés dans la fenêtre. SPY a imprimé 1950 barres minute en session régulière sur l'ensemble. 2 sessions ont clôturé au-dessus de la clôture précédente et 3 en dessous. La prochaine clôture programmée est le Labor Day à 2026-09-07.

À venir

La semaine suivante, lisez dans nos propres tableaux :

RequêteSemaine prochaine au calendrier : fermetures, ex-dividendes, splits et l'échéance pull
Le SQL exact derrière chaque chiffre
SELECT
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date >= '2026-07-27' AND date <= '2026-07-31' AND status != 'open') AS closures_next_week,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-27' AND ex_dividend_date <= '2026-07-31') AS ex_dividends_next_week,
    (SELECT countIf(ticker IN ('AAPL', 'MSFT', 'JPM', 'KO', 'JNJ', 'XOM', 'CVX', 'PG', 'WMT', 'HD')) FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-27' AND ex_dividend_date <= '2026-07-31') AS household_ex_div_next_week,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-27' AND execution_date <= '2026-07-31') AS splits_next_week,
    (SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260731') / sum(size), 1) FROM global_markets.options_trades WHERE sip_timestamp >= '2026-07-24 00:00:00' AND sip_timestamp < '2026-07-25 00:00:00') AS jul31_expiry_pct_of_friday_volume,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest WHERE settlement_date <= '2026-07-24') AS latest_short_interest_settlement

Le tableau des jours fériés indique 0 fermetures la semaine suivante. 368 dates de détachement de coupon tombent dans cette période, dont 0 issues du segment ménages, accompagnées de 15 fractionnements programmés. Sur le volume d'options de vendredi, 14.2% se trouvaient déjà dans des contrats arrivant à expiration le vendredi suivant. La date de règlement la plus récente pour les positions courtes dans nos fichiers est le 2026-07-15, un fichier dont la publication est décalée d'un délai suffisamment long pour avoir son propre article explicatif.

FAQ

Comment le marché boursier s’est-il comporté la semaine du 20 juillet 2026 ?

Le SPY a varié de -0.59% % d’une clôture à l’autre entre le 17 et le 24 juillet, avec le QQQ à -1.59%, le DIA à -0.38% et l’IWM à -0.98%. Parmi les titres liquides, 2437 a monté et 3630 a baissé.

Quel secteur a mené la semaine du 20 juillet 2026 ?

Le Energy, à 3.33%. Le plus faible des onze ETF sectoriels SPDR a été le Consumer Discretionary à -5.2%, soit 8.53 points de pourcentage de retard.

Combien de séances de bourse comptaient la semaine du 20 juillet 2026 ?

5, allant du 2026-07-20 au 2026-07-24, avec 0 lignes de jours fériés dans la fenêtre. La prochaine fermeture programmée est le Labor Day.

Quel ticker a enregistré le plus gros volume en dollars la semaine du 20 juillet 2026 ?

Le MU, avec 158.1 milliards de dollars de chiffre d’affaires en horaire régulier, devant le SPY à 133.9 milliards.

Notes sur les données

Tous les horodatages sont en UTC. Les heures de séance régulière sont de 13:30-20:00 UTC par session. Les bornes de la semaine vont de la clôture régulière du 17 juillet à celle du 24 juillet. Chaque tableau de comparaison clôture contre clôture lit la dernière barre minute de la séance régulière de chaque côté de la comparaison : un ordre exécuté en horaires prolongés ne peut donc jamais fixer la clôture hebdomadaire. Le classement sur un an glissant utilise les rendements hebdomadaires ouverture contre clôture ; il ne correspond donc pas au tableau de bord clôture contre clôture. Les deux définitions sont signalées là où elles apparaissent. La largeur de marché hebdomadaire et les tableaux des variations appliquent un filtre de cinq millions de dollars de volume en séance régulière. La largeur de marché publie le nombre de titres que ce filtre écarte. Les tableaux des variations excluent tout titre dont le split a été exécuté après la clôture du 17 juillet et jusqu'au 24 juillet, soit l'intervalle exact sur lequel la variation est mesurée. Cela capture aussi bien un split daté du week-end intermédiaire qu'un split daté d'une séance. Ces tableaux n'excluent pas les ETF à effet de levier et inverses, qui peuvent dominer un tableau lors d'une semaine directionnelle. Le bas du tableau des baisses peut approcher une perte totale de la valeur cotée sur la semaine. Ce tableau publie, pour chaque titre, le nombre de séances sur cinq où il a été imprimé. Le tableau des spreads du SPY compte les cotations unilatérales et croisées au lieu de les écarter silencieusement ; la médiane est calculée sur les cotations valides restantes. Le fichier du Trésor a environ une séance de retard sur la bande, et l'index quotidien EDGAR suit son propre calendrier. Les tableaux des taux et des dépôts indiquent donc le nombre de jours qu'ils couvrent réellement. Aucun indice de volatilité implicite n'apparaît ici : ces séries ne sont pas sous licence dans cet entrepôt. La volatilité est donc lue sur la bande via les fourchettes, la part des options à échéance le jour même et le comportement des cotations.

Méthodologie

  • Source des données de marché : bande consolidée. delayed_stocks_minute_aggs pour les prix et les volumes, cache_stocks_quotes pour le panneau NBBO, options_trades pour la semaine d’options.
  • Clôture : la dernière barre minute de la session régulière, jamais une impression supposée à 16:00 ni une impression hors séance.
  • Sessions : vérifiées à partir de la table des jours fériés et des barres observées, jamais supposées à partir du calendrier.
  • Gestion des fuseaux horaires : les clauses WHERE utilisent des littéraux UTC bruts, et toTimeZone n’apparaît que dans les listes SELECT pour les libellés ET.
  • Décimales : les colonnes de prix, de taille et de volume sont converties en Float64 avant toute division ou tout produit.
  • Agrégats déterministes : quantiles exacts partout, et toute affirmation d’ordre ou de signe dans le texte est encodée comme une borne de cohérence.
  • Date d’entrepôt : 26 juillet 2026.

Liens croisés : l’édition précédente de cette série hebdomadaire, ce qu’est un écart acheteur-vendeur, quand les options expirent, l’intérêt court par rapport au volume court, et l’écart deux à dix ans.

Chaque requête ci-dessus s’exécute sans modification sur le terminal Strasmore si vous souhaitez rediriger une fenêtre vers une semaine différente.