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

Market Recap: July 8 Numbers and Chip Bounce

Chip stocks bounce small on July 8: most semis green, NVDA rise second day, MU carry the biggest dollar move, but broad market still pass two-to-one red.

Wednesday, July 8, 2026 na one-day chip bounce wey the indexes barely notice. SNDK close +6.8%, AVGO +4.82%, NVDA +3.66%, na sharp reversal from Tuesday chip rout, but the index ETFs remain still: SPY -0.31% and QQQ +0.25%. The broad tape run even more two-to-one red pass the day before: 1821 advancers against 4260 decliners, with advancer share of 29.6% after 33.8% the session before. Every number below come from stored query; expand any panel to see the exact SQL.

Di scoreboard

Every change dey compare July 8 last regular-session minute bar with Tuesday July 7 own, wey be consecutive trading sessions. Rows dey alphabetical, so every ETF keep the same position.

QuerySPY / QQQ / DIA / IWM: July 8 vs July 7 close, regular hours
tickerbefore closeday openday closegap pctintraday pctpct changeday highday lowshares traded m
DIA528.48523.34522.72-0.97-0.12-1.09524.46520.033.2
IWM296.2294.03293.47-0.73-0.19-0.92295.1290.6820.3
QQQ709.5704.95711.3-0.640.90.25712.26700.9129.5
SPY747.66743.16745.31-0.60.29-0.31746.15739.5135.6
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
Run am yourself

The four ETFs open with gap down, then each one follow different direction. DIA open the session at -0.97% against the previous close and fall more, before e close at -1.09%. IWM open at -0.73% and remain down, closing at -0.92%. SPY open at -0.6%, recover small as the day go on, but still close at -0.31%; the recovery from the open no reach the size of the gap. QQQ open at -0.64% and rally reach +0.25% by close, making am the only one among the four wey end in positive territory.

E be say the day no normal?

The SPY open-to-close move of 0.29% rank 16 out of 22 trailing sessions, so e be middle-range day for the index, no be extreme. The QQQ close-over-close move of +0.25% rank 21 out of 22, and na one of the smallest trailing-month moves for QQQ. This match the index quiet print.

QuerySPY / QQQ day move for trailing context (close-over-close, ~22 sessions)
QQQ close over close pctQQQ absolute move rankQQQ sessions wey dem compareSPY open to close pctSPY absolute move rankSPY sessions wey dem comparefirst session
0.2521220.2916222026-06-05
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
    )
)
Run am yourself

Market breadth: red stocks don pass two-to-one more than yesterday

QueryLiquid-tape breadth: July 8 advancer share vs July 7, $1M-traded filter
advancersdeclinersunchangedliquid tickerstraded both sessionsliquidity filter dropadvancer pctJul7 advancer pct
1821426074615511439528429.633.8
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
)
Run am yourself

The gap between stocks wey rise (1821) and stocks wey fall (4260) mean say stocks wey rise make up 29.6%, down from 33.8% for the session before. Na the same calculation and the same liquidity filter dem use for both days. Out of the 11439 names wey get closing price for both days, 5284 fall below the $1M-traded filter, so dem no include dem for the count. The bounce wey chip stocks lead and the index mixed close happen while the wider market tape dey even more broadly negative.

Chip complex bounce strong, and volume heavy

Rows dey alphabetical order, so every name get fixed position; Tuesday comparison na fresh calculation from July 7 and July 6 closing prices for the receipts block wey dey under the table.

QueryFourteen chip names: prior close, day close, day range, dollar volume, low/high minute ET
tickerbefore closeday closepct chgrange pctday lowday highlow minute EThigh minute etday dollar bn
AMD516.57517.260.134.81498.15522.986835878.93
AVGO370.79388.674.824.91376.89395.095707789.39
INTC110.5110.27-0.215.5104.41110.497139579.48
KLAC216.52221.032.084.2214.3223.46859291.79
LRCX326.12332.932.094.53322.72337.55705872.1
MRVL230.81231.660.375.12224.98236.795705934.57
MU938.95949.371.116.24900.4195957060032.02
NVDA196.93204.143.665.13195.06205.1657093724.17
SNDK1619.261729.46.88.9415901734.6957095916.82
SOXL165.27174.845.7910.82158.87176.755708168.12
SOXS4.824.52-6.22114.464.999295702.97
STX827.4859.683.96.18811.27862.415709593.46
TER343.1351.562.475.6335.06354.276865870.77
WDC532.34550.713.456.91526562.765706003.03
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
Run am yourself

12 out of the fourteen chip names close green, opposite of Tuesday session, when 12 out of the fourteen close red. SNDK lead the complex with +6.8% on 16.82B dollars traded, while AVGO follow close with +4.82%; the other storage names follow, STX +3.9%, WDC +3.45%. The 3x wrapper SOXL gain +5.79%, while inverse SOXS -6.22%, consistent with one-day recovery for the underlying complex. MU rise a smaller +1.11%, but e record 32.02B dollars, making am the name with the highest dollar volume for the panel. NVDA close +3.66% for the second straight green day: na one of only 2 names for this panel wey close green through Tuesday rout (+0.67% that day).

QueryReceipts: July 8 and July 7 green/red counts across the same fourteen names
jul8 greenjul8 redjul7 greenjul7 rednvda jul7 pctnames wey dem count
1222120.6714
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
)
Run am yourself

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

QueryRotation check: eight names, defensives, mega-caps, biotech
tickerbefore closeday openday closegap pctintraday pctpct chgday dollar bn
CRNX83.5383.5283.45-0.01-0.08-0.11.38
CVX173.97176.8175.921.63-0.51.121.36
JNJ267.29268.6263.360.49-1.95-1.471.38
LLY1235.641221.11215.87-1.18-0.43-1.62.55
META615.57614.38603.03-0.19-1.85-2.045.86
TSLA402.88399.38393.92-0.87-1.37-2.2211.71
UNH428.18427.14425.56-0.24-0.37-0.611.28
XOM141.65143.44140.961.26-1.73-0.492.08
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
Run am yourself

Growth mega-caps move for opposite direction from chip complex: TSLA -2.22%, META -2.04%, LLY -1.6%. CVX na di only green close for the panel, e rise +1.12% after e gap early, while XOM open +1.26% higher and later fade reach -0.49% for close. So, Wednesday tape divide into two: chip names go up, growth and defensives go down, while indexes remain still between dem. (Rows dey alphabetical order: CRNX, CVX, JNJ, LLY, META, TSLA, UNH, XOM.)

Wey money trade happen

QueryTop 6 by dollars traded, top 4 by shares traded: July 8 regular hours
leaderboardtickerdollar volume bnshares mimplied avg pricepct of board leader
by dollars tradedMU32.0234.1939100
by dollars tradedSPY26.4935.6744.182.7
by dollars tradedNVDA24.17120.5200.5875.5
by dollars tradedQQQ20.929.5708.4765.3
by dollars tradedSNDK16.8210.11665.3552.5
by dollars tradedTSLA11.7129.7394.2836.6
by shares tradedSOXS2.97636.54.67100
by shares tradedTZA1.37334.84.0952.6
by shares tradedBITO2.29272.48.4142.8
by shares tradedAAL2.79169.316.4826.6
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
Run am yourself

MU trade value reach 32.02B dollars, naim wey get the heaviest activity for the day and the only one wey pass $30B mark. SPY (26.49B), NVDA (24.17B), and QQQ (20.9B) follow, with SNDK at 16.82B and TSLA at 11.71 to complete the dollar ranking. The shares ranking show another picture: the 3x inverse semiconductor ETF SOXS trade 636.5M shares at implied average price of $4.67, showing how low-priced 3x wrapper fit trade plenty on heavy chip day.

Shape wey the session take

QueryShares per 30-minute ET bucket, regular hours, with % of the day's biggest bucket
et timeshares bnpct of biggest bucket
09:301.9889.9
10:001.3862.9
10:301.3259.9
11:001.1653
11:301.0145.9
12:000.9342.2
12:300.9242
13:000.7534.1
13:300.7634.5
14:000.7734.9
14:300.7534.3
15:000.941.1
15:302.2100
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
Run am yourself

Volume follow textbook U-shape: the opening bucket reach 89.9% of the biggest bucket for the day, then e reduce through the morning and touch bottom at 34.1% for the 1:00–1:30 pm ET slot. The last half-hour (15:30 ET) na the biggest bucket for the day, with 2.2B shares. E pass the opening bucket of 1.98B, wey be the standard pattern for regular session.

Di options tape

QueryOptions tape: prints, contracts, call %, 0DTE share vs Tuesday, top contract
option prints mcontracts mjul7 contracts mcall pct of volumepct 0dtejul7 pct 0dtespy regular closetop1 undtop1 striketop1 typetop1 contractstop1 avg pxtop1 e be 0dte?top1 moneyness
10.4463.2661.1355.438.731.2745.31SPY745C6779810.8751-0.31
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'
Run am yourself

Di consolidated options tape carry 10.44M prints and 63.26M contracts, wey pass Tuesday 61.13M. Dem calculate am from di same tape for Tuesday window. Calls make up 55.4% of total volume, showing say calls get moderate lean. 0DTE contracts (expiry na di same day, 260708) take 38.7% of contract volume, up from 31.2% on Tuesday. Di single contract wey trade pass na SPY 745C, with 677981 contracts for average price of $0.875. Na same-day expiry, and e dey essentially at di money against SPY regular close of $745.31.

The quote tape

QueryStocks NBBO update count: July 8 vs July 7, with named-ticker updates (millions)
jul8 updates mjul7 updates mday-over-day pctjul8 SPY updates mjul8 QQQ updates mjul8 NVDA updates mjul8 TSLA updates mjul8 MU updates m
530.55492.767.74.936.531.80.720.6
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'
Run am yourself

Stock-quote tape carry 530.55M NBBO updates on July 8, wey be +7.7% compared with the session before. QQQ get the highest count among the named tickers with 6.53M updates, ahead of SPY wey get 4.93M. NVDA (1.8M), TSLA (0.72M), and MU (0.6M) complete the named counts.

QuerySPY / QQQ / NVDA / TSLA / MU / SNDK / AVGO: RTH median quoted spread in basis points
tickermedian spread bps
SPY0.27
QQQ0.71
NVDA1.52
TSLA2.28
AVGO3.63
MU5.66
SNDK12.21
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
Run am yourself

Across the seven named tickers, SPY RTH median quoted spread na 0.27 bps, wey dey the normal floor for the most-liquid US ETF. QQQ quoted at 0.71 bps, while NVDA quoted at 1.52 bps. The wider end of the table na the names wey quoting no too thick: MU at 5.66 bps and SNDK at 12.21 bps.

QuerySPY RTH average quoted spread for trailing-month context
jul8 average spread centstightness ranksessions wey dem comparetightest session centswidest session centsfirst sessioninvalid quotes wey dem drop
2.20211221.8092.8652026-06-0542783
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
)
Run am yourself

SPY RTH average quoted spread of 2.202 cents rank 11 out of 22 trailing sessions. This one na middle-of-the-pack day for spread tightness. The trailing-month range run from 1.809 cents, wey be the tightest, reach 2.865 cents, wey be the widest. No air pocket, no liquidity event. Na ordinary session for SPY quoted spread.

QueryOptions NBBO tape: total updates vs the stock tape, plus the SPY root slice
jul8 options bnoptions-to-stock ratiojul8 SPY options m
9.6218.1422
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
Run am yourself

Options tape carry 9.62 billion NBBO updates, 18.1× the stock-quote tape count. SPY-options slice alone get 422 million updates during regular hours.

Rates: curve no really move much

QueryTreasury yields: July 8 vs July 7, populated maturities + 2s10s
curve pointjul8 yield pctsession change bp
1 month3.67-2
3 month3.871
1 year4.060
2 year4.212
5 year4.314
10 year4.561
30 year5.061
2s10s spread0.35-1
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
)
Run am yourself

The 5-year na im lead the session move with +4 bp; the 2-year close +2 bp higher, and no other maturity move pass 2 bp for either side. That one leave the 2s10s spread for 0.35% (-1 bp for the session), still inside the recent range. The small rates move happen together with the small index move.

Calendar wey dey behind the day

QueryEx-divs, splits, SEC filings, news attention
ex-dividend recordssplits wey dem executereverse splitsforward splitsFIL 424B2FIL Form 4FIL 8-KFIL totalnews articlesnews publisherstop news tickertop news ntop news lead over next
8110152777516337311923MU170
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
Run am yourself

Calendar no too busy that day: 81 ex-dividend records, 1 forward split wey execute, and 3731 SEC filings altogether (including 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 the tickers wey dem mention pass, at 17 articles. No corporate action from any household-name company stand out for that day's flow; na the chip complex itself carry the main story for the tape.

Session wey dem verify

QuerySession verification: first/last SPY bar ET, regular-bar count, holiday receipts, next closure
first SPY bar ETlast SPY bar ETSPY minute barsregular session barsday sessionsJul 8 holiday rowsnext closure datenext closure name
04:0019:59919390102026-09-07Labor Day
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'
Run am yourself

Session run the full extended-hours window. First SPY bar show for 04:00 ET, and the last one show for 19:59 ET. E get 390 regular-hours minute bars and 1 trading session inside the window. No half-day dey; the holiday table no get row for that date. The next scheduled closure na Labor Day on 2026-09-07.

Data notes

All timestamps dey stored for UTC; regular hours for July 8, 2026 dey filtered as sip_timestamp / window_start between 2026-07-08 13:30:00 and 2026-07-08 20:00:00. This one correspond to 9:30 am–4:00 pm New York time. Decimal prices dey cast to Float64 before any division. Named per-ticker panels (scoreboard, chip complex, rotation) dey arranged alphabetically by ticker, so every prose reference dey point to one fixed row. Leaderboards (volume, quote snapshot) dey arranged by value, and every position 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, na fresh calculation from July 7 (and July 6 when prior close dey needed) inside the same query block. Dem no copy am from any 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 show the excluded tail. The chip complex day_low/day_high timing columns dey use the argMin/argMaxIf(..., (value, timestamp)) pattern so ties go resolve deterministically. The volume-smile bucket labels na ET (%H:%i), and dem dey calculate am with toTimeZone for 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 dey spoil, according to the standing preflight note. Symbols inside KNOWN_AMBIGUOUS_TICKERS dey excluded from the volume-leaders and news-attention SQL, so “most X” callouts go land on names wey person fit verify. The top-news ticker dey use deterministic tie-break (argMax(t, (n, t))); top_news_lead_over_next = 0 mean say tie dey, na why the prose talk say “among the most-mentioned”. The treasury panel dey join two daily snapshot rows. If snapshot no dey for either date, the result go get zero rows, and the row_count bound dey hold the post. The stocks-quote and options-quote counts na whole-tape scans across day partitions. Named-ticker counts dey report for millions to match their column units. Spread medians dey use quantileExact (deterministic); the trailing spread panel na an average (avgIf), and dem label am as such.

Methodology

  • Source wey market data come from: consolidated tape, delayed_stocks_minute_aggs for index and per-name prices and volumes, 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 stored timestamps na UTC; we calculate ET clock labels with toTimeZone(..., 'America/New_York') only inside SELECT lists; WHERE clauses dey use raw UTC literals.
  • Regular-hours window: 13:30–20:00 UTC. We verify am with observed SPY minute bars (the session-verification panel), no be calendar arithmetic.
  • How we define spread: (ask - bid) / midpoint × 10,000 for basis points on valid two-sided quotes for the snapshot; the trailing-month panel na average width for cents, and we label am as average.
  • Comparison with previous session: we calculate am inside the query from July 7 (and July 6 for Tuesday own day-over-day comparison). We no carry am from previous post.
  • Deterministic aggregates: quantileExact, tuple-keyed argMin/argMax, plus deterministic news tie-break so stable regenerations fit happen.
  • Warehouse as-of date: July 10, 2026 (T+2 for the period). Tapes for both sessions don fully enter at this depth.

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

#recap#daily#spy#qqq#semiconductors#market structure