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

Market Recap: July 6, 2026, Di Day In Numbers

Back from Independence Day break: growth-led gap up, sector split wey pass di index move several times, reverse-split wall, and di month tightest quotes.

Monday, July 6, 2026, na di first session wey dey come back from Independence Day weekend, e open with gap up wey growth stocks lead, and e hold am. QQQ close 1.39% against DIA 0.42%, na di mirror of Thursday wey rotation happen, and breadth dey run green: 3861 liquid names dey rise against 2242. Most of di move na di reopening gap, wey dem price for di tightest index quote of di trailing month. Every number wey dey below, dem read am from stored query.

Di scoreboard

Di changes dey compare July 6's last regular-session minute bar with Thursday July 2's, one market holiday back.

QuerySPY / QQQ / DIA / IWM: July 6 vs di July 2 close, regular hours
tickerprior closeday openday closegap pctintraday pctpct changeday highday lowshares traded m
DIA527.83528.72530.030.170.250.42530.03525.852.8
IWM297.53297.75298.880.070.380.45300.41297.6217.1
QQQ712.74719.93722.631.010.381.39726.08718.4526
SPY744.8748.74751.30.530.340.87752.41747.4142
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-02 13:30:00' AND window_start < '2026-07-02 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-06 13:30:00' AND window_start < '2026-07-06 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 AS shares_traded_m
FROM sess s
JOIN prior p ON s.ticker = p.ticker
ORDER BY s.ticker
Run am yourself

QQQ's 1.39% lead di four index ETFs, DIA's 0.42% trail am — na di exact inverse of Thursday, wey DIA rise and QQQ fall. SPY close 0.87%, IWM 0.45%. Gap versus grind na di real shape of di day: QQQ open 1.01% above Thursday's close, then add only 0.38% more open-to-close; SPY's 0.53% gap carry most of di 0.87% day. IWM (0.07%) and DIA (0.17%) barely gap — dem just grind higher inside di session instead.

Dat day dey strange?

QuerySPY's open-to-close move dey ranked against di trailing month of sessions (rank 1 = di biggest absolute move)
day move pctabs move ranksessions wey we comparefirst session
0.3413192026-06-08
The exact SQL behind every number
SELECT round(anyIf(oc_pct, d = toDate('2026-07-06')), 2) AS day_move_pct,
       arrayCount(x -> x > abs(anyIf(oc_pct, d = toDate('2026-07-06'))), groupArrayIf(abs(oc_pct), d != toDate('2026-07-06'))) + 1 AS abs_move_rank,
       count() AS sessions_compared,
       toString(min(d)) AS first_session
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-06-06 00:00:00')
      AND window_start < toDateTime('2026-07-07 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
    GROUP BY d
)
Run am yourself

For the index side, no: SPY open-to-close move wey clock 0.34% rank 13 among the last 19 trailing sessions for absolute size, so e dey mid-pack. The intraday tape dey normal; na the gap wey the day show face.

Breadth: green tape, growth don come front again

QueryAdvancers vs decliners among di tickers wey get at least $1M wey trade on July 6
advancersdeclinersunchangedliquid tickerstickers wey trade both sessionstickers wey liquidity filter dropadvancer pct
3861224286618911550536162.4
The exact SQL behind every number
WITH per_ticker AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 00:00:00')) AS day_close,
        sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-06 00:00:00') AS day_dollar_volume
    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-06 20:00:00')
    GROUP BY ticker
)
SELECT
    countIf(day_close > prior_close AND day_dollar_volume >= 1000000) AS advancers,
    countIf(day_close < prior_close AND day_dollar_volume >= 1000000) AS decliners,
    countIf(day_close = prior_close AND day_dollar_volume >= 1000000) AS unchanged,
    countIf(day_dollar_volume >= 1000000) AS liquid_tickers,
    count() AS tickers_traded_both_sessions,
    count() - countIf(day_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(day_close > prior_close AND day_dollar_volume >= 1000000)
        / countIf(day_dollar_volume >= 1000000), 1) AS advancer_pct
FROM per_ticker
WHERE prior_close > 0 AND day_close > 0
Run am yourself

3861 advancers, 2242 decliners, 86 unchanged, 62.4% of the liquid tape dey rise. Index weighting and equal-count breadth agree, both green — wey Thursday bin split dem. Di filter don drop 5361 of 11550 dual-session tickers wey trade under $1M.

Sector by sector: how wide the split take dey?

Four megacap no dey make one market. The panel price di day through di eleven big sector ETFs, one fund for each slice of the S&P 500, di same basket every session. Watch di spread between di best sector and di worst: na dis be di day's dispersion.

QueryDi eleven sector ETFs: July 6 vs di July 2 close, split into gap and intraday
tickerpct chggap pctintraday pctday dollar bnpoints wey e dey behind leader
XLK1.711.190.521.430
XLF0.990.420.561.640.72
XLI0.90.430.471.20.81
XLY0.750.350.390.980.96
XLC0.60.430.170.821.11
XLB-0.06-0.130.080.851.77
XLE-0.15-0.320.171.151.86
XLRE-0.920.09-1.010.282.63
XLU-1.03-0.11-0.920.732.74
XLV-1.03-0.35-0.692.352.75
XLP-1.08-0.24-0.851.062.79
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 00:00:00')) AS prior_close,
        toFloat64(argMinIf(open, window_start, window_start >= '2026-07-06 00:00:00')) AS day_open,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-06 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
      AND ((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-06 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
    round((day_open / prior_close - 1) * 100, 2) AS gap_pct,
    round((day_close / day_open - 1) * 100, 2) AS intraday_pct,
    day_dollar_bn,
    round(max((day_close / prior_close - 1) * 100) OVER () - (day_close / prior_close - 1) * 100, 2) AS points_behind_leader
FROM per_name
ORDER BY pct_chg DESC, ticker ASC
Run am yourself

Technology (XLK) take di day for 1.71%, and almost all of am na di gap: 1.19% for di open, then 0.52% for di next six and a half hours. Financials (0.99%) and industrials (0.9%) follow. Then di table turn: five green rows give way to six red, na di defensive end — utilities, health care, staples — come reach low as -1.08%. From top to bottom, 2.79 percentage points separate best from worst on di day wey S&P tracker move 0.87%, several times di index move, and na why e no make sense read one green day as one thing. Real estate and utilities run di opposite shape to tech: near-flat opens (0.09%, -0.11%), then slide all session (-1.01% and -0.92% open to close).

The highlight of the day: di memory rout, wey reverse half

Di memory-and-storage complex wey break down across Wednesday and Thursday bounce back Monday, but na only half reverse.

QueryDi memory and storage names: change vs Thursday close, range timing, and dollar volume
tickerprior closeday closepct chgday highday high ETday lowday low ETrange pctday dollar bn
MU975.77984.310.88101910:45980.8515:593.8930.9
SNDK1743.591743.08-0.031837.7710:441713.213:597.2713.85
STX820.25869.56886.8910:3984813:024.592.56
WDC538.99577.467.1460110:44563.6109:306.633.78
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-06 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-06 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-07-06 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-07-06 00:00:00') AS high_bar,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-06 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
      AND ((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-06 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    round(day_close, 2) AS day_close,
    round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
    round(day_high, 2) AS day_high,
    formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
    round(day_low, 2) AS day_low,
    formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
    round((day_high / day_low - 1) * 100, 2) AS range_pct,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run am yourself

Di two drive makers lead di rebound: Western Digital 7.14% and Seagate 6%, both of dem top out for mid-morning (10:44 and 10:39 ET). Di heaviest two just sit out: MU add 0.88%, e print im low on di closing bar (15:59); SanDisk finish -0.03% across a 7.27% range. MU still move $30.9 billion of stock, pass di other three put together (di MU deep-dive don cover im quarter).

Di other half of di rotation sit inside di megacaps:

QueryMegacap rotation: change vs Thursday close, range timing, and dollar volume
tickerprior closeday closepct chgday highday high ETday lowday low ETrange pctday dollar bn
AAPL308.22312.811.49314.211:4530709:302.3511.7
MSFT389.62386.88-0.7389.1509:30381.2209:392.089.32
NVDA194.51195.620.57197.5512:14193.9909:301.8415.14
TSLA392.81419.776.8642015:59390.509:377.5519.17
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-06 00:00:00')) AS day_close,
        maxIf(toFloat64(high), window_start >= '2026-07-06 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-07-06 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-07-06 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-07-06 00:00:00') AS high_bar,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-06 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'TSLA')
      AND ((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-06 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(prior_close, 2) AS prior_close,
    round(day_close, 2) AS day_close,
    round((day_close / prior_close - 1) * 100, 2) AS pct_chg,
    round(day_high, 2) AS day_high,
    formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
    round(day_low, 2) AS day_low,
    formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
    round((day_high / day_low - 1) * 100, 2) AS range_pct,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run am yourself

TSLA run one-way climb go 6.86%, low for 09:37 ET, high on di closing bar (15:59), di mirror of im Thursday fall. AAPL add 1.49% and NVDA 0.57%; MSFT na di only megacap wey red, for -0.7%, im high print for di 09:30 open.

Where di money dey trade

QueryVolume leaders two ways: top 6 by dollars traded, top 4 by shares traded (one reused-symbol listing don drop out pending entity verification)
leaderboardtickerdollar volume bnshares mpct for board leader
by dollars tradedSPY31.4942100
by dollars tradedMU30.930.998.1
by dollars tradedTSLA19.1746.660.9
by dollars tradedQQQ18.792659.7
by dollars tradedNVDA15.1477.248.1
by dollars tradedAMD14.2625.545.3
by shares tradedSOXS1.86467.1100
by shares tradedBITO3.06358.576.8
by shares tradedSBEV0.07281.960.4
by shares tradedTZA0.62161.634.6
The exact SQL behind every number
SELECT leaderboard, ticker, dollar_volume_bn, shares_m,
    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-06 13:30:00' AND window_start < '2026-07-06 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-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESC
Run am yourself

SPY na e lead di dollar tape with $31.49 billion, with MU ($30.9 billion) one step behind, and dat end MU run wey am dey top for four sessions (Monday Thursday through dey carry di receipts). For di share board, SOXS, wey be di 3x-inverse semiconductor ETF, trade 467.1 million shares, and e top di count again even as di chips wey e dey track dey rise.

QueryShares traded per 30-minute bucket, regular hours (billions)
ET timeshares bnpct for biggest bucket
09:301.9693.7
10:001.3162.7
10:301.0951.9
11:001.0650.5
11:300.8842
12:000.8440
12:300.7636.3
13:000.7736.5
13:300.8138.7
14:000.6932.8
14:300.6832.5
15:000.8440.3
15:302.1100
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-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
GROUP BY et_time
ORDER BY et_time
Run am yourself

1.96 billion shares for di opening half hour, a 0.68 billion trough around 14:30, 2.1 billion inside di 15:30 close — na di normal intraday smile, wey dey heaviest pass for di two ends.

The options tape

QueryOne row for di whole options day: volume, call share, and di Monday same-day expiry
option prints (m)contracts (m)call pct of volumesame day expiry pctsame day contracts (m)spy contracts (m)qqq contracts (m)tsla contracts (m)top contract underlying wey dey toptop contract striketop contract typetop contract na calltop contract expirytop contract volume (m)top contract avg pricespy close minus strike
10.5360.9858.438.723.5712.16.884.29SPY751C12026-07-061.080.5640.3
The exact SQL behind every number
WITH
    (
        SELECT (any(underlying_symbol), any(toFloat64(strike_price)), any(option_type),
                any(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))),
                sum(size), count(), round(avg(toFloat64(price)), 3))
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
        GROUP BY ticker
        ORDER BY sum(size) DESC
        LIMIT 1
    ) AS top_contract,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
    ) AS spy_regular_close
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS 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) = '260706') / sum(size), 1) AS same_day_expiry_pct,
    round(toFloat64(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260706')) / 1e6, 2) AS same_day_contracts_m,
    round(toFloat64(sumIf(size, underlying_symbol = 'SPY')) / 1e6, 2) AS spy_contracts_m,
    round(toFloat64(sumIf(size, underlying_symbol = 'QQQ')) / 1e6, 2) AS qqq_contracts_m,
    round(toFloat64(sumIf(size, underlying_symbol = 'TSLA')) / 1e6, 2) AS tsla_contracts_m,
    top_contract.1 AS top_contract_underlying,
    top_contract.2 AS top_contract_strike,
    top_contract.3 AS top_contract_type,
    if(top_contract.3 = 'C', 1, 0) AS top_contract_is_call,
    top_contract.4 AS top_contract_expiry,
    round(toFloat64(top_contract.5) / 1e6, 2) AS top_contract_volume_m,
    round(top_contract.7, 3) AS top_contract_avg_price,
    round(spy_regular_close - top_contract.2, 2) AS spy_close_minus_strike
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
Run am yourself

Options trade 60.98 million contracts for total of 10.53 million trades, 58.4% na calls. Same-day expiry hold 38.7% of the tape (23.57 million contracts), that na the normal Monday 0DTE share, and e dey below the heavy Thursday number wey be holiday-eve figure. Busiest contract na the same-day SPY $751 call, 1.08 million contracts for average price $0.564, and SPY close $0.3 above the strike price, so e dey in the money. Call dey top the board, even though Thursday finish on put.

Quote tape: gap up dey trade for wide markets?

Under every price wey dey above, na the quote stream dey sit there — the National Best Bid and Offer, wey dem dey re-quote continuously for every listed name. Gap open na where quotes fit turn hostile, so we dey measure am every session.

QueryDi whole equity NBBO stream: July 6 vs di July 2 session, and where Monday quotes dey cluster
jul6 updates (m)jul2 updates (m)day over day pctjul6 open half hour (m)jul6 midday half hour (m)jul6 close half hour (m)
391.96597.22-34.458.6620.7433.7
The exact SQL behind every number
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-06')) / 1e6, 2) AS jul6_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-02')) / 1e6, 2) AS jul2_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-06')) / countIf(toDate(sip_timestamp) = toDate('2026-07-02')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 14:00:00') / 1e6, 2) AS jul6_open_half_hour_m,
    round(countIf(sip_timestamp >= '2026-07-06 17:30:00' AND sip_timestamp < '2026-07-06 18:00:00') / 1e6, 2) AS jul6_midday_half_hour_m,
    round(countIf(sip_timestamp >= '2026-07-06 19:30:00' AND sip_timestamp < '2026-07-06 20:00:00') / 1e6, 2) AS jul6_close_half_hour_m
FROM global_markets.cache_stocks_quotes
WHERE (sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00')
   OR (sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00')
Run am yourself

The tape carry 391.96 million NBBO updates on Monday, against 597.22 million Thursday, -34.4% — one-third fewer messages than the pre-holiday session — and dem pile into the open: 58.66 million for the first half hour, against 20.74 million at 1:30pm and 33.7 million into the close. Fewer quotes than Thursday, but no be wider ones:

QueryDi touch at di gap open: median quoted spread and quote rate, 9:30–9:42 ET vs a midday control (12 minutes each)
tickeropen spread (bps)midday spread (bps)spread delta (bps)open updates (k)midday updates (k)quote rate ratiosession updates (m)dropped invalid quotes
DIA0.760.570.19105.919.65.40.837
IWM0.670.330.34219.198.42.22.5662
MSFT3.881.562.3225.26.63.80.32121
MU8.094.463.6353.515.23.50.69317
QQQ0.830.420.42357.9121.42.93.96239
SNDK21.078.1612.914.94.63.30.1638
SPY0.270.270276.992.833.35883
STX30.9425.625.322.90.83.40.0411
TSLA4.571.682.8940.617.72.30.6553
WDC14.679.285.399.52.14.50.140
The exact SQL behind every number
SELECT
    ticker,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 13:42:00'), 2) AS open_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-07-06 17:30:00' AND sip_timestamp < '2026-07-06 17:42:00'), 2) AS midday_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 13:42:00')
        - quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-07-06 17:30:00' AND sip_timestamp < '2026-07-06 17:42:00'), 2) AS spread_delta_bps,
    round(countIf(sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 13:42:00') / 1e3, 1) AS open_updates_k,
    round(countIf(sip_timestamp >= '2026-07-06 17:30:00' AND sip_timestamp < '2026-07-06 17:42:00') / 1e3, 1) AS midday_updates_k,
    round(countIf(sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 13:42:00') / countIf(sip_timestamp >= '2026-07-06 17:30:00' AND sip_timestamp < '2026-07-06 17:42:00'), 1) AS quote_rate_ratio,
    round(count() / 1e6, 2) AS session_updates_m,
    countIf(bid_price <= 0 OR ask_price <= 0 OR bid_price > ask_price) AS dropped_invalid_quotes
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('DIA', 'IWM', 'MSFT', 'MU', 'QQQ', 'SNDK', 'SPY', 'STX', 'TSLA', 'WDC')
  AND sip_timestamp >= '2026-07-06 13:30:00' AND sip_timestamp < '2026-07-06 20:00:00'
GROUP BY ticker
ORDER BY ticker
Run am yourself

The bid-ask spread na the cost of crossing, for basis points of the mid-price — 1 bp na one penny for $100 stock. No checked name quote tighter for the gap's first twelve minutes than midday, and SPY's touch dey identical for both (0.27 bps, 0 bps of change), even as e re-quote 3x faster into the open. The width penalty land on single names, no be index funds: SanDisk pay the most (+12.9 bps, 8.16 to 21.07), MU +3.63, TSLA +2.89, against QQQ's 0.42 bps on a 0.83 bps touch. Seagate answer "no be everything liquid?": 30.94 bps wide at the open, over a hundred times SPY's touch.

QuerySPY's update-weighted average quoted spread: July 6 ranked against di trailing month (rank 1 = di tightest)
jul6 avg spread (cents)tightness ranksessions wey we comparewidest session (cents)other sessions na avg (cents)first sessiondropped invalid quotes
1.8151212.8652.337June 4, 202641468
The exact SQL behind every number
SELECT
    round(anyIf(avg_spread_cents, d = toDate('2026-07-06')), 3) AS jul6_avg_spread_cents,
    arrayCount(x -> x < anyIf(avg_spread_cents, d = toDate('2026-07-06')), groupArrayIf(avg_spread_cents, d != toDate('2026-07-06'))) + 1 AS tightness_rank,
    count() AS sessions_compared,
    round(max(avg_spread_cents), 3) AS widest_session_cents,
    round(avgIf(avg_spread_cents, d != toDate('2026-07-06')), 3) AS other_sessions_avg_cents,
    replaceAll(formatDateTime(min(d), '%M %e, %Y'), '  ', ' ') AS first_session,
    sum(dropped_invalid) AS dropped_invalid_quotes
FROM (
    SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS d,
           avgIf(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100 AS avg_spread_cents,
           countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= toDateTime('2026-06-04 00:00:00')
      AND sip_timestamp < toDateTime('2026-07-07 00:00:00')
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY d
)
Run am yourself

For the whole regular day, July 6 na SPY's tightest session for the trailing month: update-weighted average quoted spread of 1.815 cents, rank 1 of 21 sessions since June 4, 2026, against month wey average 2.337 cents and reach 2.865 at am widest. Holiday-thinned quote count still give the index buyer the cheapest touch for the board.

Rates: di curve hold quiet for long weekend

QueryDi treasury curve: July 6 vs di July 2 print (populated maturities only)
curve pointjul6 yield pctsession change (bp)
1 month3.69-1
3 month3.875
1 year3.95-1
2 year4.13-1
5 year4.21-2
10 year4.48-1
30 year4.991
2s10s spread0.350
The exact SQL behind every number
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jul6_yield_pct,
    round((t.2 - t.3) * 100) AS session_change_bp
FROM (
    SELECT arrayJoin([
        ('1 month',  toFloat64(d.yield_1_month),  toFloat64(p.yield_1_month)),
        ('3 month',  toFloat64(d.yield_3_month),  toFloat64(p.yield_3_month)),
        ('1 year',   toFloat64(d.yield_1_year),   toFloat64(p.yield_1_year)),
        ('2 year',   toFloat64(d.yield_2_year),   toFloat64(p.yield_2_year)),
        ('5 year',   toFloat64(d.yield_5_year),   toFloat64(p.yield_5_year)),
        ('10 year',  toFloat64(d.yield_10_year),  toFloat64(p.yield_10_year)),
        ('30 year',  toFloat64(d.yield_30_year),  toFloat64(p.yield_30_year)),
        ('2s10s spread', toFloat64(d.yield_10_year - d.yield_2_year), toFloat64(p.yield_10_year - p.yield_2_year))
    ]) AS t
    FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-07-06') AS d,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-07-02') AS p
)
Run am yourself

Di curve barely move for the long weekend. The 10-year sit down for 4.48% and the 2s10s spread for 0.35 percentage points — both of dem dey within one or two basis point of the July 2 print; the 3-month be the only mover wey matter, sit down for 5 basis points.

Calendar wey dey behind that day

QueryJuly 6's corporate calendar and information flow, for one row (including di reverse-split wall wey dey behind a screener trap)
ex dividend records wey deysplits wey don executereverse splitsforward splitsipos wey don listsec filings wey deyinsider form4 filingsfilings 8knews articles wey deynews publishers wey deyticker wey cover passarticles wey cover pass
119151410316412192012363NVDA25
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-06'
    ) AS news,
    (
        SELECT (argMax(t, n), max(n))
        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-06'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-06') AS ex_dividend_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06') AS splits_executed,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06') AS forward_splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-06') AS ipos_listed,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-06') AS sec_filings,
    (SELECT uniqExactIf(accession_number, form_type = '4') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-06') AS insider_form4_filings,
    (SELECT uniqExactIf(accession_number, form_type = '8-K') FROM global_markets.stocks_sec_edgar_index WHERE filing_date = '2026-07-06') AS filings_8k,
    news.1 AS news_articles,
    news.2 AS news_publishers,
    top_news.1 AS most_covered_ticker,
    top_news.2 AS most_covered_articles
Run am yourself

119 dividend records waka go ex-dividend, 15 splits execute, 0 new listings come, and the SEC index record 3164 filings, 1219 Form 4s, 201 8-Ks — na lighter book pass wetin we see for the Thursday wey dey before holiday. The news feed carry 236 articles, and the name wey dem cover pass dey NVDA for 25.

Wall of reverse-split wey dey sit behind the mover screens

14 of the 15 splits na reverse splits, wey dem dey call share consolidations, and most of am dey for prices below one dollar, against 1 forward splits. A reverse split turn many old shares into one share, and the price go rise the same proportion, but a screen wey no adjust am for the split go report triple-digit "gain" wey never gain at all. The whole wall:

QueryEvery split wey execute on July 6, with di unadjusted close before and after (splits wey no get regular-session tape for both sides dem don drop am)
tickerold sharesnew sharesold shares per newjul2 closejul6 closeunadjusted pct chg
INLF20012000.026.3131450
NTCL501500.094.625033.3
NIPG301300.248.183308.3
JZ301300.12.992890
HKIT251250.174.132329.4
CRIS201200.355.91585.7
NVVE181180.324.941443.8
ABTC151150.568.471412.5
TXXS101102.3524.34935.7
SLAI7170.453.19608.9
SNAL5150.613.03396.7
NIVF3130.461.5226.1
The exact SQL behind every number
SELECT
    s.ticker AS ticker,
    toFloat64(s.split_from) AS old_shares,
    toFloat64(s.split_to) AS new_shares,
    round(toFloat64(s.split_from) / toFloat64(s.split_to), 0) AS old_shares_per_new,
    p.prev_close AS jul2_close,
    d.day_close AS jul6_close,
    round((d.day_close / p.prev_close - 1) * 100, 1) AS unadjusted_pct_chg
FROM (
    SELECT ticker, any(split_from) AS split_from, any(split_to) AS split_to
    FROM global_markets.stocks_splits
    WHERE execution_date = '2026-07-06'
    GROUP BY ticker
) s
INNER JOIN (
    SELECT ticker, round(toFloat64(argMax(close, window_start)), 2) AS prev_close
    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'
      AND ticker IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06')
    GROUP BY ticker
    HAVING prev_close > 0
) p ON s.ticker = p.ticker
INNER JOIN (
    SELECT ticker, round(toFloat64(argMax(close, window_start)), 2) AS day_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
      AND ticker IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date = '2026-07-06')
    GROUP BY ticker
    HAVING day_close > 0
) d ON s.ticker = d.ticker
ORDER BY unadjusted_pct_chg DESC, ticker ASC
Run am yourself

Every one of the 12 rows na consolidation wey print triple-digit or higher "gain" on raw tape, from 31450% for top (a 200-for-1 consolidation, unadjusted close from $0.02 go $6.31) reach down to 226.1% with the smallest ratio (3-for-1). Partway down the table dey the cleanest teaching case: a 10-for-1 reverse split carry TXXS's unadjusted close from $2.35 Thursday reach $24.34 Monday, ten old shares become one, no be tenfold rally. Any screener wey dey look raw price change go put this whole table above every real mover; our own screener dey exclude splits. Thursday's CRWD forward split fake the opposite one, e look like a crash.

Di session, e verify, di first back from break

QuerySession check: SPY's observed minute-bar span, di July 3 closure, and di next one for di calendar
first spy bar ETlast spy bar ETspy minute barsregular session barsday sessionsjul3 spy barsnext closure datenext closure name
04:0019:5991739010September 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-06 13:30:00' AND window_start < '2026-07-06 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= '2026-07-03 00:00:00' AND window_start < '2026-07-04 00:00:00') AS jul3_spy_bars,
    (SELECT replaceAll(formatDateTime(min(date), '%M %e, %Y'), '  ', ' ') FROM global_markets.stocks_market_holidays WHERE date > '2026-07-06' AND status = 'closed') AS next_closure_date,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-06' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-06 00:00:00' AND window_start < '2026-07-07 00:00:00'
Run am yourself

July 6 na full session, no be early close: SPY bars run from 04:00 to 19:59 New York time, with exactly 390 bars for the regular window. Friday wey dey before, July 3, print 0 SPY bars, full closure for Independence Day, since July 4 dey fall on top Saturday. Next closure: Labor Day, September 7, 2026. Di four-session week wey dey before di break, we measure am for week recap.

Questions Wey People Dey Ask

How the stock market do on July 6, 2026?

All four big index ETFs close for higher side: QQQ 1.39%, SPY 0.87%, IWM 0.45%, DIA 0.42%, with 62.4% of liquid names advancing, and most of the move na overnight gap.

Which sector lead on July 6, 2026?

Technology (XLK) lead the eleven sector ETFs at 1.71%, the defensive side dey as low as -1.08%, the spread between the best and the worst na 2.79 percentage points, wey be plenty times the S&P tracker's 0.87% move.

The stock market open for Independence Day 2026?

No. July 4 fall for Saturday, and the exchanges observe Independence Day for Friday July 3, that closure show for the 0 SPY minute bars wey print above. July 6 na the first session wey dem come back.

Why some stocks show huge one-day gains on July 6?

14 reverse splits dey execute. When you join many old shares go inside one share at price wey dey proportionally higher, unadjusted screen dey report "gain" of hundreds of percent even though the holder's position value no change at all; the 12 names wey dey for up there all na that kind.

The spreads wide for the gap open?

E dey only for individual stocks. SPY's median quoted spread for the first twelve minutes na 0.27 basis points, the same level wey e get for midday; SanDisk's quote dey 12.9 bps wider than midday.

Note dem don make for the data

  • Dollar volume na proxy wey dey per-minute, close × volume wey dem sum for each minute bar.
  • Sector basket na declared method, no be vendor field: the eleven big S&P sector ETFs (XLB, XLC, XLE, XLF, XLI, XLK, XLP, XLRE, XLU, XLV, XLY), the same set every session.
  • Quoted spreads na median for (ask − bid) ÷ mid over valid two-sided quotes; one-sided quotes, zero quotes and crossed quotes dem don drop am, and dem dey count am inside the panel.
  • One listing wey reuse one symbol dem don exclude am from the leaderboards, until dem don verify the entity (receipts).

Methodology

  • The period na one single trading session (1 session, wey dem verify from observed bars). Dem store timestamps for UTC, then dem convert am to New York time inside the queries. "Close" mean the last minute bar wey close for regular session; day changes dey compare July 6 with July 2, the prior session wey fall across the July 3 closure, verified from bars, we never just assume.
  • Dem cast decimals to 64-bit floats before dem do ratio arithmetic. Dem dey read panels once, at authoring time, through the gated read-only path.

Every panel na stored query result — chart, table, and SQL na one single object. Paste any one of them inside the Strasmore terminal, e go become your own. Previous session: July 2. Next: July 7.

#recap#daily#spy#qqq#market structure