Strasmore Research
Market recaps wey dey break am down Matt ConnorBy Matt Connor · Updated 2026-07-25

Market Recap July 8 2026: Wetin Happun for Numbers

One-day chip bounce wey index no really feel: most semis green, NVDA up second day, MU na di heaviest dollar name, and broad tape still red pass two-to-one.

Wednesday, 8 July 2026, na one-day chip bounce wey the indexes no really feel. SNDK close +6.8%, AVGO +4.82%, NVDA +3.66% — e sharp reversal from Tuesday chip rout — but the index ETFs siddon still: SPY -0.31% and QQQ +0.25%. The broad tape run even more red, two-to-one, pass the day before: 1821 advancers against 4260 decliners, advancer share na 29.6% after 33.8% the session before. Every number wey dey below na from stored query dem read am — expand any panel make you see the exact SQL.

Di scoreboard

Every change dey compare July 8 last regular-session minute bar wit Tuesday July 7 own — consecutive trading sessions. Di rows dey alphabetical, so each ETF dey keep im fixed position.

QuerySPY / QQQ / DIA / IWM — July 8 versus July 7 close, regular hours
The exact SQL behind every number
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-07 13:30:00' AND window_start < '2026-07-07 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-08 13:30:00' AND window_start < '2026-07-08 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

Di four ETFs gapped down for open and from dia dem go different ways. DIA open di session for -0.97% against di prior close and e fade further, finish -1.09%. IWM open for -0.73% and stay down, close -0.92%. SPY open for -0.6%, grind back through di day, and still close -0.31% — di recovery from open dey smaller dan di gap. QQQ open for -0.64% and rally go +0.25% by di close, na im be di only one of di four wey dey positive territory.

Di day bin dey unusual?

Di SPY open-to-close move wey be 0.29% rank 16 out of 22 sessions wey don pass — na mid-pack day for di index, no be extreme. Di QQQ close-over-close move wey be +0.25% rank 21 out of 22 — na one of di smallest moves for QQQ for di trailing month, wey dey consistent with di index quiet print.

QuerySPY / QQQ day move for trailing context (close-over-close, ~22 sessions)
The exact SQL behind every number
SELECT
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-08')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-08'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-07-08'))) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ') AS qqq_sessions_compared,
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-08')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-08'))), groupArrayIf(abs(oc_pct), ticker = 'SPY' AND d != toDate('2026-07-08'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    toString(min(d)) AS first_session
FROM (
    SELECT ticker, d,
           (close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct,
           oc_pct
    FROM (
        SELECT ticker, toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS close_px,
               (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'QQQ')
          AND window_start >= toDateTime('2026-06-05 13:30:00')
          AND window_start < toDateTime('2026-07-09 00:00:00')
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker, d
    )
)

Breadth: even more two-to-one red than the day before

QueryLiquid-tape breadth: July 8 advancer share versus July 7, $1M-traded filter
The exact SQL behind every number
SELECT
    countIf(close_8 > close_7 AND close_7 > 0 AND dv_8 >= 1000000) AS advancers,
    countIf(close_8 < close_7 AND close_7 > 0 AND dv_8 >= 1000000) AS decliners,
    countIf(close_8 = close_7 AND close_7 > 0 AND dv_8 >= 1000000) AS unchanged,
    countIf(close_7 > 0 AND close_8 > 0 AND dv_8 >= 1000000) AS liquid_tickers,
    countIf(close_7 > 0 AND close_8 > 0) AS traded_both_sessions,
    countIf(close_7 > 0 AND close_8 > 0) - countIf(close_7 > 0 AND close_8 > 0 AND dv_8 >= 1000000) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(close_8 > close_7 AND close_7 > 0 AND dv_8 >= 1000000) / countIf(close_7 > 0 AND close_8 > 0 AND dv_8 >= 1000000), 1) AS advancer_pct,
    round(100.0 * countIf(close_7 > close_6 AND close_6 > 0 AND dv_7 >= 1000000) / countIf(close_7 > 0 AND close_6 > 0 AND dv_7 >= 1000000), 1) AS jul7_advancer_pct
FROM (
    SELECT ticker,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00')) AS close_6,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 20:00:00')) AS close_7,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')) AS close_8,
           sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00') AS dv_8,
           sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 20:00:00') AS dv_7
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-08 20:00:00'
    GROUP BY ticker
)

Di gap between advancers (1821) and decliners (4260) put di advancer share at 29.6%, e drop from 33.8% di session before — na di same calculation over di same liquidity filter, wey dem run for both days. Out of di 11439 names wey get close for both days, 5284 fall below di $1M-traded filter and dem no count dem. Di chip-led bounce and di index mixed close sit on top of one broad tape wey even dey more uniformly negative.

Di chip complex bounce back — e strong, and volume heavy

Rows dey alphabetical, so each name get im fixed position; di Tuesday comparison na fresh calculation from di July 7 and July 6 close wey dey di receipts block under di table.

QueryFourteen chip names: prior close, day close, day range, dollar volume, low/high minute ET
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-08 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-08 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-08 00:00:00') AS day_low,
        argMinIf(window_start, (toFloat64(low), toInt64(toUnixTimestamp(window_start))), window_start >= '2026-07-08 00:00:00') AS low_bar,
        argMaxIf(window_start, (toFloat64(high), -toInt64(toUnixTimestamp(window_start))), window_start >= '2026-07-08 00:00:00') AS high_bar,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-08 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AMD', 'AVGO', 'INTC', 'KLAC', 'LRCX', 'MRVL', 'MU', 'NVDA', 'SNDK', 'SOXL', 'SOXS', 'STX', 'TER', 'WDC')
      AND ((window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 20:00:00')
        OR (window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 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 - day_low) / prior_close) * 100, 2) AS range_pct,
    round(toFloat64(day_low), 2) AS day_low,
    round(toFloat64(day_high), 2) AS day_high,
    toUInt32(toHour(toTimeZone(low_bar, 'America/New_York')) * 60 + toMinute(toTimeZone(low_bar, 'America/New_York'))) AS low_minute_et,
    toUInt32(toHour(toTimeZone(high_bar, 'America/New_York')) * 60 + toMinute(toTimeZone(high_bar, 'America/New_York'))) AS high_minute_et,
    day_dollar_bn
FROM per_name
ORDER BY ticker

12 of di fourteen chip names close green — na di opposite of Tuesday session, wen 12 of di fourteen close red. SNDK lead di complex at +6.8% on 16.82B of dollars wey dem trade, with AVGO dey close behind at +4.82%; di other storage names follow — STX +3.9%, WDC +3.45%. Di 3x wrapper SOXL run +5.79% and di inverse SOXS -6.22% — e consistent with one-day recovery for di underlying complex. MU rise more modest +1.11% but e print 32.02B of dollars — na di heaviest dollar-volume name for di panel. NVDA close +3.66% for second straight green day: e be one of only 2 names for dis panel wey close green through Tuesday rout (+0.67% dat day).

QueryReceipts: July 8 and July 7 green/red counts across di same fourteen names
The exact SQL behind every number
SELECT
    countIf(close_8 > close_7) AS jul8_green,
    countIf(close_8 < close_7) AS jul8_red,
    countIf(close_7 > close_6) AS jul7_green,
    countIf(close_7 < close_6) AS jul7_red,
    round(anyIf((close_7 / close_6 - 1) * 100, ticker = 'NVDA'), 2) AS nvda_jul7_pct,
    count() AS names_counted
FROM (
    SELECT ticker,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00')) AS close_6,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 20:00:00')) AS close_7,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')) AS close_8
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AMD', 'AVGO', 'INTC', 'KLAC', 'LRCX', 'MRVL', 'MU', 'NVDA', 'SNDK', 'SOXL', 'SOXS', 'STX', 'TER', 'WDC')
      AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-08 20:00:00'
    GROUP BY ticker
)

Di oda side: defensives and growth mega-caps no follow

QueryRotation check: eight names — defensives, mega-caps, biotech
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-08 00:00:00')) AS prior_close_raw,
        toFloat64(argMinIf(open, window_start, window_start >= '2026-07-08 00:00:00')) AS day_open_raw,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 00:00:00')) AS day_close_raw,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-08 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('CRNX', 'CVX', 'JNJ', 'LLY', 'META', 'TSLA', 'UNH', 'XOM')
      AND ((window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 20:00:00')
        OR (window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(prior_close_raw, 2) AS prior_close,
    round(day_open_raw, 2) AS day_open,
    round(day_close_raw, 2) AS day_close,
    round((day_open_raw / prior_close_raw - 1) * 100, 2) AS gap_pct,
    round((day_close_raw / day_open_raw - 1) * 100, 2) AS intraday_pct,
    round((day_close_raw / prior_close_raw - 1) * 100, 2) AS pct_chg,
    day_dollar_bn
FROM per_name
ORDER BY ticker

Di growth mega-caps move opposite di chip group: TSLA -2.22%, META -2.04%, LLY -1.6%. CVX na im be di only green close for di panel, e up +1.12% from early gap, while XOM open +1.26% higher den fade go -0.49% by close. So Wednesday tape split into two — chip names up, growth and defensives down — and di indexes just siddon for middle. (Rows dey alphabetical: CRNX, CVX, JNJ, LLY, META, TSLA, UNH, XOM.)

Where the money trade

QueryTop 6 by dollars traded, top 4 by shares traded — July 8 regular hours
The exact SQL behind every number
SELECT leaderboard, ticker, dollar_volume_bn, shares_m,
    round(1000 * dollar_volume_bn / shares_m, 2) AS implied_avg_price,
    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(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 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-08 13:30:00' AND window_start < '2026-07-08 20:00:00'
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard, pct_of_board_leader DESC

MU run 32.02B dollars — na im heavy pass for tape and na only im cross di $30B mark. SPY (26.49B), NVDA (24.17B), and QQQ (20.9B) follow, with SNDK at 16.82B and TSLA at 11.71B complete di dollar board. Di shares board tell anoda story: di 3x inverse semiconductor ETF SOXS trade 636.5M shares at one implied average price of $4.67 — na di mechanics of one low-priced 3x wrapper for heavy chip day.

How di session waka

QueryShares per 30-minute ET bucket, regular hours, with % of di day biggest bucket
The exact SQL behind every number
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-08 13:30:00' AND window_start < '2026-07-08 20:00:00'
GROUP BY et_time
ORDER BY et_time

Volume draw one textbook U-shape: di open bucket run for 89.9% of di day biggest bucket and e fade as morning dey go, e bottom for 34.1% for di 1:00–1:30 pm ET slot. Di closing half-hour (15:30 ET) na im be di day biggest bucket with 2.2B shares — e big pass di open own wey be 1.98B, di standard pattern for one regular session.

Di options tape

QueryOptions tape: prints, contracts, call %, 0DTE share versus Tuesday, top contract
The exact SQL behind every number
WITH
    (
        SELECT (groupArray(und), groupArray(strike), groupArray(typ), groupArray(vol), groupArray(avg_px), groupArray(is_0dte))
        FROM (
            SELECT any(underlying_symbol) AS und, any(toFloat64(strike_price)) AS strike, any(option_type) AS typ,
                   sum(size) AS vol, round(avg(toFloat64(price)), 3) AS avg_px,
                   if(substring(ticker, length(ticker) - 14, 6) = '260708', 1, 0) AS is_0dte
            FROM global_markets.options_trades
            WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00'
            GROUP BY ticker
            ORDER BY vol DESC
            LIMIT 2
        )
    ) AS top2,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00'
    ) AS spy_regular_close,
    (
        SELECT round(toFloat64(sum(size)) / 1e6, 2)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-07 00:00:00' AND sip_timestamp < '2026-07-08 00:00:00'
    ) AS jul7_contracts_m,
    (
        SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260707') / sum(size), 1)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-07 00:00:00' AND sip_timestamp < '2026-07-08 00:00:00'
    ) AS jul7_pct_0dte
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    jul7_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) = '260708') / sum(size), 1) AS pct_0dte,
    jul7_pct_0dte,
    spy_regular_close,
    top2.1[1] AS top1_und, top2.2[1] AS top1_strike, top2.3[1] AS top1_type, top2.4[1] AS top1_contracts, top2.5[1] AS top1_avg_px, top2.6[1] AS top1_is_0dte,
    round(toFloat64(top2.2[1]) - spy_regular_close, 2) AS top1_moneyness
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00'

Di consolidated options tape carry 10.44M prints and 63.26M contracts — e pass Tuesday own wey be 61.13M, wey dem compute from di same tape over Tuesday window. Calls na 55.4% of total volume, wey show moderate call lean. 0DTE contracts (same-day expiry, 260708) collect 38.7% of contract volume, e rise from 31.2% for Tuesday. Di single contract wey busy pass na SPY 745C677981 contracts for average price of $0.875, na same-day expiry wey dey essentially at the money against SPY regular close of $745.31.

Di quote tape

QueryStocks NBBO update count: July 8 versus July 7, with named-ticker updates (millions)
The exact SQL behind every number
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08')) / 1e6, 2) AS jul8_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-07')) / 1e6, 2) AS jul7_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-08')) / countIf(toDate(sip_timestamp) = toDate('2026-07-07')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08') AND ticker = 'SPY') / 1e6, 2) AS jul8_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08') AND ticker = 'QQQ') / 1e6, 2) AS jul8_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08') AND ticker = 'NVDA') / 1e6, 2) AS jul8_nvda_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08') AND ticker = 'TSLA') / 1e6, 2) AS jul8_tsla_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08') AND ticker = 'MU') / 1e6, 2) AS jul8_mu_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-07 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00'

Di stock-quote tape carry 530.55M NBBO updates for July 8 — +7.7% compared to di session wey pass. QQQ im 6.53M updates lead di named tickers, e dey ahead of SPY im 4.93M. NVDA (1.8M), TSLA (0.72M), and MU (0.6M) complete di named counts.

QuerySPY / QQQ / NVDA / TSLA / MU / SNDK / AVGO: RTH median quoted spread in basis points
The exact SQL behind every number
SELECT
    ticker,
    round(quantileExact(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000), 2) AS median_spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'NVDA', 'TSLA', 'MU', 'SNDK', 'AVGO')
  AND sip_timestamp >= '2026-07-08 13:30:00' AND sip_timestamp < '2026-07-08 20:00:00'
  AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price
GROUP BY ticker
ORDER BY median_spread_bps ASC

Across di seven named tickers, di SPY RTH median quoted spread na 0.27 bps — e dey for di floor of ordinary for di most-liquid US ETF. QQQ quote at 0.71 bps, NVDA at 1.52 bps. Di wider tail of di table belong to di names wey get thinner quoting: MU at 5.66 bps and SNDK at 12.21 bps.

QuerySPY RTH average quoted spread for trailing-month context
The exact SQL behind every number
SELECT
    round(anyIf(avg_spread_cents, d = toDate('2026-07-08')), 3) AS jul8_avg_spread_cents,
    arrayCount(x -> x < anyIf(avg_spread_cents, d = toDate('2026-07-08')), groupArrayIf(avg_spread_cents, d != toDate('2026-07-08'))) + 1 AS tightness_rank,
    count() AS sessions_compared,
    round(min(avg_spread_cents), 3) AS tightest_session_cents,
    round(max(avg_spread_cents), 3) AS widest_session_cents,
    toString(min(d)) AS first_session,
    sum(dropped_invalid) AS dropped_invalid_quotes
FROM (
    SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS d,
           avgIf(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100 AS avg_spread_cents,
           countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= toDateTime('2026-06-05 00:00:00')
      AND sip_timestamp < toDateTime('2026-07-09 00:00:00')
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY d
)

SPY im RTH average quoted spread of 2.202 cents rank 11 out of 22 trailing sessions — na mid-pack day for spread tightness, as di trailing-month range dey run from 1.809 cents (di tightest) to 2.865 cents (di widest). No air pocket, no liquidity event — na ordinary session for SPY im quoted spread.

QueryOptions NBBO tape: total updates versus di stock tape, plus di SPY root slice
The exact SQL behind every number
WITH
    (SELECT count() FROM global_markets.cache_options_quotes WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00') AS jul8_options_rows,
    (SELECT count() FROM global_markets.cache_stocks_quotes WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00') AS jul8_stock_quote_rows
SELECT
    round(jul8_options_rows / 1e9, 2) AS jul8_options_bn,
    round(jul8_options_rows / jul8_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-08 13:30:00' AND sip_timestamp < '2026-07-08 20:00:00') / 1e6, 0) AS jul8_spy_options_m

Di options tape carry 9.62 billion NBBO updates — 18.1× di stock-quote tape im count. Di SPY-options slice alone run 422 million updates during regular hours.

Rates: di curve no really move

QueryTreasury yields: July 8 versus July 7 — populated maturities + 2s10s
The exact SQL behind every number
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jul8_yield_pct,
    round((t.2 - t.3) * 100) AS session_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-08') AS d,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-07-07') AS p
)

Di 5-year na im lead di session moves for +4 bp; di 2-year close +2 bp higher, and no oda maturity move pass 2 bp for any direction. Dat one leave di 2s10s spread for 0.35% (-1 bp for di session), inside im recent range. Di small rates move just dey follow di small index move.

Di calendar wey dey behind di day

QueryEx-divs, splits, SEC filings, news attention
The exact SQL behind every number
WITH
    (
        SELECT (count(), uniqExact(publisher))
        FROM global_markets.stocks_news
        WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-07-08'
    ) AS news,
    (
        SELECT (argMax(t, (n, t)), max(n), max(n) - arraySort(x -> -x, groupArray(n))[2])
        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-08'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-08') AS ex_dividend_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-07-08') AS splits_executed,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-08') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-08') AS forward_splits,
    (SELECT countIf(form_type = '424B2') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-08') AS fil_424b2,
    (SELECT countIf(form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-08') AS fil_form4,
    (SELECT countIf(form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-08') AS fil_8k,
    (SELECT count() FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-08') AS fil_total,
    news.1 AS news_articles, news.2 AS news_publishers,
    top_news.1 AS top_news_ticker, top_news.2 AS top_news_n, top_news.3 AS top_news_lead_over_next

Di calendar no heavy for di day: 81 ex-dividend records, 1 forward split don execute, and 3722 SEC filings altogether (with 775 Form 4 insider trades, 527 424B2 prospectuses, and 163 8-K current reports). News coverage carry 192 articles across 3 publishers, with MU among di tickers wey dem mention pass at 17 articles. No household-name corporate action stand out for di day flow — di tape story na di chip complex itself.

Di session, wey dem verify

QuerySession verification: first/last SPY bar ET, regular-bar count, holiday receipts, next closure
The exact SQL behind every number
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-08 13:30:00' AND window_start < '2026-07-08 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-08') AS jul8_holiday_rows,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-08' AND status = 'closed') AS next_closure_date,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-08' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-08 00:00:00' AND window_start < '2026-07-09 00:00:00'

Di session run full extended-hours window — first SPY bar for 04:00 ET, last one for 19:59 ET — with 390 regular-hours minute bars and 1 trading session inside di window (no half-day; di holiday table no get row for di date). Di next closure wey dem schedule na Labor Day on 2026-09-07.

Data notes

All timestamps dey stored for UTC; regular hours for July 8, 2026 na sip_timestamp / window_start between 2026-07-08 13:30:00 and 2026-07-08 20:00:00, wey be 9:30 am–4:00 pm New York time. Decimal prices dem cast to Float64 before any division. Named per-ticker panels (scoreboard, chip complex, rotation) dey ordered alphabetically by ticker so each prose reference dey point at fixed row; leaderboards (volume, quote snapshot) dey value-ordered, and every positional claim wey dem make dey encoded as sanity bound for that position. Every Tuesday comparison for this page — breadth share, chip green/red counts, options contracts and 0DTE share, quote-update counts — dem compute am fresh from July 7 (and July 6 where prior close dey needed) inside the same query block, dem never quote am from earlier post.

Full data notes

The breadth panel dey count names wey get regular-hours close for both sessions and at least $1M traded for the measured day; the dropped count (5284 of 11439) dey make the excluded tail visible. The chip complex day_low/day_high timing columns dey use the argMin/argMaxIf(..., (value, timestamp)) pattern so ties dey resolve deterministically. The volume-smile bucket labels na ET (%H:%i), dem compute am with toTimeZone inside the SELECT list only. The options-tape panel dey detect same-day expiry with the OCC-ticker substring match (substring(ticker, length(ticker) - 14, 6)) instead of options_trades.expiration_date (that column don break, according to the standing preflight note). Symbols wey dey inside KNOWN_AMBIGUOUS_TICKERS dem exclude am for the volume-leaders and news-attention SQL so "most X" callouts go fall through to verifiable names. The top-news ticker dey use deterministic tie-break (argMax(t, (n, t))); top_news_lead_over_next = 0 dey mark tie, na why the prose talk say "among the most-mentioned". The treasury panel dey join two daily snapshot rows; if snapshot miss for either date e go yield zero rows and the row_count bound go hold the post. The stocks-quote and options-quote counts na whole-tape scans over day partitions; named-ticker counts dem report am in millions to match their column units. Spread medians dey use quantileExact (deterministic); the trailing spread panel na average (avgIf), dem label am as such.

How We Do Am

  • Where we dey get market data: na consolidated tape — delayed_stocks_minute_aggs for index and per-name price plus volume, cache_stocks_quotes for NBBO counts and quoted spreads, cache_options_quotes and options_trades for the options tape.
  • How we handle time zone: all the timestamps wey we store na UTC; we dey use toTimeZone(..., 'America/New_York') to compute ET clock labels for SELECT lists only; WHERE clauses dey use raw UTC values.
  • Regular-hours window: na 13:30–20:00 UTC, we confirm am against SPY minute bars wey we observe (the session-verification panel), no be calendar arithmetic.
  • Wetin spread mean: na (ask - bid) / midpoint × 10,000 in basis points for valid two-sided quotes for the snapshot; the trailing-month panel na average width in cents, wey we label as average.
  • How we compare with previous session: we dey compute am inside query from July 7 (and July 6 for Tuesday own day-over-day) — we no dey ever carry am come from previous post.
  • Deterministic aggregates: na quantileExact, tuple-keyed argMin/argMax, plus deterministic news tie-break so the regeneration go dey stable.
  • Warehouse as-of date: na July 10, 2026 (T+2 for the period); both sessions' tapes don fully enter for this depth.

Cross-links: recap for July 7, 2026, cost of trading options, basics of bid-ask spread, 0DTE options, and relative volume.