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

July 27, 2026 Market Recap and Numbers

July 27, 2026 market recap wey cover scoreboard, breadth, sector spread, options flow, quote tape, rates and calendar, with every figure query-backed.

Market recap wey cover Monday, July 27, 2026 read the whole session from stored queries: SPY change from Friday close na 0.02%, liquid tape advancer share na 65.4%, and options tape print 64.69 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

Every change compare July 27 last regular-session minute bar with Friday July 24 own, na consecutive trading sessions wey weekend separate. Rows dey alphabetical order, so each ETF keep fixed position.

QuerySPY / QQQ / DIA / IWM: July 27 vs July 24 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-24 13:30:00' AND window_start < '2026-07-24 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-27 13:30:00' AND window_start < '2026-07-27 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 0.49%, IWM 0.59%, QQQ -0.32%, and SPY 0.02% reach $739.02 close. Each row split the move into two legs: SPY open 0.82% from Friday close, gap wey carry the whole weekend, then move -0.79% from open to close. For Monday, the overnight leg na really two-day leg. The split between am and intraday leg na the session first fingerprint.

Di day unusual?

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

QuerySPY day move for trailing context (open-to-close, June 26 reach July 27)
The exact SQL behind every number
SELECT
    round(anyIf(oc_pct, d = toDate('2026-07-27')), 2) AS spy_open_to_close_pct,
    arrayCount(x -> x > abs(anyIf(oc_pct, d = toDate('2026-07-27'))), groupArrayIf(abs(oc_pct), d != toDate('2026-07-27'))) + 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-26 13:30:00')
      AND window_start < toDateTime('2026-07-28 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.79% rank 1 out of 21 trailing sessions by absolute size, for window wey reach back to 2026-06-26. 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 together with am across the weekend gap.

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

Among 5935 names wey pass one-million-dollar regular-hours turnover bar, 3880 close above Friday close, while 1972 close below am. This mean say advancers make up 65.4%. The filter leave out 5336 thinner names, but dem still dey count for here instead of quietly discarding dem.

Mega-cap shelf wey dey

Na the same eight mega-cap names dey show for here every session, arranged alphabetically so each one keep im row. Na fixed basket be the main point: reader go learn the rows, and no editor fit pick winners after the fact.

QueryEight mega-caps: change vs July 24 and regular-hours dollars, July 27
The exact SQL behind every number
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-07-27 00:00:00')) AS prior_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-07-27 00:00:00')) AS day_close,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-27 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-24 13:30:00' AND window_start < '2026-07-24 20:00:00')
        OR (window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 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.16%, META -0.21%, MSFT 1.94%, and NVDA -5.04% on 25.42 billion dollars regular-hours turnover, while TSLA dey -1.2%. The dollar column dey show how much of the tape these eight names carry by themselves; the breadth panel wey dey above na the check for how far the rest of the market move together with dem.

Di movers of today

Both boards need five million dollars turnover for regular trading hours. Dem no dey count any name wey im split execute between the two closing prices wey dem dey measure. Dem still no dey count one symbol wey dem reuse under the house ambiguity guard wey notes describe.

QueryBiggest gainers and decliners: July 27 close vs July 24 close, $5M+ traded, splits excluded
The exact SQL behind every number
SELECT ticker, board, day_pct, day_dollar_m
FROM (
    SELECT 'gainers' AS board, ticker, round((c27 / c24 - 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-24 13:30:00' AND window_start < '2026-07-24 20:00:00') AS c24,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS c27,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-27 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-24' AND execution_date <= '2026-07-27')
          AND window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-27 20:00:00'
        GROUP BY ticker
        HAVING c24 > 0 AND c27 > 0 AND dv >= 5000000
    )
    ORDER BY day_pct DESC
    LIMIT 8
    UNION ALL
    SELECT 'decliners' AS board, ticker, round((c27 / c24 - 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-24 13:30:00' AND window_start < '2026-07-24 20:00:00') AS c24,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS c27,
               sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-07-27 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-24' AND execution_date <= '2026-07-27')
          AND window_start >= '2026-07-24 13:30:00' AND window_start < '2026-07-27 20:00:00'
        GROUP BY ticker
        HAVING c24 > 0 AND c27 > 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, DFNS, move 214.9% on 486.4 million dollars wey dem trade. The biggest decliner, MPLT, print -72.9% on 83.3 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 27 close over July 24 close, rank from best to worst. The basket don declare am and e fixed; e no be vendor classification.

QuerySector ETFs, July 27 close vs July 24 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((c27 / c24 - 1) * 100, 2) AS day_pct
    FROM (
        SELECT ticker,
               argMaxIf(toFloat64(close), window_start, window_start < '2026-07-27 00:00:00') AS c24,
               argMaxIf(toFloat64(close), window_start, window_start >= '2026-07-27 00:00:00') AS c27
        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-24 13:30:00' AND window_start < '2026-07-24 20:00:00')
            OR (window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00'))
        GROUP BY ticker
        HAVING c24 > 0 AND c27 > 0
    )
)
ORDER BY day_pct DESC
Run this yourself

Staples lead the table with 1.5%, while Energy dey bottom with -2.06%, 3.56 percentage points behind. Na this spread be the day’s sector dispersion: tape wey all eleven dey within one point go read very differently from one wey spread across several points.

Wey dollars trade

QueryTop 6 by dollars traded, top 4 by shares traded: July 27 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-27 13:30:00' AND window_start < '2026-07-27 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-27 13:30:00' AND window_start < '2026-07-27 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 dollar board with 35.71 billion regular-hours turnover, while SPY follow am with 27.03 billion. Share board dey answer different question: KIDZ top am with 198.3 million shares and implied average price of $0.66. Dollar volume dey show where market attention dey, share volume dey show how much shares dey change hands, and the per-name version of this measure na relative volume.

Di options tape

QueryOptions tape: contracts, call share, same-day share vs Friday, 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) = '260727', 1, 0) AS is_0dte
            FROM global_markets.options_trades
            WHERE sip_timestamp >= '2026-07-27 00:00:00' AND sip_timestamp < '2026-07-28 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-27 13:30:00' AND window_start < '2026-07-27 20:00:00'
    ) AS spy_regular_close,
    (
        SELECT round(toFloat64(sum(size)) / 1e6, 2)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-24 00:00:00' AND sip_timestamp < '2026-07-25 00:00:00'
    ) AS jul24_contracts_m,
    (
        SELECT round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260724') / sum(size), 1)
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-07-24 00:00:00' AND sip_timestamp < '2026-07-25 00:00:00'
    ) AS jul24_pct_0dte
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    jul24_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) = '260727') / sum(size), 1) AS pct_0dte,
    jul24_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-27 00:00:00' AND sip_timestamp < '2026-07-28 00:00:00'
Run this yourself

Di options tape print 11.07 million trades for 64.69 million contracts, beside Friday wey get 71.14 million. Calls carry 55.1% of contract volume. Contracts wey expire for that same session, di zero-days-to-expiry crowd, carry 39.3% compared with Friday wey get 49%. Expiration timing set di rhythm. Di SPY contract wey get the most activity na di 740 C, with 0.59 million contracts. Its strike dey 0.98 dollars from SPY $739.02 regular close, measured as strike minus close.

Quote tape

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

QueryStocks NBBO update count: July 27 vs July 24, with named-ticker updates (millions)
The exact SQL behind every number
SELECT
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-27')) / 1e6, 2) AS jul27_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-24')) / 1e6, 2) AS jul24_updates_m,
    round((countIf(toDate(sip_timestamp) = toDate('2026-07-27')) / countIf(toDate(sip_timestamp) = toDate('2026-07-24')) - 1) * 100, 1) AS session_over_session_pct,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-27') AND ticker = 'SPY') / 1e6, 2) AS jul27_spy_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-27') AND ticker = 'QQQ') / 1e6, 2) AS jul27_qqq_updates_m,
    round(countIf(toDate(sip_timestamp) = toDate('2026-07-27') AND ticker = 'NVDA') / 1e6, 2) AS jul27_nvda_updates_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-07-24 00:00:00' AND sip_timestamp < '2026-07-28 00:00:00'
Run this yourself

Stock-quote tape carry 553.53 million NBBO updates, compared with 500.88 million on Friday. The change from one session to the next na 10.5%. SPY record 4.84 million updates, QQQ 6.78 million, and NVDA 2.93 million.

QuerySeven names: RTH median quoted spread in basis points, with quote-quality counts, July 27
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-27 13:30:00' AND sip_timestamp < '2026-07-27 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 measure 0.59 and NVDA 1.02. 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 quietly removing dem. Crossed quote, where bid dey above ask, na normal artifact of consolidated feed wey join data from many venues at nanosecond resolution.

QuerySPY median spread ranked against every July session through the 27th, tightest first
The exact SQL behind every number
SELECT round(anyIf(spread_bps, d = toDate('2026-07-27')), 2) AS jul27_median_spread_bps,
       arrayCount(x -> x < anyIf(spread_bps, d = toDate('2026-07-27')), groupArrayIf(spread_bps, d != toDate('2026-07-27'))) + 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-27 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 with the same logic, that day SPY median spread of 0.27 basis points come as 18 of 18, counting from the tightest, inside window wey start 2026-07-01. For quiet tape, na this be the panel point: ordinary liquidity day na finding wey dem publish and clearly bound.

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

Options NBBO tape run 10.38 billion updates, 18.8 times the stock quote tape. SPY root alone record 440 million regular-hours updates.

Rates

QueryTreasury curve prints wey dey on file, July 22 through July 27
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-22' AND date <= '2026-07-27'
ORDER BY date
Run this yourself

Treasury file dey about one session behind the tape, so this panel dey report the prints wey e get: 4 dated rows for the July 22 through July 27 window. The latest one, dated 2026-07-27, put the two-year for 4.31%, the ten-year for 4.65% and the thirty-year for 5.12%, with a two-to-ten-year spread of 34 basis points.

Di kalenda wey dey behind di day

QueryEx-dividends, splits, listings, news, and the July 27 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-27 04:00:00' AND published_utc < '2026-07-28 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-27'
    ) AS fil
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-07-27') AS ex_dividend_records,
    (SELECT countIf(toFloat64(split_from) > toFloat64(split_to)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-27') AS reverse_splits,
    (SELECT countIf(toFloat64(split_to) > toFloat64(split_from)) FROM global_markets.stocks_splits WHERE execution_date = '2026-07-27') AS forward_splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-27') AS listings,
    (SELECT count() FROM global_markets.stocks_news WHERE published_utc >= '2026-07-27 04:00:00' AND published_utc < '2026-07-28 04:00:00') AS news_articles,
    (SELECT uniqExact(JSONExtractString(publisher, 'name')) FROM global_markets.stocks_news WHERE published_utc >= '2026-07-27 04:00:00' AND published_utc < '2026-07-28 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

91 dividend records go ex-dividend for July 27, 7 reverse splits and 1 forward splits execute, and 0 new listings enter di tape. Di news feed carry 166 articles from 2 publishers, with MSFT as di ticker wey dem cover pass for dis feed window, at 12 articles. Di EDGAR daily index get 3997 filings for dat date from 2163 different filers: 587 insider Form 4 reports, 226 8-K current reports, 555 424B2 pricing supplements and 23 10-Q quarterly reports. Dat index dey follow im own schedule, and dis panel dey report wetin e hold for di time wey dem generate am.

Na deck

For the rest of the week, from Tuesday July 28 reach Friday July 31, wey use the same tables and look beyond the period on purpose.

QueryJuly 28 through 31 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-28' AND date <= '2026-07-31' AND status != 'open') AS closures_rest_of_week,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= '2026-07-28' AND ex_dividend_date <= '2026-07-31') AS exdiv_records_rest_of_week,
    (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-28' AND ex_dividend_date <= '2026-07-31') AS household_exdivs,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= '2026-07-28' AND execution_date <= '2026-07-31') AS splits_rest_of_week,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260731') / sum(size), 1) AS jul31_expiry_pct_of_mon_volume,
    (SELECT toString(max(settlement_date)) FROM global_markets.stocks_short_interest WHERE settlement_date <= '2026-07-27') AS latest_short_interest_settlement
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-07-27 00:00:00' AND sip_timestamp < '2026-07-28 00:00:00'
Run this yourself

The holiday table show 0 closures across the four remaining sessions of the week. 843 dividend records go ex-dividend during those sessions. 0 of dem dey among ten household names wey we check. 18 splits dey scheduled to execute. From Monday option volume, 17.1% don already dey inside contracts wey go expire on Friday, July 31. The latest short-interest settlement for this file na 2026-07-15. The file dey publish with enough delay to get its own explainer.

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-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS regular_session_bars,
    uniqExactIf(toDate(toTimeZone(window_start, 'America/New_York')), window_start >= '2026-07-27 13:30:00' AND window_start < '2026-07-27 20:00:00') AS day_sessions,
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-07-27') AS jul27_holiday_rows,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date > '2026-07-27' 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-27' 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-27 00:00:00' AND window_start < '2026-07-28 00:00:00'
Run this yourself

Na 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

How market do for Monday, July 27, 2026?

SPY change 0.02% from Friday closing reach $739.02, while QQQ dey -0.32%, DIA dey 0.49% and IWM dey 0.59%. Among stocks wey get plenty trading, 3880 rise and 1972 fall.

Which sector lead the board on July 27, 2026?

Staples, at 1.5%, based on the eleven SPDR select-sector funds. The weakest among the eleven, Energy, print -2.06%.

How busy options market be on July 27, 2026?

64.69 million contracts trade, compared with 71.14 million for the previous session. Same-day contracts make up 39.3% of volume, while calls make up 55.1%.

Which stock trade the highest dollar value on July 27, 2026?

MU, with 35.71 billion in regular-hours dollar volume, ahead of SPY at 27.03 billion.

Data notes

Dis edition backfills Monday session for the daily series wey resume, and dem publish am for August 1. The daily session before am by session date na July 10, 2026. The July 29 edition cover the Wednesday for this same week, while the weekly recap carry the week wey end Friday, July 24 — na that session every comparison for this page dey use. Dem arrange the named per-ticker panels alphabetically, so prose references fit point to fixed rows. Dem arrange leaderboards and mover boards by value, and every position claim wey dem carry get encoded as a sanity bound. The mega-cap basket and the eleven-fund sector basket na declared, fixed sets; dem no be vendor classifications. The mover boards use five-million-dollar regular-hours turnover bar. Dem remove any name wey split execute between the two closes wey dem dey measure. Dem also remove one reused symbol under the house ambiguity guard, so every callout go land on name wey person fit verify. Every close-over-close figure here cover the weekend, from Friday July 24 reach Monday July 27, and the scoreboard gap column carry the whole period. The quote panels count one-sided and crossed quotes for each name instead of dropping dem without notice. Treasury file and the EDGAR daily index land according to their own schedules, so those panels report wetin dem get instead of assuming say the files don arrive. No implied-volatility index dey here. Those series no get license for this warehouse, so volatility dey come from the tape through ranges, same-day options share and quote behavior.

Methodology

  • Market data source: consolidated tape. delayed_stocks_minute_aggs dey provide prices and volumes, options_trades dey provide the options tape, while cache_stocks_quotes and cache_options_quotes dey provide the NBBO panels.
  • Close: na the last regular-session minute bar. E no be assumed 16:00 print, and e no be extended-hours print.
  • Time zone handling: all stored timestamps dey for UTC. WHERE clauses dey use raw UTC literals, while toTimeZone dey show only for SELECT lists as ET labels.
  • Session verification: na the holiday table plus observed bars dey confirm am. We no assume am from the calendar.
  • Prior-session comparisons: query dey calculate dem from Friday, July 24, wey be the previous trading session across the weekend. We no carry dem over 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 the prose get sanity bound wey encode am.
  • Warehouse as-of date: August 1, 2026, five days after the session. This one don pass the tape usual one-to-two-day ingest lag. The bounded receipts above go hold the post if dem find any dataset missing when dem generate am.

Cross-links: the previous daily recap, the July 29 edition, 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 one window again to another session.