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

Market Recap: Week of July 6, 2026

A chip rout, a bounce, the summer's wildest open, and NVDA's Friday — netting out to a quiet index week where most stocks fell and MU out-traded SPY itself.

The week of July 6, 2026 was a semiconductor whipsaw wearing a calm index costume. Inside five sessions: a chip rout, a chip bounce, the most violent open of the summer, and NVDA's Friday reclamation — and the scoreboard nets it all out to SPY +1.4%. Two facts tell the real story: MU printed more dollar volume than SPY itself across the week, and more liquid stocks fell than rose in a week the growth index gained 1.8%. Every number is read from a stored query — expand any panel for the SQL.

The week on the board

Weekly changes run from the prior week's final regular-session close (Thursday July 2 — July 3 was the Independence Day closure) to Friday July 10's close. Rows are alphabetical.

QuerySPY / QQQ / DIA / IWM — week of July 6 vs the July 2 close, with the prior week's change
The exact SQL behind every number
SELECT ticker,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-02') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS prior_week_close,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-07-06') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS week_close,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-07-06') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
         / argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-02') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS week_change_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-02') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
         / argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS prior_week_change_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
  AND window_start >= '2026-06-22 13:30:00' AND window_start < '2026-07-10 20:00:00'
GROUP BY ticker
ORDER BY ticker

The split is the story: QQQ +1.8% and SPY +1.4% against DIA -0.4% and IWM -0.5%. Growth carried everything; the Dow and the small-cap index finished a green-index week red. Whatever this week was, it was not broad.

The week against the trailing year

QuerySPY's week in trailing-year context (open-to-close weekly returns, ~53 weeks)
The exact SQL behind every number
SELECT round(anyIf(ret, wk = toDate('2026-07-06')), 2) AS week_open_to_close_pct,
       arrayCount(x -> x > anyIf(ret, wk = toDate('2026-07-06')), groupArrayIf(ret, wk != toDate('2026-07-06'))) + 1 AS rank_best,
       count() AS weeks_compared,
       toString(min(wk)) AS first_week,
       anyIf(sessions, wk = toDate('2026-07-06')) AS sessions_this_week
FROM (
    SELECT toStartOfWeek(toDate(toTimeZone(window_start, 'America/New_York')), 1) AS wk,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2025-07-06 00:00:00')
      AND window_start < toDateTime('2026-07-11 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY wk
    HAVING sessions >= 3
)

Measured open-to-close, SPY's week ranked 20 of 53 trailing weeks — squarely mid-pack. A week containing the summer's most dramatic single open (Thursday) and its sharpest sector rout (Tuesday) lands in the middle of the trailing-year table: the violence canceled itself out. Ordinary is a valid result — and here it is the finding.

Five sessions, one arc

QuerySPY by session — close, change, and share volume, July 6-10
The exact SQL behind every number
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
    round(argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS spy_close,
    round((argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / any(prev) - 1) * 100, 1) AS change_pct,
    round(toFloat64(sum(volume)) / 1e6, 1) AS spy_shares_m
FROM global_markets.delayed_stocks_minute_aggs
INNER JOIN (
    SELECT d, lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-07-02 00:00:00') AND window_start < toDateTime('2026-07-11 00:00:00')
        GROUP BY d
    )
) AS p ON toDate(toTimeZone(window_start, 'America/New_York')) = p.d
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-07-06 00:00:00') AND window_start < toDateTime('2026-07-11 00:00:00')
GROUP BY et_date
ORDER BY et_date

The arc, session by session: Monday reopened from the holiday with a growth-led gap up (+0.9%, recap); Tuesday the semiconductor complex broke — TER and INTC near −10% — while the index gave back only -0.5% (recap); Wednesday the chips bounced hard and the index sat still (-0.3%, recap); Thursday the whole tape flipped green on the summer's wildest open (+0.8%, recap); Friday NVDA led a quiet finish (+0.4%, recap) to a $754.9 close.

Breadth: a green week where most stocks fell

QueryWeekly breadth: July 10 close vs July 2 close, names with $5M+ traded during the week
The exact SQL behind every number
SELECT
    countIf(cw > cp AND cp > 0 AND dv >= 5000000) AS advancers,
    countIf(cw < cp AND cp > 0 AND dv >= 5000000) AS decliners,
    countIf(cp > 0 AND cw > 0 AND dv >= 5000000) AS measured_names,
    round(100.0 * countIf(cw > cp AND cp > 0 AND dv >= 5000000) / countIf(cp > 0 AND cw > 0 AND dv >= 5000000), 1) AS advancer_pct
FROM (
    SELECT ticker,
           toFloat64(argMaxIf(close, window_start, window_start < '2026-07-03 00:00:00')) AS cp,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-10 13:30:00')) AS cw,
           sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-06 13:30:00') AS dv
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ((window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00')
        OR (window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-11 00:00:00'))
    GROUP BY ticker
)

Across 6319 names with at least $5M traded during the week, 3270 fell against 3015 that rose — an advancer share of just 47.7% in a week the growth index gained 1.8%. The index's green week was manufactured by its largest members; the median stock had a red one. That is the same narrowness the Friday recap caught in a single session, compounded across five.

The tape's leader: MU out-traded the index. For a week.

QueryTop names by regular-hours dollar volume, full week July 6-10
The exact SQL behind every number
SELECT ticker,
       round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS week_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-10 20:00:00'
  AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
  AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY week_dollar_bn DESC
LIMIT 6

MU printed 164B of regular-hours dollar volume across the five sessions — ahead of SPY's 137.3B. A single memory stock out-trading the S&P 500 ETF for an entire week echoes its June performance (MU's June deep-dive measured that month's reign); NVDA (107.1B) and SNDK (88B) put two more memory-complex names in the week's top five. The whipsaw wasn't just price — it was where the market's money spent the whole week arguing. And on Friday the argument gained a participant: SK Hynix's US listing began trading — a 28.1B raise, the year's second-largest after SpaceX — and printed 18.03B of regular-hours dollars in its first session, instantly one of the week's heaviest tickers. The memory complex that dominated this week's tape now has one more listed member; Friday's recap carries the full debut receipts.

QueryFriday's debut, receipted: SK Hynix's raise and first-session dollars
The exact SQL behind every number
SELECT
    (SELECT round(total_offer_size / 1e9, 1) FROM global_markets.stocks_ipos
     WHERE issuer_name = 'SK Hynix Inc' AND listing_date = '2026-07-10') AS raised_bn,
    round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-10 13:30:00' AND window_start < '2026-07-10 20:00:00') / 1e9, 2) AS rth_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SKHYV' AND window_start >= '2026-07-10 04:00:00' AND window_start < '2026-07-11 00:00:00'

The whipsaw's net result: same complex, opposite weeks

The fourteen chip names that drove every one of the week's stories, measured across the whole week — July 2's close to July 10's. Rows are alphabetical.

QueryThe chip complex's full-week change — July 10 close vs July 2 close, fourteen names
The exact SQL behind every number
SELECT ticker,
       round((cw / cp - 1) * 100, 1) AS week_pct
FROM (
    SELECT ticker,
           toFloat64(argMaxIf(close, window_start, window_start < '2026-07-03 00:00:00')) AS cp,
           toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-10 13:30:00' AND window_start < '2026-07-10 20:00:00')) AS cw
    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-02 13:30:00' AND window_start < '2026-07-02 20:00:00')
        OR (window_start >= '2026-07-10 13:30:00' AND window_start < '2026-07-10 20:00:00'))
    GROUP BY ticker
)
ORDER BY ticker

After a rout, a bounce, a monster open, and a Friday rally, the complex did not travel together — it split down the middle. AVGO (+11%), STX (+11%), SNDK (+9.9%), NVDA (+8.5%), and WDC (+8.1%) finished with big green weeks; INTC (-8.8%) had a brutal one, and the equipment names that starred in Thursday's giant gaps — KLAC (-1.8%), LRCX (-0.3%) — round-tripped to roughly flat. And the punchline: MU, the name that out-traded the S&P 500 ETF all week, netted +0.3%. 164 billion dollars changed hands to move the price almost nowhere — the purest picture of a market arguing with itself at maximum volume.

The shorts: one truncated file inside an otherwise complete week

QueryDaily short-volume file coverage — tickers on file and total short shares, July 6-10
The exact SQL behind every number
SELECT toString(date) AS d,
       uniqExact(ticker) AS tickers_on_file,
       round(sum(short_volume) / 1e9, 2) AS short_shares_bn
FROM global_markets.stocks_short_volume
WHERE date >= '2026-07-06' AND date <= '2026-07-10'
GROUP BY date
ORDER BY date

Four of the five daily short-volume files arrived complete, at roughly 15384 tickers each. Tuesday July 7's file carries only 4333 — less than a third of its neighbors — with total short shares (1.81B vs ~4.62B on complete days) shrunk to match. The same truncation pattern hit the June 29 file (documented in that week's recap), and July 7 was, of all days, the rout day. Treat any per-ticker short-volume claim about July 7 as unverifiable until the file is refiled; daily short volume is a flow metric and this is exactly the failure mode it inherits from its source files.

The options week: the same-day crowd breathed with the calendar

QueryOptions contracts and 0DTE share by session, July 6-10
The exact SQL behind every number
SELECT toDate(sip_timestamp) AS d,
       round(toFloat64(sum(size)) / 1e6, 1) AS contracts_m,
       round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = formatDateTime(toDate(sip_timestamp), '%y%m%d')) / sum(size), 1) AS pct_0dte
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-11 00:00:00'
GROUP BY d
ORDER BY d

Contract volume held between 58.9M (Thursday, the week's lightest) and 65.6M on Friday, the week's heaviest. The 0DTE share told the calendar's story: it sagged to 28.7% on Thursday — a session with no major expiry pull — and jumped to 48.7% on Friday as the weeklies expired, the rhythm the expiration calendar predicts. Same-day trading is a standing fraction of this market, but the calendar still decides how big the fraction gets.

Rates: drifting up, two prints in transit

QueryTreasury curve: July 8 print (latest in-week on file) vs the July 2 print, plus pending receipts
The exact SQL behind every number
SELECT
    round((toFloat64(anyIf(yield_2_year, date = '2026-07-08')) - toFloat64(anyIf(yield_2_year, date = '2026-07-02'))) * 100) AS chg_2y_bp,
    round((toFloat64(anyIf(yield_10_year, date = '2026-07-08')) - toFloat64(anyIf(yield_10_year, date = '2026-07-02'))) * 100) AS chg_10y_bp,
    round((toFloat64(anyIf(yield_30_year, date = '2026-07-08')) - toFloat64(anyIf(yield_30_year, date = '2026-07-02'))) * 100) AS chg_30y_bp,
    round(toFloat64(anyIf(yield_10_year, date = '2026-07-08')), 2) AS y10_jul8_pct,
    round(toFloat64(anyIf(yield_30_year, date = '2026-07-08')), 2) AS y30_jul8_pct,
    (SELECT count() FROM global_markets.treasury_yields WHERE date IN ('2026-07-09', '2026-07-10')) AS jul9_jul10_print_rows
FROM global_markets.treasury_yields
WHERE date IN ('2026-07-02', '2026-07-08')

Through the week's latest landed print (July 8), the curve drifted up in near-parallel from the prior week's close: 2-year +7 bp, 10-year +7 bp to 4.56%, 30-year +8 bp to 5.06% — no twist, just level. The July 9 and 10 prints were still in transit at authoring (0 rows between them, bounded to zero as this page's tripwire): when they land, this section gets the week's true endpoint.

The calendar behind the week

QueryThe week's corporate calendar: filings, dividends, splits, news
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= '2026-07-06' AND filing_date <= '2026-07-10') AS filings_week,
    (SELECT count() FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-10') AS filings_friday,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-06' AND ex_dividend_date <= '2026-07-10') AS ex_dividends_week,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-06' AND execution_date <= '2026-07-10') AS reverse_splits_week,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-06' AND execution_date <= '2026-07-10') AS forward_splits_week,
    (SELECT count() FROM global_markets.stocks_news WHERE toDate(toTimeZone(published_utc, 'America/New_York')) >= '2026-07-06'
        AND toDate(toTimeZone(published_utc, 'America/New_York')) <= '2026-07-10') AS news_week

15165 SEC filings, 558 ex-dividend records, 30 reverse and 8 forward splits, 981 news articles. One receipt inside that filings total: Friday July 10's daily index contributes 0 — the EDGAR file for the week's last day had not been ingested at authoring (a known lag pattern; dissected here), so the weekly total is bounded as a floor and this page is held for a rewrite when Friday's file lands.

The sessions, verified

QuerySession verification: five sessions, no holiday, next scheduled closure
The exact SQL behind every number
SELECT
    uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions_in_week,
    toString(min(toDate(toTimeZone(window_start, 'America/New_York')))) AS first_session,
    toString(max(toDate(toTimeZone(window_start, 'America/New_York')))) AS last_session,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date >= '2026-07-06' AND date <= '2026-07-10') AS holiday_rows_in_week,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-10' AND status = 'closed') AS next_closure_date,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-10' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
  AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-10 20:00:00'
  AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199

5 full sessions, 2026-07-06 through 2026-07-10, no holiday rows in the window — the first five-session week since mid-June's. Next scheduled closure: Labor Day on 2026-09-07.

Data notes

All timestamps are UTC; regular hours are 13:30-20:00 UTC per session, and week boundaries run from the prior week's final regular-session close (July 2 — the prior week was holiday-shortened) to July 10's close. The weekly trailing rank uses OPEN-to-close weekly returns (the convention its trailing distribution is built on), so its weekly figure differs by construction from the close-to-close scoreboard number — both are labeled. Weekly breadth compares each name's July 2 close with its July 10 close over a $5M-traded-in-week filter. Prior-week comparisons are computed in-query, never quoted from earlier posts. Two arrival tripwires are bounded to zero: the July 9/10 treasury prints, and Friday's EDGAR daily index inside the weekly filings total.

Methodology

  • Market data source: consolidated tape — delayed_stocks_minute_aggs for prices and volumes, options_trades for the options week.
  • Time zone handling: stored timestamps are UTC; ET labels via toTimeZone(...) in SELECT lists; WHERE clauses use raw UTC literals (with the ET-clock band for multi-session RTH filters).
  • Deterministic aggregates: tuple-keyed tie-breaks; positional prose claims encoded as sanity bounds.
  • Warehouse as-of date: July 12, 2026 (T+2 for the week's final session); equity and options-trade tapes fully ingested, with treasury and Friday-EDGAR receipts marking what is still in transit.

Cross-links: the five dailies — Monday, Tuesday, Wednesday, Thursday, Friday — plus MU's June deep-dive, when do options expire, and the prior week's recap.