Strasmore Research
Marktoverzichten Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-02

Marktrecap 28 juli 2026: de dag in cijfers

28 juli 2026 uit de tape: indexscorebord, breadth, sector spread, options flow, quote tape, rates en kalender, met elke figure uit opgeslagen queries.

De marktrecapitulatie voor dinsdag 28 juli 2026 leest de volledige sessie uit opgeslagen queries: de close-over-close-verandering van SPY kwam uit op 0.24%, het aandeel stijgers in de liquide tape op 58.6% en de opties-tape registreerde 59.28 miljoen contracten. Elk venster hieronder is aan beide uiteinden aan expliciete datums gekoppeld. Als u de SQL-query van een paneel opnieuw uitvoert, krijgt u dezelfde cijfers terug.

Het scorebord

Elke verandering vergelijkt de laatste minuutbar van de reguliere sessie op 28 juli met die van maandag 27 juli, dus met opeenvolgende handelssessies. De rijen staan alfabetisch, zodat elke ETF een vaste positie behoudt.

QuerySPY / QQQ / DIA / IWM: 28 juli versus slotkoers van 27 juli, reguliere handelsuren
De exacte SQL achter elk getal
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-27 13:30:00' AND window_start < '2026-07-27 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-28 13:30:00' AND window_start < '2026-07-28 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_open) / toFloat64(p.prior_close) - 1) * 100, 2) AS gap_pct,
    round((toFloat64(s.day_close) / toFloat64(s.day_open) - 1) * 100, 2) AS intraday_pct,
    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
FROM sess s LEFT JOIN prior p ON s.ticker = p.ticker
ORDER BY ticker
Run this yourself

DIA bewoog 1.07%, IWM 0.15%, QQQ -0.96% en SPY 0.24% naar een slot op $740.76. Elke rij splitst de beweging op in twee legs: SPY opende 0.02% ten opzichte van het slot van maandag en bewoog van opening tot slot 0.21%. De overnight-leg en de intraday-leg hoeven niet overeen te komen. De verdeling ertussen is de eerste vingerafdruk van een sessie.

Was de dag ongebruikelijk?

Het getal van één sessie zegt weinig zonder de onderliggende verdeling. Daarom wordt de dag volgens dezelfde methode gerangschikt binnen de eigen voorgaande maand.

QueryDagbeweging SPY in voortschrijdende context (open-to-close, 29 juni tot en met 28 juli)
De exacte SQL achter elk getal
SELECT
    round(anyIf(oc_pct, d = toDate('2026-07-28')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, d = toDate('2026-07-28'))), groupArrayIf(abs(oc_pct), d != toDate('2026-07-28'))) + 1 AS spy_abs_move_rank,
    count() AS spy_sessions_compared,
    toString(min(d)) AS first_session
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-06-29 13:30:00')
      AND window_start < toDateTime('2026-07-29 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
    GROUP BY d
)
Run this yourself

De beweging van open naar close van SPY van 0.21% stond op plaats 14 van 21 voorgaande sessies, gerangschikt naar absolute omvang, binnen een periode die teruggaat tot 2026-06-29. De rangschikking telt hoeveel andere sessies binnen de periode een grotere beweging lieten zien, plus één. De eerste plaats zou dus de grootste beweging van de voorgaande maand zijn.

Marktbreedte

Een indexniveau is één getal. Marktbreedte telt hoeveel aandelen dezelfde richting opgingen.

QueryBreadth in liquide tape: slotkoers 28 juli versus slotkoers 27 juli, $1M-traded-filter
De exacte SQL achter elk getal
SELECT
    countIf(c28 > c27 AND liquid) AS advancers,
    countIf(c28 < c27 AND liquid) AS decliners,
    countIf(c28 = c27 AND liquid) AS unchanged,
    countIf(liquid) AS liquid_tickers,
    countIf(NOT liquid) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(c28 > c27 AND liquid) / countIf(liquid), 1) AS advancer_pct
FROM (
    SELECT ticker, c27, c28, dv28 >= 1000000 AS liquid
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS c27,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00') AS c28,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-28 13:30:00') AS dv28
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-28 20:00:00'
        GROUP BY ticker
        HAVING c27 > 0 AND c28 > 0
    )
)
Run this yourself

Van de 6008 aandelen die tijdens de reguliere handel een omzetdrempel van één miljoen dollar overschreden, sloten 3519 boven de slotstand van maandag en 2423 eronder. Het aandeel stijgers bedroeg 58.6%. De filter liet 5346 minder liquide aandelen buiten beschouwing; die zijn hier meegeteld en niet stilzwijgend verwijderd.

De mega-caplijst

Dezelfde acht mega-capnamen verschijnen in elke sessie, alfabetisch gerangschikt zodat elke naam zijn eigen rij behoudt. Een vaste mand is het uitgangspunt: de lezer leert de rijen kennen en achteraf worden niet selectief winnaars gekozen.

QueryAcht mega-caps: verandering versus 27 juli en dollars tijdens reguliere handelsuren, 28 juli
De exacte SQL achter elk getal
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-28 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-28 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-28 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'AMZN', 'AVGO', 'GOOGL', 'META', 'MSFT', 'NVDA', 'TSLA')
      AND ((window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00')
        OR (window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 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,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run this yourself

AAPL bewoog 0.97%, META -0.05%, MSFT 1.12% en NVDA 0.23% bij een omzet van 21.11 miljard dollar tijdens de reguliere handelsuren, met TSLA op -0.57%. De dollarkolom laat zien welk deel van de tape deze acht namen zelfstandig voor hun rekening nemen; het breadth-panel hierboven laat zien in hoeverre de rest van de markt met hen meebewoog.

De movers van de dag

Voor beide boards is een omzet van vijf miljoen dollar tijdens de reguliere handelsuren vereist. Beide sluiten namen uit waarvan de split tussen de twee gemeten slotkoersen is uitgevoerd. Ook wordt één hergebruikt symbool uitgesloten op grond van de ambiguïteitscontrole van het huis, zoals beschreven in de notities.

QueryGrootste stijgers en dalers: slotkoers 28 juli versus slotkoers 27 juli, $5M+ traded, splits uitgesloten
De exacte SQL achter elk getal
SELECT ticker, board, day_pct, day_dollar_m
FROM (
    SELECT 'gainers' AS board, ticker, round((c28 / c27 - 1) * 100, 1) AS day_pct, round(dv / 1e6, 1) AS day_dollar_m
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS c27,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00') AS c28,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-28 13:30:00') AS dv
        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-27' AND execution_date <= '2026-07-28')
          AND window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-28 20:00:00'
        GROUP BY ticker
        HAVING c27 > 0 AND c28 > 0 AND dv >= 5000000
    )
    ORDER BY day_pct DESC
    LIMIT 8
    UNION ALL
    SELECT 'decliners' AS board, ticker, round((c28 / c27 - 1) * 100, 1) AS day_pct, round(dv / 1e6, 1) AS day_dollar_m
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS c27,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00') AS c28,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-28 13:30:00') AS dv
        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-27' AND execution_date <= '2026-07-28')
          AND window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-28 20:00:00'
        GROUP BY ticker
        HAVING c27 > 0 AND c28 > 0 AND dv >= 5000000
    )
    ORDER BY day_pct ASC
    LIMIT 8
)
ORDER BY board DESC, abs(day_pct) DESC
Run this yourself

De grootste stijger op het board, STKH, bewoog 166.7% bij een handelsvolume van 113.2 miljoen dollar. De sterkste daler, YYAI, noteerde -71% bij een handelsvolume van 18.3 miljoen dollar. Deze pagina registreert de omvang en de receipts, maar verbindt daar geen verklaring aan.

Sectorale spreiding

De elf SPDR Select Sector-fondsen, de slotkoers van 28 juli ten opzichte van die van 27 juli, gerangschikt van best naar slechtst. De samenstelling van de korf staat vast en is geen classificatie van een dataleverancier.

QuerySector-ETF's, slotkoers 28 juli versus slotkoers 27 juli, gerangschikt
De exacte SQL achter elk getal
SELECT sector, day_pct, round(max(day_pct) OVER () - day_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((c28 / c27 - 1) * 100, 2) AS day_pct
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-28 00:00:00') AS c27,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-28 00:00:00') AS c28
        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-27 13:30:00' AND window_start < '2026-07-27 20:00:00')
            OR (window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00'))
        GROUP BY ticker
        HAVING c27 > 0 AND c28 > 0
    )
)
ORDER BY day_pct DESC
Run this yourself

Health Care voerde de ranglijst aan met 2.36%. Technology stond onderaan met -1.9%, 4.26 procentpunt lager. Die spread is de sectorale spreiding van de dag. Een markt waarin alle elf fondsen binnen één punt eindigen, ziet er heel anders uit dan een markt waarin de uitslagen over meerdere punten uiteenlopen.

Waar de dollars werden verhandeld

QueryTop 6 naar verhandelde dollars, top 4 naar verhandelde aandelen: reguliere handelsuren 28 juli
De exacte SQL achter elk getal
SELECT leaderboard, ticker, dollar_volume_bn, shares_m,
    round(1000 * dollar_volume_bn / shares_m, 2) AS implied_avg_price
FROM (
    SELECT
        'by dollars traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 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(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00'
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard, if(leaderboard = 'by shares traded', shares_m, dollar_volume_bn) DESC
Run this yourself

MU stond bovenaan het dollaroverzicht met een omzet van 39.21 miljard tijdens de reguliere handelsuren, gevolgd door QQQ met 29.98 miljard. Het aandelenoverzicht beantwoordt een andere vraag: ONFO stond daar bovenaan met 182.4 miljoen aandelen tegen een impliciete gemiddelde prijs van $0.16. Het dollarvolume laat zien waar de aandacht van de markt ligt, terwijl het aandelenvolume de handelsactiviteit weergeeft. De maatstaf per naam is relatief volume.

De optietape

QueryOptions tape: contracten, call share, same-day share versus maandag, drukst verhandelde SPY-contract
De exacte SQL achter elk getal
WITH
    (
        SELECT (strike, typ, vol_m, is_0dte)
        FROM (
            SELECT toFloat64(any(strike_price)) AS strike, any(option_type) AS typ,
                   round(toFloat64(sum(size)) / 1e6, 2) AS vol_m,
                   if(substring(ticker, length(ticker) - 14, 6) = '260728', 1, 0) AS is_0dte
            FROM global_markets.options_trades
            WHERE sip_timestamp >= '2026-07-28 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00'
              AND underlying_symbol = 'SPY'
            GROUP BY ticker
            ORDER BY vol_m DESC, strike ASC
            LIMIT 1
        )
    ) AS top_spy,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00'
    ) AS spy_regular_close,
    (
        SELECT round(toFloat64(sum(size)) / 1e6, 2)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-27 00:00:00' AND sip_timestamp < '2026-07-28 00:00:00'
    ) AS jul27_contracts_m,
    (
        SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260727') / sum(size), 1)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-27 00:00:00' AND sip_timestamp < '2026-07-28 00:00:00'
    ) AS jul27_pct_0dte
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    jul27_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) = '260728') / sum(size), 1) AS pct_0dte,
    jul27_pct_0dte,
    spy_regular_close,
    top_spy.1 AS top_spy_strike,
    top_spy.2 AS top_spy_type,
    top_spy.3 AS top_spy_contracts_m,
    top_spy.4 AS top_spy_is_0dte,
    round(top_spy.1 - spy_regular_close, 2) AS top_spy_strike_minus_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-28 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00'
Run this yourself

De optietape registreerde 10.07 miljoen trades in 59.28 miljoen contracten, tegenover 64.69 miljoen op maandag. Calls waren goed voor 55% van het contractvolume. Contracten die tijdens dezelfde sessie expireerden, de groep van zero-days-to-expiry, waren goed voor 29% tegenover 39.3% op maandag. Dit ritme wordt bepaald door het tijdstip van expiratie. Het drukst verhandelde SPY-contract was de 742 C met 0.72 miljoen contracten. De strike lag 1.24 dollar van SPY's reguliere slotkoers van $740.76, berekend als strike minus slotkoers.

De quote-tape

De quote-data is de schaars­te dataset van deze desk en wordt elke sessie gemeten. Ook gewone dagen worden geregistreerd.

QueryAantal NBBO-updates voor aandelen: 28 juli versus 27 juli, met updates voor genoemde tickers (miljoenen)
De exacte SQL achter elk getal
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-28')) / 1e6, 2) AS jul28_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-27')) / 1e6, 2) AS jul27_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-28')) / countIf(toDate(sip_timestamp) = toDate('2026-07-27')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-28') AND ticker = 'SPY') / 1e6, 2) AS jul28_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-28') AND ticker = 'QQQ') / 1e6, 2) AS jul28_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-28') AND ticker = 'NVDA') / 1e6, 2) AS jul28_nvda_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-27 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00'
Run this yourself

De tape met stock quotes bevatte 536.07 miljoen NBBO-updates, tegenover 553.53 miljoen op maandag. Dat is een verandering van -3.2% op dagbasis. SPY noteerde 4.72 miljoen updates, QQQ 5.94 miljoen en NVDA 3.01 miljoen.

QueryZeven namen: mediane quoted spread tijdens RTH in basis points, met aantallen voor quote quality, 28 juli
De exacte SQL achter elk getal
SELECT ticker,
       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 IN ('AAPL', 'DIA', 'IWM', 'NVDA', 'QQQ', 'SPY', 'TSLA')
  AND sip_timestamp >= '2026-07-28 13:30:00' AND sip_timestamp < '2026-07-28 20:00:00'
GROUP BY ticker
HAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0
ORDER BY ticker
Run this yourself

De mediane spread van SPY tijdens de reguliere handelsuren bedroeg 0.27 basis points van de mid. Voor QQQ was dat 0.74 en voor NVDA 1.52. De laatste twee kolommen vormen de disclosure: one-sided en crossed quotes worden per naam geteld en apart gehouden van de mediaan, in plaats van stilzwijgend te worden verwijderd. Een crossed quote, waarbij de bid boven de ask ligt, is een normaal resultaat van een geconsolideerde feed die op nanoseconde-resolutie uit veel handelsplatforms wordt samengesteld.

QueryMediane spread van SPY gerangschikt tegenover elke julisessie, krapste eerst
De exacte SQL achter elk getal
SELECT round(anyIf(spread_bps, d = toDate('2026-07-28')), 2) AS jul28_median_spread_bps,
       arrayCount(x -> x < anyIf(spread_bps, d = toDate('2026-07-28')), groupArrayIf(spread_bps, d != toDate('2026-07-28'))) + 1 AS rank_tightest,
       count() AS sessions_compared,
       toString(min(d)) AS first_session
FROM (
    SELECT toDate(sip_timestamp) AS d,
           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) AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= '2026-07-01 13:30:00' AND sip_timestamp < '2026-07-28 20:00:00'
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY d
    HAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0
)
Run this yourself

Vergeleken met elke julisessie op basis van dezelfde methode kwam de mediane spread van SPY van 0.27 basis points uit op 16 van 19, gerekend vanaf de smalste spread, binnen een periode die begint op 2026-07-01. Op een rustige tape is dat de kern van het panel: een gewone liquiditeitsdag is een bevinding die wordt gepubliceerd en afgebakend.

QueryOptions NBBO tape: totale updates versus de stock tape, plus de SPY root-slice, 28 juli
De exacte SQL achter elk getal
WITH
    (SELECT count() FROM global_markets.cache_options_quotes WHERE sip_timestamp >= '2026-07-28 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00') AS jul28_options_rows,
    (SELECT count() FROM global_markets.cache_stocks_quotes WHERE sip_timestamp >= '2026-07-28 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00') AS jul28_stock_quote_rows
SELECT
    round(jul28_options_rows / 1e9, 2) AS jul28_options_bn,
    round(jul28_options_rows / jul28_stock_quote_rows, 1) AS options_to_stock_ratio,
    round((SELECT count() FROM global_markets.cache_options_quotes WHERE ticker >= 'O:SPY26' AND ticker < 'O:SPY27' AND sip_timestamp >= '2026-07-28 13:30:00' AND sip_timestamp < '2026-07-28 20:00:00') / 1e6, 0) AS jul28_spy_options_m
Run this yourself

De options-NBBO-tape bevatte 10.23 miljard updates, 19.1 keer zoveel als de stock-quote-tape. Alleen al de SPY-root was goed voor 382 miljoen updates tijdens de reguliere handelsuren.

Rentes

QueryTreasury curve prints in het bestand, 23 juli tot en met 28 juli
De exacte SQL achter elk getal
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
FROM global_markets.treasury_yields
WHERE date >= '2026-07-23' AND date <= '2026-07-28'
ORDER BY date
Run this yourself

Het bestand van Treasury loopt ongeveer één sessie achter op de markt. Dit paneel toont daarom de uitgevoerde trades die het bestand bevat: 4 gedateerde rijen in het venster. De meest recente rij, gedateerd 2026-07-28, noteerde de tweejarige Treasury op 4.26%, de tienjarige op 4.61% en de dertigjarige op 5.09%. De spread tussen de tweejarige en de tienjarige Treasury bedroeg 35 basis points.

De kalender achter de handelsdag

QueryEx-dividends, splits, listings, news en de SEC-filingmix van 28 juli
De exacte SQL achter elk getal
WITH
    (
        SELECT (argMax(t, (n, t)), max(n))
        FROM (
            SELECT t, count() AS n
            FROM (
                SELECT arrayJoin(tickers) AS t
                FROM global_markets.stocks_news
                WHERE published_utc >= '2026-07-28 04:00:00' AND published_utc < '2026-07-29 04:00:00'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news,
    (
        SELECT (count(), uniqExact(cik), countIf(form_type = '4'), countIf(form_type = '8-K'), countIf(form_type = '424B2'), countIf(form_type = '10-Q'))
        FROM global_markets.stocks_sec_edgar_index
        WHERE filing_date = '2026-07-28'
    ) AS fil
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-28') AS ex_dividend_records,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-28') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-28') AS forward_splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-28') AS listings,
    (SELECT count() FROM global_markets.stocks_news WHERE published_utc >= '2026-07-28 04:00:00' AND published_utc < '2026-07-29 04:00:00') AS news_articles,
    (SELECT uniqExact(JSONExtractString(publisher, 'name')) FROM global_markets.stocks_news WHERE published_utc >= '2026-07-28 04:00:00' AND published_utc < '2026-07-29 04:00:00') AS news_publishers,
    top_news.1 AS top_news_ticker,
    top_news.2 AS top_news_n,
    fil.1 AS fil_total,
    fil.2 AS fil_filers,
    fil.3 AS fil_form4,
    fil.4 AS fil_8k,
    fil.5 AS fil_424b2,
    fil.6 AS fil_10q
Run this yourself

147 dividendregistraties gingen op 28 juli ex-dividend, 3 reverse splits en 0 forward splits werden uitgevoerd en 2 nieuwe listings kwamen op de tape. De nieuwsfeed bevatte 161 artikelen van 2 uitgevers. Daarvan was MSFT de ticker waarover in het venster van deze feed het meest werd bericht, met 9 artikelen. De dagelijkse EDGAR-index bevat voor deze datum 5915 filings van 2898 verschillende indieners: 856 insider-Form 4-rapporten, 315 actuele 8-K-rapporten, 900 424B2-prijssupplementen en 100 kwartaalrapporten op Form 10-Q. Deze index verschijnt volgens een eigen schema. Dit panel geeft weer wat de index op het moment van genereren bevat.

Op de agenda

Lees de rest van de week uit dezelfde tabellen en kijk daarbij bewust voorbij de periode.

Query29 tot en met 31 juli op de kalender: sluitingen, ex-dividends, splits, de expiry op vrijdag en de vertraging in short interest
De exacte SQL achter elk getal
SELECT
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date >= '2026-07-29' AND date <= '2026-07-31' AND status != 'open') AS closures_rest_of_week,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-29' AND ex_dividend_date <= '2026-07-31') AS exdiv_records_rest_of_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-29' AND ex_dividend_date <= '2026-07-31') AS household_exdivs,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-29' AND execution_date <= '2026-07-31') AS splits_rest_of_week,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260731') / sum(size), 1) AS jul31_expiry_pct_of_tue_volume,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest WHERE settlement_date <= '2026-07-28') AS latest_short_interest_settlement
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-28 00:00:00' AND sip_timestamp < '2026-07-29 00:00:00'
Run this yourself

De vakantietabel toont 0 sluitingsdagen op woensdag 29 juli, donderdag 30 juli en vrijdag 31 juli. Voor 696 dividendregistraties valt op die drie sessies de ex-dividend date, waaronder 0 van de tien gecontroleerde bekende namen. Daarnaast staan 15 splits gepland voor uitvoering. Van het optievolume van dinsdag zat 17.5% al in contracten met expiratie op vrijdag 31 juli. De meest recente beschikbare settlement voor short interest is 2026-07-15. Dit bestand wordt met voldoende vertraging gepubliceerd om een eigen toelichting te rechtvaardigen.

De sessie, geverifieerd

QuerySessie-verificatie: eerste/laatste SPY-bar ET, aantal reguliere bars, holiday receipts, volgende sluiting
De exacte SQL achter elk getal
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,
    countIf(window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-28 13:30:00' AND window_start < '2026-07-28 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-28') AS jul28_holiday_rows,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-28' 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-28' 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-28 00:00:00' AND window_start < '2026-07-29 00:00:00'
Run this yourself

Een volledige reguliere sessie: de eerste SPY-bar om 04:00 ET, de laatste om 19:59 ET, 390 bars tijdens reguliere handelsuren, 1 sessie in het venster en 0 feestdagregels voor de datum. De eerstvolgende geplande sluiting is Labor Day op 2026-09-07.

FAQ

Hoe presteerde de aandelenmarkt op dinsdag 28 juli 2026?

SPY veranderde 0.24% van slotkoers tot slotkoers naar $740.76, met QQQ op -0.96%, DIA op 1.07% en IWM op 0.15%. Onder liquide namen steeg 3519 en daalde 2423.

Welke sector stond op 28 juli 2026 bovenaan?

Health Care, op 2.36%, gemeten over de elf SPDR-select-sectorfondsen. Het zwakste van de elf, Technology, printte -1.9%.

Hoe actief was de optiemarkt op 28 juli 2026?

Er werden 59.28 miljoen contracten verhandeld, tegenover 64.69 miljoen in de vorige sessie. Contracten met dezelfde expiratiedag waren goed voor 29% van het volume en calls voor 55%.

Welk aandeel had op 28 juli 2026 het hoogste dollarhandelsvolume?

MU, met 39.21 miljard aan dollarvolume tijdens reguliere handelsuren, vóór QQQ met 29.98 miljard.

Gegevensnotities

Deze editie vult het ontbrekende deel van 28 juli in de dagelijkse reeks aan: de dagelijkse editie van 27 juli behandelt de voorafgaande sessie, de dagelijkse editie van 29 juli de daaropvolgende sessie, en de wekelijkse terugblik behandelt de week waarin beide vallen. Panelen met genoemde tickers zijn alfabetisch gerangschikt, zodat verwijzingen in de tekst naar vaste rijen wijzen. Ranglijsten en lijsten met movers zijn op waarde gerangschikt. Elke positionele bewering daarin is vastgelegd als een sanity bound. De mega-cap-basket en de sectorbasket met elf fondsen zijn vastgelegde, vooraf bepaalde sets en geen classificaties van een dataleverancier. Voor de lijsten met movers geldt een omzetdrempel van vijf miljoen dollar tijdens reguliere handelsuren. Namen waarvan de split is uitgevoerd tussen de twee gemeten slotstanden worden uitgesloten. Ook één hergebruikt symbool wordt op grond van de interne ambiguïteitsregel uitgesloten, zodat een vermelding altijd naar een verifieerbare naam verwijst. De quote-panels tellen eenzijdige en crossed quotes per naam, in plaats van deze stilzwijgend te verwijderen. Het bestand van Treasury en de dagelijkse EDGAR-index komen volgens hun eigen schema's binnen. Daarom rapporteren deze panelen wat zij bevatten, zonder uit te gaan van tijdige binnenkomst. Er is hier geen implied-volatility-index opgenomen. Deze reeksen zijn niet voor dit warehouse gelicentieerd. Volatility wordt daarom rechtstreeks uit de tape afgeleid aan de hand van ranges, het aandeel opties op dezelfde dag en het quote-gedrag.

Methodologie

  • Bron van marktdata: consolidated tape. delayed_stocks_minute_aggs voor prijzen en volumes, options_trades voor de options tape, cache_stocks_quotes en cache_options_quotes voor de NBBO-panelen.
  • Slotkoers: de laatste minuutbar van de reguliere sessie, nooit een veronderstelde print om 16:00 en nooit een print buiten de reguliere handelstijden.
  • Tijdzoneverwerking: alle opgeslagen timestamps zijn UTC; WHERE-clausules gebruiken onbewerkte UTC-literals en toTimeZone verschijnt uitsluitend in SELECT-lijsten voor ET-labels.
  • Sessiecontrole: op basis van de feestdagentabel en geobserveerde bars, nooit uitsluitend op basis van de kalender.
  • Vergelijkingen met de vorige sessie: in de query berekend vanaf 27 juli, nooit overgenomen uit een eerder bericht.
  • Decimalen: prijs-, size- en volumekolommen worden vóór elke deling of vermenigvuldiging naar Float64 gecast.
  • Deterministische aggregaties: overal exacte quantiles en tie-breaks op basis van tuple-sleutels; elke rangorde- of tekenclaim in de tekst is gecodeerd als sanity bound.
  • As-of-datum van het datawarehouse: 1 augustus 2026, vier dagen na de sessie en voorbij de gebruikelijke ingest-lag van één tot twee dagen voor de tape; de hierboven genoemde begrensde receipts houden het bericht in stand als bij het genereren blijkt dat een dataset ontbreekt.

Kruisverwijzingen: de dagelijkse recap van 27 juli, de dagelijkse recap van 29 juli, wanneer options expireren, wat een bid-ask spread is en de two-to-ten-year spread.

Elke bovenstaande query draait ongewijzigd op de Strasmore-terminal als u een window naar een andere sessie wilt verplaatsen.