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

July 30 Market Recap: Di Day for Numbers

July 30, 2026 recap dey cover index scoreboard, breadth, sector spread, options flow, quote tape, rates and calendar, with every figure query-backed.

Dis market recap for Thursday, July 30, 2026 dey read the whole session from stored queries: SPY close-over-close change come to 1.68%, liquid tape advancer share reach 63.5%, and options tape print 67.06 million contracts. Every window below get explicit dates for both ends, so if you run any panel SQL again, e go return these same figures.

Di scoreboard

All change dey compare July 30 last regular-session minute bar with Wednesday July 29 own, for two trading sessions wey follow each other. Rows dey alphabetical order, so every ETF get fixed position.

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

DIA move 1.19%, IWM 1.37%, QQQ 3.34%, and SPY 1.68% reach $741.73 close. Every row divide the move into two legs: SPY open 0.9% from Wednesday close, then move 0.77% from open to close. Overnight leg and intraday leg no need agree, and how dem split between both na the session first fingerprint.

Di you see say the day no normal?

One session number no mean much if you no look the distribution behind am. So we rank the day inside the same trailing month, using the same method.

QuerySPY day move for trailing context (open-to-close, June 30 reach July 30)
The exact SQL behind every number
SELECT
    round(anyIf(oc_pct, d = toDate('2026-07-30')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, d = toDate('2026-07-30'))), groupArrayIf(abs(oc_pct), d != toDate('2026-07-30'))) + 1 AS spy_abs_move_rank,
    count() AS spy_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-30 13:30:00')
      AND window_start < toDateTime('2026-07-31 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
    GROUP BY d
)
Run this yourself

SPY open-to-close move of 0.77% rank 3 out of 22 trailing sessions by absolute size, for window wey reach back to 2026-06-30. The rank count how many other sessions for the window move pass am, plus one. So first place go mean say na the biggest move for the trailing month.

Breadth

Index level na one number. Breadth dey count how many stocks move along with am.

QueryLiquid-tape breadth: July 30 close versus July 29 close, $1M-traded filter
The exact SQL behind every number
SELECT
    countIf(c30 > c29 AND liquid) AS advancers,
    countIf(c30 < c29 AND liquid) AS decliners,
    countIf(c30 = c29 AND liquid) AS unchanged,
    countIf(liquid) AS liquid_tickers,
    countIf(NOT liquid) AS dropped_by_liquidity_filter,
    round(100.0 * countIf(c30 > c29 AND liquid) / countIf(liquid), 1) AS advancer_pct
FROM (
    SELECT ticker, c29, c30, dv30 >= 1000000 AS liquid
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-29 20:00:00') AS c29,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00') AS c30,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-30 13:30:00') AS dv30
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-30 20:00:00'
        GROUP BY ticker
        HAVING c29 > 0 AND c30 > 0
    )
)
Run this yourself

Among 5960 names wey clear one-million-dollar regular-hours turnover bar, 3782 close above Wednesday close, while 2122 close below am. Advancer share na 63.5%. Filter no include 5492 thinner names, but e count dem here instead of quietly throwing dem away.

Di mega-cap shelf

Dem same eight mega-cap names dey show for here every session, arranged alphabetically so each one get im own row. Na fixed basket be the main point: reader go learn the rows, and no editorial hand go choose winners after the fact.

QueryEight mega-caps: change versus July 29 and regular-hours dollars, July 30
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-30 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-30 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-30 00:00:00') / 1e9, 2) AS day_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'AMZN', 'AVGO', 'GOOGL', 'META', 'MSFT', 'NVDA', 'TSLA')
      AND ((window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-29 20:00:00')
        OR (window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 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,
    day_dollar_bn
FROM per_name
ORDER BY ticker
Run this yourself

AAPL move -1.24%, META -8.17%, MSFT 15.06%, and NVDA 2.67% on 19.63 billion dollars regular-hours turnover, while TSLA dey at 3.53%. Dollar column dey show how much of the tape these eight names carry by themselves; breadth panel for top na the check to see how far the rest of the market move together with them.

Wetin move for the day

Both boards need five million dollars turnover for regular trading hours. Dem no include any name wey split execute between the two closes wey dem dey measure. Dem also no include one reused symbol under the house ambiguity guard wey notes describe.

QueryBiggest gainers and decliners: July 30 close versus July 29 close, $5M+ traded, splits no dey inside
The exact SQL behind every number
SELECT ticker, board, day_pct, day_dollar_m
FROM (
    SELECT 'gainers' AS board, ticker, round((c30 / c29 - 1) * 100, 1) AS day_pct, round(dv / 1e6, 1) AS day_dollar_m
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-29 20:00:00') AS c29,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00') AS c30,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-30 13:30:00') AS dv
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker NOT IN ('SPCX')
          AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date > '2026-07-29' AND execution_date <= '2026-07-30')
          AND window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-30 20:00:00'
        GROUP BY ticker
        HAVING c29 > 0 AND c30 > 0 AND dv >= 5000000
    )
    ORDER BY day_pct DESC
    LIMIT 8
    UNION ALL
    SELECT 'decliners' AS board, ticker, round((c30 / c29 - 1) * 100, 1) AS day_pct, round(dv / 1e6, 1) AS day_dollar_m
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-29 20:00:00') AS c29,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00') AS c30,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-30 13:30:00') AS dv
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker NOT IN ('SPCX')
          AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits WHERE execution_date > '2026-07-29' AND execution_date <= '2026-07-30')
          AND window_start >= '2026-07-29 13:30:00' AND window_start < '2026-07-30 20:00:00'
        GROUP BY ticker
        HAVING c29 > 0 AND c30 > 0 AND dv >= 5000000
    )
    ORDER BY day_pct ASC
    LIMIT 8
)
ORDER BY board DESC, abs(day_pct) DESC
Run this yourself

The biggest gainer for the board, CYCU, move 489.5% on 474.4 million dollars wey traders trade. The biggest decliner, IREZ, print -61.2% on 90.8 million. This page record the sizes and the receipts; e no attach any story to dem.

Sector dispersion

The eleven SPDR select-sector funds, July 30 close compared with July 29, ranked from best to worst. This basket dey fixed and already defined; e no be vendor classification.

QuerySector ETFs, July 30 close versus July 29 close, ranked
The exact SQL behind every number
SELECT sector, day_pct, round(max(day_pct) OVER () - day_pct, 2) AS points_behind_best
FROM (
    SELECT multiIf(ticker = 'XLK', 'Technology', ticker = 'XLC', 'Communications', ticker = 'XLE', 'Energy',
                   ticker = 'XLF', 'Financials', ticker = 'XLI', 'Industrials', ticker = 'XLB', 'Materials',
                   ticker = 'XLP', 'Staples', ticker = 'XLRE', 'Real Estate', ticker = 'XLU', 'Utilities',
                   ticker = 'XLV', 'Health Care', 'Consumer Discretionary') AS sector,
           round((c30 / c29 - 1) * 100, 2) AS day_pct
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-30 00:00:00') AS c29,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-30 00:00:00') AS c30
        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-29 13:30:00' AND window_start < '2026-07-29 20:00:00')
            OR (window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00'))
        GROUP BY ticker
        HAVING c29 > 0 AND c30 > 0
    )
)
ORDER BY day_pct DESC
Run this yourself

Technology lead the table at 5.52%, while Communications dey bottom at -2.69%, 8.21 percentage points behind. That spread na the day’s sector dispersion: market tape where all eleven dey within one point go look very different from one wey spread across several.

Dollar dem trade for

QueryTop 6 by dollars traded, top 4 by shares traded: July 30 regular hours
The exact SQL behind every number
SELECT leaderboard, ticker, dollar_volume_bn, shares_m,
    round(1000 * dollar_volume_bn / shares_m, 2) AS implied_avg_price
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-30 13:30:00' AND window_start < '2026-07-30 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-30 13:30:00' AND window_start < '2026-07-30 20:00:00'
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard, if(leaderboard = 'by shares traded', shares_m, dollar_volume_bn) DESC
Run this yourself

MU lead the dollar board with 43.29 billion turnover for regular trading hours, while MSFT follow am with 42.56 billion. The share board dey answer another question: CYCU top am with 544 million shares at implied average price of $0.86. Dollar volume show wetin market dey focus on, share volume show how much trading dey happen, and the per-name version of this measure na relative volume.

Di options tape

QueryOptions tape: contracts, call share, same-day share versus Wednesday, busiest SPY contract
The exact SQL behind every number
WITH
    (
        SELECT (strike, typ, vol_m, is_0dte)
        FROM (
            SELECT toFloat64(any(strike_price)) AS strike, any(option_type) AS typ,
                   round(toFloat64(sum(size)) / 1e6, 2) AS vol_m,
                   if(substring(ticker, length(ticker) - 14, 6) = '260730', 1, 0) AS is_0dte
            FROM global_markets.options_trades
            WHERE sip_timestamp >= '2026-07-30 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00'
              AND underlying_symbol = 'SPY'
            GROUP BY ticker
            ORDER BY vol_m DESC, strike ASC
            LIMIT 1
        )
    ) AS top_spy,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00'
    ) AS spy_regular_close,
    (
        SELECT round(toFloat64(sum(size)) / 1e6, 2)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-29 00:00:00' AND sip_timestamp < '2026-07-30 00:00:00'
    ) AS jul29_contracts_m,
    (
        SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260729') / sum(size), 1)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-29 00:00:00' AND sip_timestamp < '2026-07-30 00:00:00'
    ) AS jul29_pct_0dte
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    jul29_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) = '260730') / sum(size), 1) AS pct_0dte,
    jul29_pct_0dte,
    spy_regular_close,
    top_spy.1 AS top_spy_strike,
    top_spy.2 AS top_spy_type,
    top_spy.3 AS top_spy_contracts_m,
    top_spy.4 AS top_spy_is_0dte,
    round(top_spy.1 - spy_regular_close, 2) AS top_spy_strike_minus_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-30 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00'
Run this yourself

Di options tape print 10.93 million trades for 67.06 million contracts, beside Wednesday wey get 66.84 million. Calls take 54.6% of contract volume. Contracts wey expire for that same session, di zero-days-to-expiry crowd, take 25.3% against Wednesday wey get 33.1%. Expiration timing set di pattern. Di SPY contract wey trade pass na di 740 C, with 0.56 million contracts. Its strike dey -1.73 dollars from SPY regular close of $741.73, measured as strike minus close.

The quote tape

Quote data na the scarcest dataset for this desk, and dem dey measure am every session. Ordinary days still dey enter record.

QueryStocks NBBO update count: July 30 versus July 29, with named-ticker updates (millions)
The exact SQL behind every number
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-30')) / 1e6, 2) AS jul30_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-29')) / 1e6, 2) AS jul29_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-30')) / countIf(toDate(sip_timestamp) = toDate('2026-07-29')) - 1) * 100, 1) AS day_over_day_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-30') AND ticker = 'SPY') / 1e6, 2) AS jul30_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-30') AND ticker = 'QQQ') / 1e6, 2) AS jul30_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-30') AND ticker = 'NVDA') / 1e6, 2) AS jul30_nvda_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-29 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00'
Run this yourself

Stock-quote tape carry 560.75 million NBBO updates against 722.65 million on Wednesday, making day-over-day change of -22.4%. SPY record 5.55 million updates, QQQ 6.75 million, and NVDA 2.39 million.

QuerySeven names: RTH median quoted spread in basis points, with quote-quality counts, July 30
The exact SQL behind every number
SELECT ticker,
       round(quantileExactIf(0.5)(10000 * (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2), bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
       round(count() / 1e6, 2) AS quote_updates_m,
       countIf(bid_price <= 0 OR ask_price <= 0) AS one_sided_quote_count,
       countIf(bid_price > ask_price AND bid_price > 0 AND ask_price > 0) AS crossed_quote_count
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'DIA', 'IWM', 'NVDA', 'QQQ', 'SPY', 'TSLA')
  AND sip_timestamp >= '2026-07-30 13:30:00' AND sip_timestamp < '2026-07-30 20:00:00'
GROUP BY ticker
HAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0
ORDER BY ticker
Run this yourself

SPY regular-hours median quoted spread measure 0.27 basis points of mid, QQQ own na 0.59, and NVDA own na 1.03. The last two columns na the disclosure: dem count one-sided and crossed quotes for each name, then keep dem separate from the median instead of silently dropping dem. Crossed quote, where bid dey above ask, na normal artifact of consolidated feed wey dem stitch together from many venues at nanosecond resolution.

QuerySPY median spread ranked against every July session, tightest first
The exact SQL behind every number
SELECT round(anyIf(spread_bps, d = toDate('2026-07-30')), 2) AS jul30_median_spread_bps,
       arrayCount(x -> x < anyIf(spread_bps, d = toDate('2026-07-30')), groupArrayIf(spread_bps, d != toDate('2026-07-30'))) + 1 AS rank_tightest,
       count() AS sessions_compared,
       toString(min(d)) AS first_session
FROM (
    SELECT toDate(sip_timestamp) AS d,
           quantileExactIf(0.5)(10000 * (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2), bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'SPY'
      AND sip_timestamp >= '2026-07-01 13:30:00' AND sip_timestamp < '2026-07-30 20:00:00'
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY d
    HAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0
)
Run this yourself

When dem rank am against every July session using the same logic, that day SPY median spread of 0.27 basis points come out as 19 of 21, counting from the tightest, inside a window wey start for 2026-07-01. For a quiet tape, na this be the panel's point: ordinary liquidity day na finding, and dem publish am with clear boundaries.

QueryOptions NBBO tape: total updates versus the stock tape, plus the SPY root slice, July 30
The exact SQL behind every number
WITH
    (SELECT count() FROM global_markets.cache_options_quotes WHERE sip_timestamp >= '2026-07-30 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00') AS jul30_options_rows,
    (SELECT count() FROM global_markets.cache_stocks_quotes WHERE sip_timestamp >= '2026-07-30 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00') AS jul30_stock_quote_rows
SELECT
    round(jul30_options_rows / 1e9, 2) AS jul30_options_bn,
    round(jul30_options_rows / jul30_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-30 13:30:00' AND sip_timestamp < '2026-07-30 20:00:00') / 1e6, 0) AS jul30_spy_options_m
Run this yourself

Options NBBO tape run 10.32 billion updates, 18.4 times the stock quote tape, while SPY root alone record 441 million regular-hours updates.

Rates

QueryTreasury curve prints wey dey on file, July 27 reach July 30
The exact SQL behind every number
SELECT toString(date) AS date,
       round(toFloat64(yield_2_year), 2) AS yield_2y_pct,
       round(toFloat64(yield_10_year), 2) AS yield_10y_pct,
       round(toFloat64(yield_30_year), 2) AS yield_30y_pct,
       round((toFloat64(yield_10_year) - toFloat64(yield_2_year)) * 100) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= '2026-07-27' AND date <= '2026-07-30'
ORDER BY date
Run this yourself

Treasury file dey about one session behind the tape, so this panel dey report the prints wey e hold: 4 dated rows for the window. The latest one, dated 2026-07-30, put the two-year for 4.23%, the ten-year for 4.68% and the thirty-year for 5.21%, with two-to-ten-year spread of 45 basis points.

Calendar wey dey behind di day

QueryEx-dividends, splits, listings, news, and the July 30 SEC filing mix
The exact SQL behind every number
WITH
    (
        SELECT (argMax(t, (n, t)), max(n))
        FROM (
            SELECT t, count() AS n
            FROM (
                SELECT arrayJoin(tickers) AS t
                FROM global_markets.stocks_news
                WHERE published_utc >= '2026-07-30 04:00:00' AND published_utc < '2026-07-31 04:00:00'
            )
            WHERE t != 'SPCX'
            GROUP BY t
        )
    ) AS top_news,
    (
        SELECT (count(), uniqExact(cik), countIf(form_type = '4'), countIf(form_type = '8-K'), countIf(form_type = '424B2'), countIf(form_type = '10-Q'))
        FROM global_markets.stocks_sec_edgar_index
        WHERE filing_date = '2026-07-30'
    ) AS fil
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-30') AS ex_dividend_records,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-30') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-30') AS forward_splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-30') AS listings,
    (SELECT count() FROM global_markets.stocks_news WHERE published_utc >= '2026-07-30 04:00:00' AND published_utc < '2026-07-31 04:00:00') AS news_articles,
    (SELECT uniqExact(JSONExtractString(publisher, 'name')) FROM global_markets.stocks_news WHERE published_utc >= '2026-07-30 04:00:00' AND published_utc < '2026-07-31 04:00:00') AS news_publishers,
    top_news.1 AS top_news_ticker,
    top_news.2 AS top_news_n,
    fil.1 AS fil_total,
    fil.2 AS fil_filers,
    fil.3 AS fil_form4,
    fil.4 AS fil_8k,
    fil.5 AS fil_424b2,
    fil.6 AS fil_10q
Run this yourself

200 dividend records went ex-dividend for July 30, 3 reverse and 3 forward splits execute, and 3 new listings enter di tape. Di news feed carry 173 articles from 2 publishers, with NVDA di ticker wey dem cover pass for dis feed window at 11 articles. Di EDGAR daily index get 5544 filings for di date from 2743 different filers: 745 insider Form 4 reports, 460 8-K current reports, 1426 424B2 pricing supplements and 252 10-Q quarterly reports. Di index dey follow im own schedule, and dis panel dey report wetin e get when dem generate am.

For next session

For the next two sessions, read from the same tables, but make una eyes no dey only on the period. Friday, July 31 na the last trading date for the month on the calendar.

QueryJuly 31 and August 3 for calendar: closures, ex-dividends, splits, the Friday expiry, and the short-interest lag
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date >= '2026-07-31' AND date <= '2026-08-03' AND status != 'open') AS closures_next_two_sessions,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-31' AND ex_dividend_date <= '2026-08-03') AS exdiv_records_next_two_sessions,
    (SELECT countIf(ticker IN ('AAPL', 'MSFT', 'JPM', 'KO', 'JNJ', 'XOM', 'CVX', 'PG', 'WMT', 'HD')) FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-31' AND ex_dividend_date <= '2026-08-03') AS household_exdivs,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-31' AND execution_date <= '2026-08-03') AS splits_next_two_sessions,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260731') / sum(size), 1) AS jul31_expiry_pct_of_thu_volume,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest WHERE settlement_date <= '2026-07-30') AS latest_short_interest_settlement
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-30 00:00:00' AND sip_timestamp < '2026-07-31 00:00:00'
Run this yourself

The holiday table show say 0 closures dey for Friday July 31 and Monday August 3. 544 dividend records go ex-dividend across those two sessions. 0 of dem dey among ten household names we check, and 14 splits dey scheduled to execute. From Thursday option volume, 26.7% don already dey inside contracts wey go expire Friday, July 31. The newest short-interest settlement wey dey on file na 2026-07-15. The file dey publish with enough lag to get its own explanation.

Session wey dem don verify

QuerySession verification: first/last SPY bar ET, regular-bar count, holiday receipts, next closure
The exact SQL behind every number
SELECT
    formatDateTime(min(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS first_spy_bar_et,
    formatDateTime(max(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS last_spy_bar_et,
    countIf(window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-30 13:30:00' AND window_start < '2026-07-30 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-30') AS jul30_holiday_rows,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-30' AND date <= '2026-12-31' AND status = 'closed') AS next_closure_date,
    (SELECT argMin(name, date) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-30' AND date <= '2026-12-31' AND status = 'closed') AS next_closure_name
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-07-30 00:00:00' AND window_start < '2026-07-31 00:00:00'
Run this yourself

Full regular session: first SPY bar na 04:00 ET, last one na 19:59 ET, 390 regular-hours bars, 1 session dey inside the window, and 0 holiday rows dey for the date. The next scheduled closure na Labor Day for 2026-09-07.

FAQ

Stock market perform how on Thursday, July 30, 2026?

SPY change 1.68% close over close reach $741.73, while QQQ dey 3.34%, DIA dey 1.19% and IWM dey 1.37%. Among liquid names, 3782 rise and 2122 fall.

Which sector top the board on July 30, 2026?

Technology, at 5.52%, based on the eleven SPDR select-sector funds. The weakest among the eleven, Communications, print -2.69%.

How busy options market be on July 30, 2026?

67.06 million contracts trade, compared with 66.84 million for the previous session. Same-day contracts carry 25.3% of volume, while calls carry 54.6%.

Which stock trade the highest dollar volume on July 30, 2026?

MU, with 43.29 billion regular-hours dollar volume, ahead of MSFT at 42.56 billion.

Data notes

The last daily edition na July 29, 2026, while the weekly recap carry the week before this one. We arrange the named per-ticker panels alphabetically, so any prose reference go point to fixed rows. Leaderboards and mover boards dey follow value order, and every position claim wey dem carry get encoded as a sanity bound. The mega-cap basket and the eleven-fund sector basket na fixed sets wey we declare; dem no be vendor classifications. The mover boards use five-million-dollar regular-hours turnover bar. Dem no include any name wey split execute between the two closes wey dem measure. Dem also remove one reused symbol under the house ambiguity guard, so every callout go always land on a name wey person fit verify. The quote panels count one-sided and crossed quotes for each name instead of quietly dropping dem. Treasury file and the EDGAR daily index dey arrive on their own schedules, so those panels report wetin dem get instead of assuming say dem don arrive. No implied-volatility index dey here. Those series no get license for this warehouse, so we read volatility from the tape through ranges, same-day options share and quote behavior.

Methodology

  • Market data source: consolidated tape. delayed_stocks_minute_aggs na price and volume, options_trades na options tape, cache_stocks_quotes and cache_options_quotes na NBBO panels.
  • Close: na the last regular-session minute bar, never be assumed say na 16:00 print and never be extended-hours print.
  • Time zone handling: all stored timestamps dey UTC; WHERE clauses dey use raw UTC literals, and toTimeZone dey show only for SELECT lists as ET labels.
  • Session verification: na from holiday table plus observed bars, never assume am from calendar.
  • Prior-session comparisons: query dey calculate am from July 29, e no dey carry am from previous post.
  • Decimals: price, size and volume columns dey cast to Float64 before any division or product.
  • Deterministic aggregates: exact quantiles and tuple-keyed tie-breaks dey apply throughout; every ordering or sign claim for prose dey encode as sanity bound.
  • Warehouse as-of date: August 1, 2026, two days after the session, as tape's usual one-to-two-day ingest lag dey reach the edge; the bounded receipts above go hold the post if dem find say dataset dey miss when dem generate am.

Cross-links: the previous daily recap, the weekly recap, when options expire, what a bid-ask spread is, and the two-to-ten-year spread.

Every query above dey run unchanged for the Strasmore terminal if you wan point window to another session.