Strasmore Research
Market Recap Matt ConnorBy Matt Connor · Updated 2026-07-26

Market Recap: July 9, 2026, The Day in Numbers

Chip equipment gapped up hard and faded, mega-caps gapped down and ripped back, the tape flipped decisively green, and NVDA sat it out, closing red.

Thursday, July 9, 2026 packed its violence into one minute, and that minute came before the opening bell. Chip-equipment names were already far above Wednesday's close in premarket trade, while META sat -3.16% below it; the 9:30 print ratified both. The day then partly unwound its own open: the chip gaps faded, META climbed all the way back, and the tape finished 71.5% green, the broadest session of the week. NVDA, green through Tuesday's rout, closed red. Every number below is read from a stored query.

What set up the open

The gaps were not made at 9:30. Between 4:00 am and 9:29 am ET the premarket tape had already repriced these names, and the opening print landed on that level.

QueryPremarket path, 4:00-9:29 am ET: last premarket print vs Wednesday's close, and the open that followed
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 this yourself

KLAC's last premarket print stood +8.49% over Wednesday's close and it opened +8.14%; LRCX ran +9.64% into a +9.67% open; META printed -3.16% and opened -3.16%. Read open_vs_premkt_pct: all six opened within one percent of their last premarket price. NVDA is 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).

Was there a catalyst? Our data names none

A recap should say what moved a stock. Here our tables name nothing: the news feed and the SEC filing index are both empty for the four names that gapped hardest.

QueryNamed catalysts on file: news articles and SEC filings per name, Wednesday's close through Thursday's
tickerovernight_articlessession_articlessec_filingsfilings_8k
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 this yourself

0 overnight articles, 0 intraday, 0 SEC filings for KLAC, the same empty row for LRCX, TER and WDC. NVDA, which never gapped, carried the heaviest coverage of the nine (7 overnight, 9 intraday) and closed red. This is one feed's attention, not the world's media, and an absent row is not proof of an absent event, but nothing in our data names a cause, and "cause unknown" is a complete answer.

The scoreboard

Every change compares July 9's last regular-session minute bar with Wednesday's; rows are alphabetical, so each ETF keeps a fixed position.

QuerySPY / QQQ / DIA / IWM: July 9 vs the 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 this yourself

All four closed green. QQQ led at +1.67%, a +0.99% gap plus a +0.68% climb; small-cap IWM took +1.29%, SPY +0.85% to $751.64, DIA trailed at +0.29%. Growth in front, the Dow in back.

Was the day unusual?

At the index level, no: QQQ's +1.67% close-over-close ranked 10 of 21 trailing sessions by size, SPY's open-to-close 8 of 22. The drama sat between the day's groups.

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

Breadth: the broadest session of the week

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

4263 advancers against 1631 decliners, an advancer share of 71.5% after 29.6% on Wednesday, same computation, same $1M-traded filter (5385 of 11351 names fall below it). Against the rest of the week:

QueryThe week so far: index moves and advancer share for each completed session
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 this yourself

Monday started at 62.4% advancers, Tuesday and Wednesday sank to 33.9% and 29.6%, and Thursday's 71.4% is the highest of the week's four completed sessions (Friday July 10 postdates this recap). QQQ traced it too: -1.82% Tuesday, 0.25% Wednesday, +1.67% Thursday.

Beyond the chips: how the rest of the market traded

Breadth says most stocks rose; it does not say the rally was even. Below: an equal-weighted basket of three liquid names per sector, the same declared basket every day.

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

Semiconductors led at +4.24%, Energy trailed at -2.01%, a -6.25-point spread (gap_to_best_sector_pct). Financials were the strongest non-chip basket at +1.88%; Staples (-0.91%), Utilities (-0.96%) and Energy closed red. Big tech (AAPL, MSFT and GOOGL) averaged a muted +0.17%. The day's largest open-to-close reversal, META's +8.1% swing, sits outside all eight baskets; inside this one, MSFT's -2.25% open into a +0.33% close was the sharpest round trip.

The semiconductor open, and the fade that followed

gap_pct is the open against Wednesday's close; intraday_pct is the rest of the day. Rows are alphabetical.

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 this yourself

KLAC opened +8.14% above Wednesday's close, then gave back -3.98%; LRCX opened +9.67% and faded -3.26%; TER (+7.87%) and WDC (+7.89%) traced the same shape. MU gapped +7.07%, slid -2.56%, still closed +4.33% on 33.56B, the tape's heaviest name for a second session (Wednesday's recap has the first). AMD and SNDK were the exceptions: AMD added 1.75% after a +3.87% open to finish +5.68%, and SNDK, already +6.14% at the open, added another 1.23% to close +7.45%. And NVDA: a +0.16% open, no gap, into a -0.68% close.

QueryReceipts: July 9 green/red counts across the fourteen names, and NVDA's two-day turn
jul9_greenjul9_redjul8_greennvda_jul9_pctnvda_jul8_pctnames_counted
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 this yourself

12 of the fourteen closed green; the 2 red closes were the inverse wrapper, structural on an up day, and NVDA at -0.68%, a day after closing +3.66%. The tape's biggest chip name sat out its own sector's celebration while carrying its heaviest news coverage.

The other side: mega-caps opened down and climbed 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 this yourself

Seven of the eight opened below Wednesday's close; what followed separates them. META opened -3.16% down and climbed +8.1% to a 4.69% close, the most violent open-to-close reversal on the page. MSFT opened -2.25% down and recovered to +0.33%; AMZN (+1.4%) and AAPL (+0.93%) traced it too; TSLA never gapped and climbed to +3.21%. The names that stayed down were not growth: GOOGL (-0.76%), CVX (-1.06%), JNJ (-1.62%). Why stocks gap overnight walks the mechanic.

Where the money traded

QueryTop 6 by dollars traded, top 4 by shares traded: July 9 regular hours
leaderboardtickerdollar_volume_bnshares_mimplied_avg_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 this yourself

MU topped the dollar board again at 33.56B, over SPY (24.37B), NVDA (21.28B) and SNDK (20.59B), memory in two of the top four slots. The shares board is a different market: SOXS led at 558.1M shares, implied price $3.91 (relative volume).

QueryShares per 30-minute ET bucket, regular hours, with % of the day's biggest bucket
et_timeshares_bnpct_of_biggest_bucket
09:301.7991.4
10:001.471.3
10:301.0955.7
11:000.9548.4
11:300.8241.9
12:000.7538
12:300.6432.8
13:000.6432.8
13:300.6633.7
14:000.7136.1
14:300.7437.8
15:000.8443.1
15:301.96100
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
Run this yourself

A textbook U: the open bucket ran 1.79B shares (91.4% of the biggest), the midday trough 0.64B, and the closing auction half-hour was the day's biggest at 1.96B. Even on a day made at its open, the volume finished at 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_undtop1_striketop1_typetop1_contracts_ktop1_avg_pxtop1_is_0dtetop2_undtop2_striketop2_typetop2_is_0dtetop3_undtop3_striketop3_typetop3_is_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 this yourself

The tape carried 9.99M prints and 58.85M contracts, under Wednesday's 63.26M, calls at 58% of volume, the 0DTE share down to 28.7% from 38.7%. The three busiest contracts were all same-day SPY calls, the 751C (846.6K contracts, average $0.526), the 752C and the 750C, a ladder around SPY's $751.64 close (0DTE options covers the product).

Hedge or bet? A hedge buys strikes away from the money; a bet buys the side it wants.

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 this yourself

The same-day tape sat at the money: 3768.9k calls and 2563.3k puts within half a percent of the close (59.5% calls). The wings split by direction, below the close, 1356.5k puts against 255.4k calls (1.2% call share deeper down); above it, calls took 91.6% of a far thinner 29.1k bucket. The wing volume sat on downside strikes, where protection is bought: an at-the-money ladder, not an 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 this yourself

The quietest fact of the day: 383.44M NBBO updates on the stock tape, -27.7% versus Wednesday. The violence lived in price levels, not in churn at the touch. QQQ led the named tickers at 4.35M, over SPY's 2.71M and NVDA's 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 this yourself

SPY's median quoted spread printed 0.27 bps, QQQ 0.42, NVDA 0.99, ordinary numbers. The wider tail: MU at 4.23 bps, SNDK at 8.79 bps (the bid-ask spread is the cost this measures).

QuerySPY's RTH average quoted spread in trailing-month context
jul9_avg_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 this yourself

SPY's average quoted spread of 2.071 cents ranked 10 of 22 trailing sessions, inside a 1.8092.865 cent range: no stress in the quote, even at that open.

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 this yourself

The options-quote tape carried 6.9 billion NBBO updates, 18× the stock tape, the SPY root alone at 242M.

Rates: the July 9 print

QueryTreasury print status: July 9 rows on record, and the July 8 curve (latest at 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 this yourself

The July 9 treasury print landed after authoring, on the daily yield file's usual lag, 1 row now on record. 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 easing off July 8's mark while the long end held.

The calendar behind the day

QueryEx-divs, splits, SEC filings, news attention
ex_dividend_recordssplits_executedreverse_splitsforward_splitsfil_424b2fil_form4fil_8kfil_totalnews_articlesnews_publisherstop_news_tickertop_news_ntop_news_lead_over_nexttop_news_is_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 this yourself

A routine calendar under an unroutine open: 127 ex-dividend records, 5 reverse splits, 1 forward split, 2981 SEC filings (623 Form 4s, 606 424B2s, 149 8-Ks). The feed ran 184 articles across 3 publishers; most-covered ticker NVDA, 20 articles, 8 clear of the next name.

On deck

From our own tables, facts about the next session, not forecasts.

QueryOn deck: the next session, its 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 this yourself

The next session is 2026-07-10, 0 holiday rows against it: a normal Friday. 153 companies go ex-dividend that morning, 0 from our household-name checklist. Friday's SPY expiry is the heaviest forward one already traded, 1.66M contracts on July 9 versus 0.57M against the July monthly. Short-interest clock: latest settlement on file 2026-06-15, 0 rows yet filed for mid-July, FINRA publishes about eight business days after settlement (why short interest is two weeks old).

The session, verified

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 this yourself

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

FAQ

What happened in the stock market on July 9, 2026?

Every index ETF closed higher, QQQ +1.67%, IWM +1.29%, SPY +0.85%, DIA +0.29%, 71.5% of liquid stocks up. Chip-equipment names gapped up and faded; mega-caps gapped down and recovered.

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

Our data names no reason: no article and no SEC filing for KLAC, LRCX, TER or WDC from Wednesday's close through Thursday's. The move was already priced premarket, before 9:30 am ET.

Why did NVDA fall while the chip sector rallied?

NVDA closed -0.68% while 12 of fourteen chip names closed green. It never gapped (0.16% at the open) and was the most-covered ticker at 20 articles, co-occurrence on the record, cause not in this data.

Was July 9, 2026 an unusual day for the market?

Not at the index level: QQQ's move ranked 10 of 21 trailing sessions by size, SPY's average spread 10 of 22. The dispersion underneath was: -6.25 points between best and worst sector basket.

Data notes

Regular hours are 13:3020:00 UTC (9:30 am–4:00 pm ET); the premarket panel uses 08:00–13:30 UTC. The eight sector baskets are curated and equal-weighted, three liquid names each, every ticker listed in that panel's SQL. That is a declared method, not a vendor classification: three names speak for themselves, not for a whole sector. The catalyst panel counts our news feed and the EDGAR index only.

Full data notes

Per-ticker panels are alphabetical, so each prose reference points at a fixed row; leaderboards are value-ordered, every positional claim bounded. The treasury print and the mid-July short-interest settlement are bounded to zero rows, their arrival holds this post for a rewrite.

Methodology

  • Sources: each panel's SQL names its own tables, minute aggregates, the stock and options NBBO caches, options trades, our news feed, the EDGAR index, dividends, short interest, holidays, treasury yields.
  • Conventions: raw UTC literals in WHERE, ET labels only in SELECT; gap = first regular bar's open ÷ prior regular close − 1; prior-session and prior-week figures computed in-query, never carried from an earlier post. Warehouse as-of July 13, 2026.