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

July 9 Market Recap: The Day in Numbers

Chip equipment gap up then fade, mega-caps bounce back, and tape turn green. See how NVDA still close red and wetin drive the sharp reversal.

Thursday, July 9, 2026 carry all the violence inside one minute, and that minute happen before opening bell. Chip-equipment names don already dey trade far above Wednesday close for premarket, while META sit -3.16% below am; the 9:30 print confirm both moves. The day later reverse part of its own open: the chip gaps fade, META climb back fully, and the tape close 71.5% green, the broadest session for the week. NVDA, wey dey green throughout Tuesday rout, close red. Every number below come from stored query.

What set up the open

Gaps no happen for the first time at 9:30. Between 4:00 am and 9:29 am ET, premarket tape don already reprice these names, and opening print land for that level.

QueryPremarket path, 4:00-9:29 am ET: last premarket print vs Wednesday close, and the open wey follow
tickerprior closefirst premkt bar ETpremkt lastpremkt pctpremkt shares kgap pctopen vs premkt pct
KLAC221.0304:00239.88.49357.18.14-0.33
LRCX332.9304:00365.049.64359.69.670.02
META603.0304:00584-3.161463.8-3.160
NVDA204.1404:00204.460.163741.70.160
QQQ711.304:00718.320.991652.70.990
SPY745.3104:00747.380.28814.80.270
The exact SQL behind every number
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    formatDateTime(first_pm_bar, '%H:%i') AS first_premkt_bar_et,
    round(premkt_last, 2) AS premkt_last,
    round((premkt_last / prior_close - 1) * 100, 2) AS premkt_pct,
    round(premkt_shares / 1e3, 1) AS premkt_shares_k,
    round((day_open / prior_close - 1) * 100, 2) AS gap_pct,
    round((day_open / premkt_last - 1) * 100, 2) AS open_vs_premkt_pct
FROM (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')) AS prior_close,
        minIf(toTimeZone(window_start, 'America/New_York'), window_start >= '2026-07-09 08:00:00' AND window_start < '2026-07-09 13:30:00') AS first_pm_bar,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 08:00:00' AND window_start < '2026-07-09 13:30:00')) AS premkt_last,
        sumIf(toFloat64(volume), window_start >= '2026-07-09 08:00:00' AND window_start < '2026-07-09 13:30:00') AS premkt_shares,
        toFloat64(argMinIf(open, window_start, window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00')) AS day_open
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'KLAC', 'LRCX', 'META', 'NVDA')
      AND ((window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')
        OR (window_start >= '2026-07-09 08:00:00' AND window_start < '2026-07-09 20:00:00'))
    GROUP BY ticker
)
ORDER BY ticker
Run am yourself

KLAC last premarket print dey +8.49% above Wednesday close, and e open +8.14%; LRCX run +9.64% before e open +9.67%; META print -3.16% and e open -3.16%. Read open_vs_premkt_pct: all six open within one percent of their last premarket price. NVDA na the odd one, 0.16% overnight on 3741.7k shares. Na the one wey get the heaviest premarket volume among the six, plus the smallest move (premarket and after-hours trading).

Catalyst dey? Our data no name any

Recap suppose talk wetin move a stock. But for here, our tables no name anything: both the news feed and SEC filing index empty for the four names wey gap pass.

QueryNamed catalysts wey dey file: news articles and SEC filings for each name, Wednesday close reach Thursday own
tickerovernight articlessession articlesSEC filings8-K filings
AMD1200
KLAC0000
LRCX0000
META4710
MSFT6500
MU6600
NVDA7900
TER0000
WDC0000
The exact SQL behind every number
SELECT
    ticker,
    toUInt32(sum(overnight_articles)) AS overnight_articles,
    toUInt32(sum(session_articles)) AS session_articles,
    toUInt32(sum(sec_filings)) AS sec_filings,
    toUInt32(sum(filings_8k)) AS filings_8k
FROM (
    SELECT
        arrayJoin(['AMD', 'KLAC', 'LRCX', 'META', 'MSFT', 'MU', 'NVDA', 'TER', 'WDC']) AS ticker,
        toUInt64(0) AS overnight_articles, toUInt64(0) AS session_articles,
        toUInt64(0) AS sec_filings, toUInt64(0) AS filings_8k
    UNION ALL
    SELECT
        arrayJoin(tickers) AS ticker,
        countIf(published_utc < '2026-07-09 13:30:00') AS overnight_articles,
        countIf(published_utc >= '2026-07-09 13:30:00') AS session_articles,
        toUInt64(0) AS sec_filings, toUInt64(0) AS filings_8k
    FROM global_markets.stocks_news
    WHERE published_utc >= '2026-07-08 20:00:00' AND published_utc < '2026-07-09 20:00:00'
    GROUP BY ticker
    UNION ALL
    SELECT
        ticker, toUInt64(0), toUInt64(0),
        count() AS sec_filings,
        countIf(form_type = '8-K') AS filings_8k
    FROM global_markets.stocks_sec_edgar_index
    WHERE filing_date >= '2026-07-08' AND filing_date <= '2026-07-09'
    GROUP BY ticker
)
WHERE ticker IN ('AMD', 'KLAC', 'LRCX', 'META', 'MSFT', 'MU', 'NVDA', 'TER', 'WDC')
GROUP BY ticker
ORDER BY ticker
Run am yourself

0 overnight articles, 0 intraday, 0 SEC filings for KLAC. LRCX, TER and WDC get the same empty row. NVDA, wey no gap at all, get the heaviest coverage among the nine (7 overnight, 9 intraday) and e close red. Na attention from one feed, no be all the world media. Empty row no prove say event no happen. But nothing for our data name a cause, and “cause unknown” na complete answer.

The scoreboard

Every change dey compare July 9 last regular-session minute bar with Wednesday own. Rows dey alphabetical, so every ETF keep fixed position.

QuerySPY / QQQ / DIA / IWM: July 9 vs July 8 close, regular hours
tickerprior closeday openday closegap pctintraday pctpct changeday highday lowshares traded m
DIA522.72523.65524.220.180.110.29525.15522.142.7
IWM293.47295.27297.260.610.671.29297.88294.914.4
QQQ711.3718.33723.190.990.681.67724.23715.1227.8
SPY745.31747.35751.640.270.570.85751.97745.5932.5
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-08 13:30:00' AND window_start < '2026-07-08 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-09 13:30:00' AND window_start < '2026-07-09 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

All four close green. QQQ lead with +1.67%, from a +0.99% gap plus a +0.68% climb. Small-cap IWM take +1.29%, SPY gain +0.85% to $751.64, while DIA trail with +0.29%. Growth dey front, Dow dey back.

Was di day unusual?

For di index level, no be so: QQQ get +1.67% close-over-close move, wey rank 10 out of 21 trailing sessions by size. SPY open-to-close move rank 8 out of 22. Na the movement between the day’s groups carry di drama.

QuerySPY / QQQ day move for trailing context (~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
1.6710210.578222026-06-08
The exact SQL behind every number
SELECT
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-09')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-07-09'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-07-09'))) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ' AND isFinite(cc_pct)) AS qqq_sessions_compared,
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-09')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-07-09'))), groupArrayIf(abs(oc_pct), ticker = 'SPY' AND d != toDate('2026-07-09'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    toString(min(d)) AS first_session
FROM (
    SELECT ticker, d,
           if(isFinite(close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1),
              (close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100, NULL) 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-08 13:30:00')
          AND window_start < toDateTime('2026-07-10 00:00:00')
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker, d
    )
)
Run am yourself

Breadth: di na session wey broad pass for this week

QueryLiquid-tape breadth: July 9 advancer share vs July 8, $1M-traded filter
advancersdeclinersunchangedliquid tickerstraded for both sessionsdropped by liquidity filteradvancer pctJul 8 advancer pct
4263163172596611351538571.529.6
The exact SQL behind every number
SELECT
    countIf(close_9 > close_8 AND close_8 > 0 AND dv_9 >= 1000000) AS advancers,
    countIf(close_9 < close_8 AND close_8 > 0 AND dv_9 >= 1000000) AS decliners,
    countIf(close_9 = close_8 AND close_8 > 0 AND dv_9 >= 1000000) AS unchanged,
    countIf(close_8 > 0 AND close_9 > 0 AND dv_9 >= 1000000) AS liquid_tickers,
    countIf(close_8 > 0 AND close_9 > 0) AS traded_both_sessions,
    countIf(close_8 > 0 AND close_9 > 0) - countIf(close_8 > 0 AND close_9 > 0 AND dv_9 >= 1000000) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(close_9 > close_8 AND close_8 > 0 AND dv_9 >= 1000000) / countIf(close_8 > 0 AND close_9 > 0 AND dv_9 >= 1000000), 1) AS advancer_pct,
    round(100.0 * countIf(close_8 > close_7 AND close_7 > 0 AND dv_8 >= 1000000) / countIf(close_8 > 0 AND close_7 > 0 AND dv_8 >= 1000000), 1) AS jul8_advancer_pct
FROM (
    SELECT ticker,
           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,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00')) AS close_9,
           sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00') AS dv_9,
           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
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-09 20:00:00'
    GROUP BY ticker
)
Run am yourself

4263 advancers against 1631 decliners, meaning say advancers make up 71.5% after 29.6% on Wednesday. Na the same calculation and the same $1M-traded filter apply; 5385 of 11351 names fall below the filter. Compare am with the rest of the week:

QueryThe week so far: index moves and advancer share for each session wey don complete
dateSPY pctQQQ pctadvancer pctliquid names
2026-07-060.871.3962.46189
2026-07-07-0.48-1.8233.96189
2026-07-08-0.310.2529.66162
2026-07-090.851.6771.45973
The exact SQL behind every number
WITH per_day AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS c,
           sum(toFloat64(close) * toFloat64(volume)) AS dv
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-09 20:00:00'
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
    GROUP BY ticker, d
),
lagged AS (
    SELECT ticker, d, c, dv,
           lagInFrame(c) OVER (PARTITION BY ticker ORDER BY d) AS prev_c
    FROM per_day
)
SELECT
    toString(d) AS date,
    round(anyIf((c / prev_c - 1) * 100, ticker = 'SPY'), 2) AS spy_pct,
    round(anyIf((c / prev_c - 1) * 100, ticker = 'QQQ'), 2) AS qqq_pct,
    round(100.0 * countIf(c > prev_c AND prev_c > 0 AND dv >= 1000000) / countIf(c > 0 AND prev_c > 0 AND dv >= 1000000), 1) AS advancer_pct,
    countIf(c > 0 AND prev_c > 0 AND dv >= 1000000) AS liquid_names
FROM lagged
WHERE d >= toDate('2026-07-06')
GROUP BY d
ORDER BY d
Run am yourself

Monday start with 62.4% advancers. Tuesday and Wednesday drop reach 33.9% and 29.6%. Thursday 71.4% na the highest for the four sessions wey don complete this week. Friday July 10 never enter this recap yet. QQQ follow the same pattern: -1.82% Tuesday, 0.25% Wednesday, and +1.67% Thursday.

Chips no be everything: how the rest of the market trade

Breadth show say most stocks rise; e no mean say the rally spread evenly. Below na equal-weighted basket of three liquid names for each sector, and na the same basket wey dem declare every day.

QueryEight declared sector baskets, three names each: July 9 close-over-close, equal-weighted
sectornamesaverage pct chgworst name pctbest name pctgap to best sector pct
Semiconductors34.243.25.680
Financials31.881.462.61-2.36
Industrials30.42-11.4-3.82
Healthcare30.22-1.621.41-4.02
Big tech30.17-0.760.93-4.07
Staples3-0.91-1.04-0.75-5.15
Utilities3-0.96-1.28-0.41-5.21
Energy3-2.01-2.54-1.06-6.25
The exact SQL behind every number
SELECT
    sector,
    count() AS names,
    round(avg(pct_chg), 2) AS avg_pct_chg,
    round(min(pct_chg), 2) AS worst_name_pct,
    round(max(pct_chg), 2) AS best_name_pct,
    round(avg(pct_chg) - max(avg(pct_chg)) OVER (), 2) AS gap_to_best_sector_pct
FROM (
    SELECT
        ticker,
        multiIf(ticker IN ('AMD', 'AVGO', 'KLAC'), 'Semiconductors',
                ticker IN ('AAPL', 'MSFT', 'GOOGL'), 'Big tech',
                ticker IN ('JPM', 'BAC', 'GS'), 'Financials',
                ticker IN ('CAT', 'HON', 'GE'), 'Industrials',
                ticker IN ('XOM', 'CVX', 'COP'), 'Energy',
                ticker IN ('JNJ', 'UNH', 'PFE'), 'Healthcare',
                ticker IN ('KO', 'PG', 'WMT'), 'Staples',
                'Utilities') AS sector,
        (toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'))
         / toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')) - 1) * 100 AS pct_chg
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AMD', 'AVGO', 'KLAC', 'AAPL', 'MSFT', 'GOOGL', 'JPM', 'BAC', 'GS', 'CAT', 'HON', 'GE',
                     'XOM', 'CVX', 'COP', 'JNJ', 'UNH', 'PFE', 'KO', 'PG', 'WMT', 'NEE', 'DUK', 'SO')
      AND window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-09 20:00:00'
    GROUP BY ticker
)
GROUP BY sector
ORDER BY avg_pct_chg DESC
Run am yourself

Semiconductors lead with +4.24%, while Energy trail with -2.01%, giving -6.25-point spread (gap_to_best_sector_pct). Financials be the strongest non-chip basket at +1.88%; Staples (-0.91%), Utilities (-0.96%) and Energy close red. Big tech (AAPL, MSFT and GOOGL) average a mild +0.17%. The biggest open-to-close reversal for the day, META's +8.1% swing, dey outside all eight baskets; inside this basket, MSFT's -2.25% open into a +0.33% close be the sharpest round trip.

Semiconductor open wey fade follow am

gap_pct na the open against Wednesday close; intraday_pct na the remaining part of the day. Rows dey alphabetical order.

QueryFourteen chip names: gap at the open vs the rest of the day, July 9
tickerprior closeday openday closegap pctintraday pctpct chgday dollar bn
AMD517.26537.26546.663.871.755.6812.15
AVGO388.67402.19401.113.48-0.273.28.34
INTC110.27114.87112.554.17-2.022.079.21
KLAC221.03239.02229.518.14-3.983.842.29
LRCX332.93365.13353.249.67-3.266.13.36
MRVL231.66246.18243.336.27-1.165.044.04
MU949.371016.51990.57.07-2.564.3333.56
NVDA204.14204.46202.760.16-0.83-0.6821.28
SNDK1729.41835.611858.266.141.237.4520.59
SOXL174.84199.81192.4414.28-3.6910.077.8
SOXS4.523.874.07-14.385.17-9.962.18
STX859.68922.28889.797.28-3.523.53.64
TER351.56379.24362.877.87-4.323.220.95
WDC550.71594.14578.327.89-2.665.013.27
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-09 00:00:00')) AS prior_close,
        toFloat64(argMinIf(open, window_start, window_start >= '2026-07-09 00:00:00')) AS day_open,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-09 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-09 00:00:00') AS day_low,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-09 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-08 13:30:00' AND window_start < '2026-07-08 20:00:00')
        OR (window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    round(day_open, 2) AS day_open,
    round(day_close, 2) AS day_close,
    round((day_open / prior_close - 1) * 100, 2) AS gap_pct,
    round((day_close / day_open - 1) * 100, 2) AS intraday_pct,
    round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run am yourself

KLAC open +8.14% above Wednesday close, then e give back -3.98%; LRCX open +9.67% and fade -3.26%; TER (+7.87%) and WDC (+7.89%) follow the same pattern. MU gap up +7.07%, fall -2.56%, but still close +4.33% on 33.56B, the stock wey get the heaviest trading for the second session in a row (Wednesday recap get the first one). AMD and SNDK na the exceptions: AMD add 1.75% after opening +3.87%, to finish +5.68%, while SNDK, wey don already dey +6.14% for the open, add another 1.23% to close +7.45%. And NVDA: e open +0.16%, no gap, then close at -0.68%.

QueryReceipts: July 9 green/red counts across the fourteen names, and NVDA two-day turn
Jul9 greenJul9 redJul8 greenNVDA Jul9 pctNVDA Jul8 pctnames we count
12212-0.683.6614
The exact SQL behind every number
SELECT
    countIf(close_9 > close_8) AS jul9_green,
    countIf(close_9 < close_8) AS jul9_red,
    countIf(close_8 > close_7) AS jul8_green,
    round(anyIf((close_9 / close_8 - 1) * 100, ticker = 'NVDA'), 2) AS nvda_jul9_pct,
    round(anyIf((close_8 / close_7 - 1) * 100, ticker = 'NVDA'), 2) AS nvda_jul8_pct,
    count() AS names_counted
FROM (
    SELECT ticker,
           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,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00')) AS close_9
    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-09 20:00:00'
    GROUP BY ticker
)
Run am yourself

12 of the fourteen stocks close green; the 2 red closes na the opposite wrapper, structural move for an up day, plus NVDA at -0.68%, one day after e close +3.66%. The biggest chip name for the tape no join the celebration for e own sector, even as e carry the heaviest news coverage.

The other side: mega-caps open low and climb back

QueryEight mega-caps and defensives: gap at the open vs the rest of the day, July 9
tickerprior closeday openday closegap pctintraday pctpct chgday dollar bn
AAPL313.26310.51316.17-0.881.820.9311.14
AMZN243.55239.82246.95-1.532.971.46.79
CVX175.92174.63174.05-0.73-0.33-1.060.91
GOOGL361.64354.31358.89-2.031.29-0.766.75
JNJ263.36260.63259.1-1.04-0.59-1.621.25
META603.03583.99631.31-3.168.14.6912.69
MSFT383.05374.45384.33-2.252.640.338.27
TSLA393.92393.99406.560.023.193.2112.67
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-09 00:00:00')) AS prior_close,
        toFloat64(argMinIf(open, window_start, window_start >= '2026-07-09 00:00:00')) AS day_open,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-09 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-09 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'AMZN', 'CVX', 'GOOGL', 'JNJ', 'META', 'MSFT', 'TSLA')
      AND ((window_start >= '2026-07-08 13:30:00' AND window_start < '2026-07-08 20:00:00')
        OR (window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    round(day_open, 2) AS day_open,
    round(day_close, 2) AS day_close,
    round((day_open / prior_close - 1) * 100, 2) AS gap_pct,
    round((day_close / day_open - 1) * 100, 2) AS intraday_pct,
    round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run am yourself

Seven of the eight open below Wednesday close; wetin happen after that na wetin separate dem. META open -3.16% low and climb +8.1% reach 4.69% close, na the strongest open-to-close reversal for this page. MSFT open -2.25% low and recover reach +0.33%; AMZN (+1.4%) and AAPL (+0.93%) follow the same pattern; TSLA no get gap and climb reach +3.21%. The names wey remain down no be growth stocks: GOOGL (-0.76%), CVX (-1.06%), JNJ (-1.62%). Why stocks dey gap overnight explain the mechanics.

Wey money trade

QueryTop 6 by dollars traded, top 4 by shares traded: July 9 regular hours
leaderboardtickerdollar volume bnshares mimplied average pricepct of board leader
by dollars tradedMU33.5633.11013.9100
by dollars tradedSPY24.3732.5749.8572.6
by dollars tradedNVDA21.28105.3202.0963.4
by dollars tradedSNDK20.59111871.8261.4
by dollars tradedQQQ20.0427.8720.8659.7
by dollars tradedMETA12.6920.8610.137.8
by shares tradedSOXS2.18558.13.91100
by shares tradedBITO2.79326.28.5558.4
by shares tradedTZA0.651643.9629.4
by shares tradedSNDQ0.34137.42.4724.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-09 13:30:00' AND window_start < '2026-07-09 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-09 13:30:00' AND window_start < '2026-07-09 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 top the dollar board again with 33.56B, pass SPY (24.37B), NVDA (21.28B) and SNDK (20.59B). Memory get two slots among the top four. The shares board na different market: SOXS lead with 558.1M shares, implied price $3.91 (relative volume).

QueryShares per 30-minute ET bucket, regular hours, closing auction prints for the final bucket, with % of the day biggest bucket
ET timeshares bnpct of biggest bucket
09:301.7958.3
10:001.445.4
10:301.0935.5
11:000.9530.9
11:300.8226.7
12:000.7524.3
12:300.6420.9
13:000.6420.9
13:300.6621.5
14:000.7123
14:300.7424.1
15:000.8427.5
15:303.07100
The exact SQL behind every number
SELECT
    et_time,
    round(sum(shares) / 1e9, 2) AS shares_bn,
    round(100 * sum(shares) / max(sum(shares)) OVER (), 1) AS pct_of_biggest_bucket
FROM
(
    SELECT
        formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
        toFloat64(volume) AS shares
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'
    UNION ALL
    SELECT
        '15:30' AS et_time,
        toFloat64(size) AS shares
    FROM global_markets.stocks_trades
    WHERE sip_timestamp >= '2026-07-09 20:00:00' AND sip_timestamp < '2026-07-09 20:15:00'
      AND has(conditions, 8)
)
GROUP BY et_time
ORDER BY et_time
Run am yourself

Na textbook U-shape: open bucket carry 1.79B shares, wey be 58.3% of the biggest volume. Midday trough na 0.64B. The closing auction half-hour na the biggest for the day, with 3.07B shares. Even though the day start strong for the open, volume finish for the close.

The options tape

QueryOptions tape: prints, contracts, call %, 0DTE share vs Wednesday, top contracts
option prints mcontracts mJul8 contracts mcall pct of volumepct 0dteJul8 pct 0dteSPY regular closetop1 underlyingtop1 striketop1 typetop1 contracts ktop1 avg pxtop1 na 0dtetop2 underlyingtop2 striketop2 typetop2 na 0dtetop3 underlyingtop3 striketop3 typetop3 na 0dtetop1 moneyness
9.9958.8563.265828.738.7751.64SPY751C846.60.5261SPY752C1SPY750C1-0.64
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) = '260709', 1, 0) AS is_0dte
            FROM global_markets.options_trades
            WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
            GROUP BY ticker
            ORDER BY vol DESC
            LIMIT 3
        )
    ) AS top3,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'
    ) AS spy_regular_close,
    (
        SELECT round(toFloat64(sum(size)) / 1e6, 2)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00'
    ) AS jul8_contracts_m,
    (
        SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260708') / sum(size), 1)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-09 00:00:00'
    ) AS jul8_pct_0dte
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    jul8_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) = '260709') / sum(size), 1) AS pct_0dte,
    jul8_pct_0dte,
    spy_regular_close,
    top3.1[1] AS top1_und, top3.2[1] AS top1_strike, top3.3[1] AS top1_type,
    round(toFloat64(top3.4[1]) / 1e3, 1) AS top1_contracts_k, top3.5[1] AS top1_avg_px, top3.6[1] AS top1_is_0dte,
    top3.1[2] AS top2_und, top3.2[2] AS top2_strike, top3.3[2] AS top2_type, top3.6[2] AS top2_is_0dte,
    top3.1[3] AS top3_und, top3.2[3] AS top3_strike, top3.3[3] AS top3_type, top3.6[3] AS top3_is_0dte,
    round(toFloat64(top3.2[1]) - spy_regular_close, 2) AS top1_moneyness
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
Run am yourself

Tape get 9.99M prints and 58.85M contracts. E carry am under Wednesday’s 63.26M, with calls taking 58% of volume. The 0DTE share fall to 28.7% from 38.7%. The three contracts wey trade pass na all same-day SPY calls: 751C (846.6K contracts, average $0.526), 752C and 750C. Dem form ladder around SPY’s $751.64 close (0DTE options explain the product).

Hedge or bet? Hedge dey buy strikes wey dey away from the money. Bet dey buy the side wey e want.

QuerySPY same-day (0DTE) options: contracts by strike distance from the closing price
strike bucketcall contracts kput contracts kcall share pct
Strike >2% below close1.8146.81.2
Strike 0.5-2% below255.41356.515.8
Strike within 0.5%3768.92563.359.5
Strike 0.5-2% above29.12.791.6
Strike >2% above close0.30.349
The exact SQL behind every number
WITH (
    SELECT toFloat64(argMax(close, window_start))
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY' AND window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'
) AS spy_close
SELECT
    multiIf(dist < -2, 'Strike >2% below close',
            dist < -0.5, 'Strike 0.5-2% below',
            dist <= 0.5, 'Strike within 0.5%',
            dist <= 2, 'Strike 0.5-2% above',
            'Strike >2% above close') AS strike_bucket,
    round(toFloat64(sumIf(size, option_type = 'C')) / 1e3, 1) AS call_contracts_k,
    round(toFloat64(sumIf(size, option_type = 'P')) / 1e3, 1) AS put_contracts_k,
    round(100.0 * sumIf(size, option_type = 'C') / sum(size), 1) AS call_share_pct
FROM (
    SELECT option_type, size, (toFloat64(strike_price) / spy_close - 1) * 100 AS dist
    FROM global_markets.options_trades
    WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
      AND underlying_symbol = 'SPY'
      AND substring(ticker, length(ticker) - 14, 6) = '260709'
)
GROUP BY strike_bucket
ORDER BY min(dist)
Run am yourself

The same-day tape dey near the money: 3768.9k calls and 2563.3k puts within half percent of the close (59.5% calls). The wings split by direction. Below the close, get 1356.5k puts against 255.4k calls (1.2% call share deeper down). Above am, calls take 91.6% of a far thinner 29.1k bucket. Wing volume dey mostly for downside strikes, where people dey buy protection: na at-the-money ladder, no be upside one.

The quote tape

QueryStocks NBBO update count: July 9 vs July 8, with named-ticker updates (millions)
Jul9 updates mJul8 updates mday-over-day pctJul9 SPY updates mJul9 QQQ updates mJul9 NVDA updates mJul9 TSLA updates mJul9 MU updates m
383.44530.55-27.72.714.351.830.460.72
The exact SQL behind every number
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09')) / 1e6, 2) AS jul9_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-08')) / 1e6, 2) AS jul8_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-09')) / countIf(toDate(sip_timestamp) = toDate('2026-07-08')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09') AND ticker = 'SPY') / 1e6, 2) AS jul9_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09') AND ticker = 'QQQ') / 1e6, 2) AS jul9_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09') AND ticker = 'NVDA') / 1e6, 2) AS jul9_nvda_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09') AND ticker = 'TSLA') / 1e6, 2) AS jul9_tsla_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-09') AND ticker = 'MU') / 1e6, 2) AS jul9_mu_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-08 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
Run am yourself

The day get one quiet fact: 383.44M NBBO updates show for stock tape, -27.7% compared with Wednesday. The big movement dey happen for price levels, no be for how often bid and offer change. Among the tickers wey dem name, QQQ lead with 4.35M, ahead of SPY at 2.71M and NVDA at 1.83M.

QuerySPY / QQQ / NVDA / TSLA / MU / SNDK / AVGO: RTH median quoted spread in basis points
tickermedian spread bps
SPY0.27
QQQ0.42
NVDA0.99
TSLA2.27
AVGO3.06
MU4.23
SNDK8.79
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-09 13:30:00' AND sip_timestamp < '2026-07-09 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

SPY median quoted spread na 0.27 bps, QQQ na 0.42, and NVDA na 0.99. All of dem dey within normal range. The wider ones na MU at 4.23 bps and SNDK at 8.79 bps (bid-ask spread na the cost wey this measurement dey capture).

QuerySPY RTH average quoted spread for trailing-month context
Jul9 average spread centstightness ranksessions comparedtightest session centswidest session centsfirst session
2.07110221.8092.8652026-06-08
The exact SQL behind every number
SELECT
    round(anyIf(avg_spread_cents, d = toDate('2026-07-09')), 3) AS jul9_avg_spread_cents,
    arrayCount(x -> x < anyIf(avg_spread_cents, d = toDate('2026-07-09')), groupArrayIf(avg_spread_cents, d != toDate('2026-07-09'))) + 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
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
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= toDateTime('2026-06-08 00:00:00')
      AND sip_timestamp < toDateTime('2026-07-10 00:00:00')
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY d
)
Run am yourself

SPY average quoted spread na 2.071 cents. E rank 10 out of 22 previous sessions. E stay inside 1.809–2.865 cent range. This mean say quote no dey under stress, even as market open that way.

QueryOptions NBBO tape: total updates vs the stock tape, plus the SPY root slice
Jul9 options bnoptions to stock ratioJul9 SPY options m
6.918242
The exact SQL behind every number
WITH
    (SELECT count() FROM global_markets.cache_options_quotes WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00') AS jul9_options_rows,
    (SELECT count() FROM global_markets.cache_stocks_quotes WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00') AS jul9_stock_quote_rows
SELECT
    round(jul9_options_rows / 1e9, 2) AS jul9_options_bn,
    round(jul9_options_rows / jul9_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-09 13:30:00' AND sip_timestamp < '2026-07-09 20:00:00') / 1e6, 0) AS jul9_spy_options_m
Run am yourself

The options-quote tape record 6.9 billion NBBO updates. Na 18× the number for stock tape, while SPY root alone account for 242M.

Rates: July 9 print

QueryTreasury print status: July 9 rows wey dey record, and the July 8 curve (latest as authoring)
Jul9 print rowslatest print datelatest 2y pctlatest 10y pctlatest 30y pctlatest 2s10s pct
12026-07-094.164.545.050.38
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.treasury_yields WHERE date = '2026-07-09') AS jul9_print_rows,
    toString(any(date)) AS latest_print_date,
    round(toFloat64(any(yield_2_year)), 2) AS latest_2y_pct,
    round(toFloat64(any(yield_10_year)), 2) AS latest_10y_pct,
    round(toFloat64(any(yield_30_year)), 2) AS latest_30y_pct,
    round(toFloat64(any(yield_10_year)) - toFloat64(any(yield_2_year)), 2) AS latest_2s10s_pct
FROM global_markets.treasury_yields
WHERE date = '2026-07-09'
Run am yourself

July 9 Treasury print show after authoring, following the daily yield file normal delay. 1 row don enter record now. The day’s curve (2026-07-09): 2-year 4.16%, 10-year 4.54%, 30-year 5.05%, 2s10s 0.38 points. The 2-year yield ease from July 8 level, while the long end hold steady.

The calendar wey dey behind the day

QueryEx-divs, splits, SEC filings, news attention
ex-dividend recordssplits wey dem executereverse splitsforward splitsForm 424B2 filingsForm 4 filingsForm 8-K filingstotal filingsnews articlesnews publisherstop news tickertop news ntop news lead over nexttop news na NVDA
12765160662314929811843NVDA2081
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-09'
    ) 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-09'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-09') AS ex_dividend_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-07-09') AS splits_executed,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-09') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-09') AS forward_splits,
    (SELECT countIf(form_type = '424B2') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-09') AS fil_424b2,
    (SELECT countIf(form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-09') AS fil_form4,
    (SELECT countIf(form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-09') AS fil_8k,
    (SELECT count() FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-09') 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,
    if(top_news.1 = 'NVDA', 1, 0) AS top_news_is_nvda
Run am yourself

Na normal calendar for one abnormal opening: 127 ex-dividend records, 5 reverse splits, 1 forward split, 2981 SEC filings (623 Form 4s, 606 424B2s, 149 8-Ks). The feed carry 184 articles from 3 publishers; ticker wey dem cover pass na NVDA, with 20 articles, 8 ahead of the next name.

On deck

From our own tables, facts about the next session, no be forecast.

QueryOn deck: the next session, the ex-dividend slate, the SPY expiry ladder, and the short-interest clock
next session datenext session holiday rowsex-div records nexthousehold ex-div nextSPY next expiry contracts mSPY monthly expiry contracts mlatest short settlementjul15 short rows
2026-07-10015301.660.572026-06-150
The exact SQL behind every number
SELECT
    toString(min(d)) AS next_session_date,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-10') AS next_session_holiday_rows,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-10') AS ex_div_records_next,
    (SELECT countIf(ticker IN ('AAPL', 'MSFT', 'JNJ', 'KO', 'PG', 'XOM', 'CVX', 'JPM', 'WMT', 'PEP', 'HON', 'CAT'))
     FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-10') AS household_ex_div_next,
    (SELECT round(toFloat64(sum(size)) / 1e6, 2) FROM global_markets.options_trades
     WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
       AND underlying_symbol = 'SPY' AND substring(ticker, length(ticker) - 14, 6) = '260710') AS spy_next_expiry_contracts_m,
    (SELECT round(toFloat64(sum(size)) / 1e6, 2) FROM global_markets.options_trades
     WHERE sip_timestamp >= '2026-07-09 00:00:00' AND sip_timestamp < '2026-07-10 00:00:00'
       AND underlying_symbol = 'SPY' AND substring(ticker, length(ticker) - 14, 6) = '260717') AS spy_monthly_expiry_contracts_m,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest
     WHERE _ingest_time < '2026-07-11 00:00:00') AS latest_short_settlement,
    (SELECT count() FROM global_markets.stocks_short_interest
     WHERE settlement_date = '2026-07-15' AND _ingest_time < '2026-07-11 00:00:00') AS jul15_short_rows
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY' AND window_start >= '2026-07-10 00:00:00' AND window_start < '2026-07-14 00:00:00'
)
Run am yourself

The next session na 2026-07-10, 0 holiday rows dey against am: normal Friday. 153 companies go trade ex-dividend that morning, 0 from our household-name checklist. Friday’s SPY expiry na the heaviest forward one wey don already trade, 1.66M contracts for July 9 compared with 0.57M against the July monthly. Short-interest clock: latest settlement wey dey on file na 2026-06-15, 0 rows never file for mid-July. FINRA dey publish about eight business days after settlement (why short interest dey two weeks old).

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 sessionsjul9 holiday rowsnext closure datenext closure labelnext closure name
04:0019:59885390102026-09-07September 7, 2026Labor 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-09 13:30:00' AND window_start < '2026-07-09 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-09') AS jul9_holiday_rows,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-09' AND status = 'closed') AS next_closure_date,
    (SELECT concat(monthName(min(date)), ' ', toString(toDayOfMonth(min(date))), ', ', toString(toYear(min(date))))
     FROM global_markets.stocks_market_holidays WHERE date > '2026-07-09' AND status = 'closed') AS next_closure_label,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-09' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-09 00:00:00' AND window_start < '2026-07-10 00:00:00'
Run am yourself

Full ordinary session: first SPY bar na 04:00 ET, last one na 19:59 ET, 390 regular minute bars, no holiday row. Next closure na Labor Day, September 7, 2026.

FAQ

Wetin happen for stock market on July 9, 2026?

Every index ETF close higher. QQQ +1.67%, IWM +1.29%, SPY +0.85%, DIA +0.29%, 71.5% of liquid stocks close up. Chip-equipment names gap up then fade; mega-caps gap down then recover.

Why chip-equipment stocks like KLAC and LRCX jump on July 9, 2026?

Our data no give any reason. No article and no SEC filing for KLAC, LRCX, TER or WDC show from Wednesday close reach Thursday. The move don already price into the market premarket, before 9:30 am ET.

Why NVDA fall while chip sector rally?

NVDA close -0.68%, while 12 of fourteen chip names close green. E no gap (0.16% at the open) and na the ticker wey articles cover pass, with 20 articles. E appear together for the record, but this data no show the cause.

July 9, 2026 unusual day for the market?

No be for index level. QQQ move rank 10 of 21 trailing sessions by size, while SPY average spread rank 10 of 22. But the dispersion underneath wide: -6.25 points between the best and worst sector basket.

Data notes

Regular hours na 13:30–20:00 UTC (9:30 am–4:00 pm ET); premarket panel dey use 08:00–13:30 UTC. The eight sector baskets na curated and equal-weighted, with three liquid names each, and every ticker dey listed for that panel’s SQL. Na declared method be this, no be vendor classification: three names fit speak for themselves, but dem no represent the whole sector. Catalyst panel dey count only our news feed and the EDGAR index.

Full data notes

Per-ticker panels dey arranged alphabetically, so each prose reference dey point to one fixed row; leaderboards dey ordered by value, and every positional claim get clear boundary. Treasury print and the mid-July short-interest settlement dey bounded to zero rows. Once dem arrive, this post go hold for rewrite.

Methodology

  • Sources: SQL wey dey power each panel dey name the tables e use: minute aggregates, stock and options NBBO caches, options trades, our news feed, EDGAR index, dividends, short interest, holidays, Treasury yields, and other tables.
  • The volume panel closing half hour dey count the closing auction prints. The one-minute bars no dey include any auction print, so the half-hour panel add every trade wey get closing-print sale condition, with timestamp from 4:00 to 4:15 p.m. ET for the consolidated tape, to the last bucket.
  • Conventions: raw UTC literals dey inside WHERE, while ET labels dey only inside SELECT; gap = first regular bar open ÷ prior regular close − 1; query dey calculate prior-session and prior-week figures inside itself, e no dey carry dem from earlier post. Warehouse as of July 13, 2026.
#recap#daily#spy#qqq#semiconductors#market structure