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

July 8 Market Recap: Chip Bounce, Indexes Flat

Chip stocks bounce for one day, but indexes barely feel am. NVDA rise again, MU carry the biggest dollar move, while broad market red pass green by over two-to-one.

Wednesday, July 8, 2026 na one-day chip bounce wey barely move the indexes. SNDK close +6.8%, AVGO +4.82%, NVDA +3.66%. Na sharp reversal from Tuesday chip rout. But index ETFs no move: SPY -0.31% and QQQ +0.25%. The broad tape get even more red, two-to-one, than the day before: 1821 advancers against 4260 decliners. Advancer share na 29.6%, after 33.8% the session before. Every number below come from stored query. Expand any panel to see the exact SQL.

The scoreboard

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

QuerySPY / QQQ / DIA / IWM: July 8 versus July 7 close, regular hours
tickerprevious 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 dem move for different directions. DIA open the session at -0.97% against the previous close and fall more, before e finish 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, na the only one among the four wey enter positive territory.

Day wey happen unusual?

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

QuerySPY / QQQ day move for trailing context (close-over-close, ~22 sessions)
QQQ close-over-close pctQQQ absolute move rankQQQ sessions comparedSPY open-to-close pctSPY absolute move rankSPY sessions comparedfirst 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

Breadth: red names pass green ones two-to-one, even more than yesterday

QueryLiquid-tape breadth: July 8 advancer share versus July 7, $1M-traded filter
advancersdeclinersunchangedliquid tickerstraded both sessionsdropped by liquidity filteradvancer pctJul 7 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 advancers (1821) and decliners (4260) push advancer share reach 29.6%, down from 33.8% for the session before. Na the same calculation, using the same liquidity filter 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 enter the count. The bounce wey chip stocks lead and the index mixed close happen on top of a broad market wey turn even more uniformly negative.

The chip complex bounce hard, with heavy volume

Rows dey arranged alphabetically, so every name keep fixed position. The Tuesday comparison dey calculate fresh from the July 7 and July 6 closes for the receipts block wey dey below the table.

QueryFourteen chip names: prior close, day close, day range, dollar volume, low/high minute ET
tickerprevious closeday closepct chgrange pctday lowday highlow minute EThighest 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. This na the opposite of Tuesday session, when 12 out of the fourteen close red. SNDK lead the complex with +6.8% on 16.82B dollars traded. AVGO follow close behind with +4.82%. The other storage names follow: STX +3.9%, and WDC +3.45%. The 3x wrapper SOXL gain +5.79%, while inverse SOXS -6.22%, matching one-day recovery for the underlying complex. MU rise a more modest +1.11%, but e print 32.02B dollars. Na im be the name with the highest dollar volume for this panel. NVDA close +3.66% for a second straight green day. E be 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 di 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

The other side: defensives and growth mega-caps no follow

QueryRotation check: eight names, defensives, mega-caps, biotech
tickerprevious 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

The growth mega-caps move opposite the chip complex: TSLA -2.22%, META -2.04%, LLY -1.6%. CVX na the only green close for the panel, up +1.12% after e gap for early trading, while XOM open +1.26% higher but later fade to -0.49% by close. So Wednesday tape divide into two: chip names up, growth and defensives down, while the indexes remain steady between them. (Rows dey alphabetical: CRNX, CVX, JNJ, LLY, META, TSLA, UNH, XOM.)

Wia money change hand

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 32.02B dollars, na the biggest name for the day and the only one wey pass $30B level. SPY (26.49B), NVDA (24.17B), and QQQ (20.9B) follow, with SNDK at 16.82B and TSLA at 11.71 completing the dollar ranking. The shares ranking tell another story: the 3x inverse semiconductor ETF SOXS trade 636.5M shares for implied average price of $4.67, showing how low-priced 3x wrapper dey behave on heavy chip day.

Session pattern

QueryShares per 30-minute ET bucket, regular hours, with % of the day 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 open bucket dey at 89.9% of the biggest bucket for the day, then e reduce through the morning. E reach lowest point at 34.1% for the 1:00–1:30 pm ET slot. The closing half-hour (15:30 ET) na the biggest bucket for the day, with 2.2B shares. E pass the open’s 1.98B, and this na the normal pattern for regular session.

The options tape

QueryOptions tape: prints, contracts, call %, 0DTE share versus Tuesday, top contract
option prints mcontracts mJul7 contracts mcall pct of volumepct 0DTEJul7 pct 0DTESPY regular closetop1 undtop1 striketop1 typetop1 contractstop1 avg pxtop1 is 0DTEtop1 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

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

The quote tape

QueryStocks NBBO update count: July 8 versus 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

The stock-quote tape carry 530.55M NBBO updates for July 8, +7.7% compared with the previous session. QQQ get 6.53M updates, na im lead among the tickers wey we name, ahead of SPY’s 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 tickers wey we name, SPY RTH median quoted spread na 0.27 bps, and e dey at the normal floor for the most-liquid US ETF. QQQ quote at 0.71 bps, while NVDA quote at 1.52 bps. The wider end of the table belong to 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
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. Na middle-of-the-pack day for spread tightness. The trailing-month range run from 1.809 cents (the tightest) to 2.865 cents (the widest). No air pocket, no liquidity event; na ordinary session for SPY quoted spread.

QueryOptions NBBO tape: total updates versus 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

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

Rates: curve hardly move

QueryTreasury yields: July 8 versus 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

Na the 5-year lead today’s movement, at +4 bp. The 2-year close +2 bp higher. No other maturity move pass 2 bp for either side. That leave the 2s10s spread at 0.35% (-1 bp for the session), still inside the recent range. The small rates movement happen alongside the small index movement.

The 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 pass 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 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 big household-name corporate action stand out for the day’s flow; na the chip complex itself be 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 sessionsJul8 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 complete extended-hours window. The first SPY bar show for 04:00 ET, while 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 happen; holiday table no get row for that date. The next scheduled closure na Labor Day for 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 point to one fixed row. Leaderboards (volume, quote snapshot) dey arranged by value. 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, dey computed fresh from July 7 (and July 6 where prior close dey needed) inside the same query block. Dem no dey 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 on 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 argMin/argMaxIf(..., (value, timestamp)) pattern so ties fit resolve deterministically. The volume-smile bucket labels na ET (%H:%i), and dem dey compute 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 spoil, according to the standing preflight note. Symbols for KNOWN_AMBIGUOUS_TICKERS dey excluded from the volume-leaders and news-attention SQL, so “most X” callouts go fall 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 tie, and 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, e go return 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 reported in millions to match their column units. Spread medians dey use quantileExact (deterministic). The trailing spread panel na an average (avgIf), and dem label am that way.

Methodology

  • Market data source: 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.
  • Time zone handling: all stored timestamps na UTC; ET clock labels dey calculate with toTimeZone(..., 'America/New_York') for SELECT lists only; WHERE clauses dey use raw UTC literals.
  • Regular-hours window: 13:30–20:00 UTC, verified against observed SPY minute bars (the session-verification panel), no be calendar arithmetic.
  • Spread definition: (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 dem label am as an average.
  • Prior-session comparisons: query dey calculate dem from July 7 (and July 6 for Tuesday own day-over-day), dem no carry am over from previous post.
  • Deterministic aggregates: quantileExact, tuple-keyed argMin/argMax, plus deterministic news tie-break for stable regenerations.
  • Warehouse as-of date: July 10, 2026 (T+2 for the period); tapes for both sessions don fully enter the warehouse for 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