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

Market Recap July 9 2026: Wetin Happun for Numbers

Chip equipment gap up hard come fade, mega-caps gap down come rip back, tape flip green well-well, but NVDA sit out, close red. Broadest session for di week.

Thursday, July 9, 2026 pack all im wahala inside one minute — and dat minute show face before opening bell. Chip-equipment names don already dey far above Wednesday close for premarket trade, while META sit -3.16% below am; the 9:30 print confirm both of dem. The day come partly unwind im own open: the chip gaps fade, META climb all the way back, and the tape finish 71.5% green — na im be the broadest session for the week. NVDA, wey bin green through Tuesday own rout, close red. Every number wey dey below na from stored query dem read am.

Wetin set the open

The gaps no show for 9:30. Between 4:00 am and 9:29 am ET, the premarket tape don already reprice these names, and the opening print just land for that level.

QueryPremarket waka, 4:00-9:29 am ET: last premarket print vs Wednesday close, and di open wey follow
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

KLAC last premarket print stand +8.49% over Wednesday close and e open +8.14%; LRCX run +9.64% enter +9.67% open; META print -3.16% and 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, the heaviest premarket volume of the six and the smallest move (premarket and after-hours trading).

E get catalyst? Our data no show any

Recap suppose talk wetin move stock. Here our tables no name anything: the news feed and SEC filing index both empty for the four names wey gap hardest.

QueryNamed catalysts wey dey file: news articles and SEC filings per name, Wednesday close through Thursday own
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

0 overnight articles, 0 intraday, 0 SEC filings for KLAC — the same empty row for LRCX, TER and WDC. NVDA, wey never gap, carry the heaviest coverage of the nine (7 overnight, 9 intraday) and close red. Dis na one feed attention, no be world media, and absent row no be proof say event absent — but nothing for our data name a cause, and "cause unknown" na complete answer.

Di scoreboard

Every change dey compare July 9 last regular-session minute bar wit Wednesday own; rows dey alphabetical, so each ETF keep im fixed position.

QuerySPY / QQQ / DIA / IWM — July 9 vs July 8 close, regular hours
The exact SQL behind every number
WITH prior AS (
    SELECT ticker, argMax(close, window_start) AS prior_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-07-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

All four close green. QQQ lead for +1.67% — na +0.99% gap plus +0.68% climb; small-cap IWM collect +1.29%, SPY +0.85% to $751.64, DIA dey back for +0.29%. Growth dey front, di Dow dey back.

Di day bin dey unusual?

For di index level, e no be so: QQQ im +1.67% close-over-close rank na 10 out of 21 trailing sessions by size, SPY im open-to-close na 8 out of 22. Di drama bin dey between di day groups.

QuerySPY / QQQ day move for trailing context (~22 sessions)
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
    )
)

Breadth: di session wey wide pass for di week

QueryLiquid-tape breadth: July 9 advancer share vs July 8, $1M-traded filter
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
)

4263 advancers against 1631 decliners — na advancer share of 71.5% after 29.6% for Wednesday, same calculation, same $1M-traded filter (5385 of 11351 names dey fall below am). Against di rest of di week:

QueryDi week so far: index moves and advancer share for each session wey don complete
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

Monday start with 62.4% advancers, Tuesday and Wednesday sink go 33.9% and 29.6%, and Thursday own 71.4% na di highest for di four sessions wey don complete for di week (Friday July 10 dey after dis recap). QQQ follow di same pattern: -1.82% Tuesday, 0.25% Wednesday, +1.67% Thursday.

Beyond di chips: how di rest of di market trade

Breadth show sey most stocks rise; e no mean sey di rally spread equal. Below: na equal-weighted basket of three liquid names per sector, di same basket wey dem declare every day.

QueryEight declared sector baskets, three names each: July 9 close-over-close, equal-weighted
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

Semiconductors lead at +4.24%, Energy dey back at -2.01% — na -6.25-point spread (gap_to_best_sector_pct). Financials na di 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 muted +0.17%. Di day biggest open-to-close reversal, META +8.1% swing, dey outside all eight baskets; inside dis one, MSFT -2.25% open into a +0.33% close na di sharpest round trip.

Di semiconductor open, and di fade wey follow

gap_pct na di open against Wednesday close; intraday_pct na di rest of di day. Rows dey alphabetical.

QueryFourteen chip names: gap at di open vs di rest of di day, July 9
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

KLAC open +8.14% above Wednesday close, den give back -3.98%; LRCX open +9.67% and fade -3.26%; TER (+7.87%) and WDC (+7.89%) follow di same shape. MU gap +7.07%, slide -2.56%, still close +4.33% on 33.56B — di heaviest name for di tape for second session (Wednesday recap get di first one). AMD and SNDK be di exceptions: AMD add 1.75% after +3.87% open to finish +5.68%, and SNDK, wey don already dey +6.14% for open, add anoda 1.23% to close +7.45%. And NVDA: +0.16% open — no gap — enter -0.68% close.

QueryReceipts: July 9 green/red counts across di fourteen names, and NVDA two-day turn
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
)

12 out of di fourteen close green; di 2 red closes be di inverse wrapper — structural on up day — and NVDA at -0.68%, one day after closing +3.66%. Di biggest chip name for di tape sidon for im own sector celebration while e carry im heaviest news coverage.

Di oda side: mega-caps open for down but dem climb back

QueryEight mega-caps and defensives: gap at di open vs di rest of di day, July 9
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

Seven out of di eight open below Wednesday close; wetin happen next na im separate dem. META open -3.16% down and climb +8.1% go reach 4.69% close — na di strongest open-to-close reversal for di page. MSFT open -2.25% down and recover go +0.33%; AMZN (+1.4%) and AAPL (+0.93%) follow di same pattern; TSLA no gap at all and climb go +3.21%. Di names wey stay down no be growth: GOOGL (-0.76%), CVX (-1.06%), JNJ (-1.62%). Why stocks dey gap overnight dey explain di mechanic.

Where the money trade

QueryTop 6 by dollars traded, top 4 by shares traded — July 9 regular hours
The exact SQL behind every number
SELECT leaderboard, ticker, dollar_volume_bn, shares_m,
    round(1000 * dollar_volume_bn / shares_m, 2) AS implied_avg_price,
    round(100 * if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)
        / max(if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)) OVER (PARTITION BY leaderboard), 1) AS pct_of_board_leader
FROM (
    SELECT
        'by dollars traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-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

MU na im still dey top the dollar board with 33.56B, e pass SPY (24.37B), NVDA (21.28B) and SNDK (20.59B) — memory stock dey inside two of the top four slots. The shares board na different market: SOXS lead with 558.1M shares, implied price na $3.91 (relative volume).

QueryShares per 30-minute ET bucket, regular hours, with % of di day biggest bucket
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(sum(toFloat64(volume)) / 1e9, 2) AS shares_bn,
    round(100 * sum(toFloat64(volume)) / max(sum(toFloat64(volume))) OVER (), 1) AS pct_of_biggest_bucket
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-07-09 13:30:00' AND window_start < '2026-07-09 20:00:00'
GROUP BY et_time
ORDER BY et_time

Na textbook U shape: the open bucket run 1.79B shares (91.4% of the biggest), the midday trough na 0.64B, and the closing auction half-hour be the day biggest at 1.96B. Even for day wey dem make am for open, the volume still finish for close.

Di options tape

QueryOptions tape: prints, contracts, call %, 0DTE share vs Wednesday, top contracts
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'

Di tape carry 9.99M prints and 58.85M contracts — e dey under Wednesday 63.26M — calls na 58% of volume, di 0DTE share drop go 28.7% from 38.7%. Di three contracts wey busy pass na all same-day SPY calls — di 751C (846.6K contracts, average $0.526), di 752C and di 750C — na ladder wey dey around SPY $751.64 close (0DTE options cover di product).

Hedge or bet? Hedge dey buy strikes wey far from di money; bet dey buy di side wey e want.

QuerySPY same-day (0DTE) options: contracts by strike distance from di closing price
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)

Di same-day tape siddon for di money: 3768.9k calls and 2563.3k puts inside half percent of di close (59.5% calls). Di wings split by direction — below di close, 1356.5k puts against 255.4k calls (1.2% call share deeper down); above am, calls carry 91.6% of one far thinner 29.1k bucket. Di wing volume siddon for downside strikes, where dem dey buy protection: na at-the-money ladder, no be upside one.

Di quote tape

QueryStocks NBBO update count: July 9 vs July 8, with named-ticker updates (millions)
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'

Di quietest fact of di day: 383.44M NBBO updates for di stock tape, -27.7% compared to Wednesday. Di wahala dey inside price levels, no be for di touch churn. QQQ lead di named tickers with 4.35M, pass SPY own wey be 2.71M and NVDA own wey be 1.83M.

QuerySPY / QQQ / NVDA / TSLA / MU / SNDK / AVGO: RTH median quoted spread in basis points
The exact SQL behind every number
SELECT
    ticker,
    round(quantileExact(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000), 2) AS median_spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'NVDA', 'TSLA', 'MU', 'SNDK', 'AVGO')
  AND sip_timestamp >= '2026-07-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

SPY median quoted spread print 0.27 bps, QQQ 0.42, NVDA 0.99 — na normal numbers. Di wider tail: MU na 4.23 bps, SNDK na 8.79 bps (di bid-ask spread na di cost wey dis one dey measure).

QuerySPY RTH average quoted spread for trailing-month context
The exact SQL behind every number
SELECT
    round(anyIf(avg_spread_cents, d = toDate('2026-07-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
)

SPY average quoted spread of 2.071 cents rank 10 out of 22 trailing sessions, inside a 1.8092.865 cent range: no stress for di quote, even for dat open.

QueryOptions NBBO tape: total updates vs di stock tape, plus di SPY root slice
The exact SQL behind every number
WITH
    (SELECT count() FROM global_markets.cache_options_quotes WHERE sip_timestamp >= '2026-07-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

Di options-quote tape carry 6.9 billion NBBO updates — 18× di stock tape, di SPY root alone na 242M.

Rates: di July 9 print

QueryTreasury print status: July 9 rows wey dey record, and di July 8 curve (latest at authoring)
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'

Di July 9 treasury print don land afta we finish write, following di normal delay for di daily yield file — 1 row dey record now. Di curve for dat day (2026-07-09): 2-year na 4.16%, 10-year na 4.54%, 30-year na 5.05%, 2s10s na 0.38 points — di 2-year dey ease from July 8 mark while di long end just stand gidigba.

Di calendar wey dey behind di day

QueryEx-divs, splits, SEC filings, news attention
The exact SQL behind every number
WITH
    (
        SELECT (count(), uniqExact(publisher))
        FROM global_markets.stocks_news
        WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-07-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

One normal calendar under one open wey no normal: 127 ex-dividend records, 5 reverse splits, 1 forward split, 2979 SEC filings (623 Form 4s, 605 424B2s, 149 8-Ks). Di feed run 184 articles across 3 publishers; di ticker wey dem cover pass na NVDA, 20 articles, 8 clear from di next name.

Wetin dey next

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

QueryOn deck: di next session, im ex-dividend slate, di SPY expiry ladder, and di short-interest clock
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) AS latest_short_settlement,
    (SELECT count() FROM global_markets.stocks_short_interest WHERE settlement_date = '2026-07-15') 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'
)

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

Di session, wey dem verify

QuerySession verification: first/last SPY bar ET, regular-bar count, holiday receipts, next closure
The exact SQL behind every number
SELECT
    formatDateTime(min(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS first_spy_bar_et,
    formatDateTime(max(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS last_spy_bar_et,
    count() AS spy_minute_bars,
    countIf(window_start >= '2026-07-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'

Full ordinary session: first SPY bar na 04:00 ET, last na 19:59 ET, 390 regular minute bars, no holiday row. Next closure: 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 up. Chip-equipment names gap up and fade; mega-caps gap down and recover.

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

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

Why NVDA fall while the chip sector rally?

NVDA close -0.68% while 12 of fourteen chip names close green. E no gap at all (0.16% at open) and na im be the most-covered ticker with 20 articles — co-occurrence dey for record, but cause no dey this data.

July 9, 2026 be unusual day for the market?

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

Data notes

Regular hours na 13:3020:00 UTC (9:30 am–4:00 pm ET); di premarket panel dey use 08:00–13:30 UTC. Di eight sector baskets dem curate and equal-weight — three liquid names each, every ticker dey listed for dat panel SQL inside. Dat one na declared method, e no be vendor classification: three names dey speak for demsef, dem no dey speak for whole sector. Di catalyst panel dey count only our news feed and di EDGAR index.

Full data notes

Per-ticker panels dey follow alphabetical order, so each prose reference dey point at one fixed row; leaderboards dey value-ordered, every positional claim get im boundary. Di treasury print and di mid-July short-interest settlement dey bounded to zero rows — dem arrival dey hold dis post for rewrite.

How We Dey Do Am

  • Where We Dey Get Data: each panel SQL dey name im own tables — minute aggregates, di stock and options NBBO caches, options trades, our news feed, di EDGAR index, dividends, short interest, holidays, treasury yields.
  • How We Dey Arrange Am: raw UTC literals dey inside WHERE, ET labels dey only for SELECT; gap na first regular bar im open ÷ prior regular close − 1; prior-session and prior-week figures dem dey compute inside di query, dem no dey carry am from any earlier post. Warehouse as-of July 13, 2026.