STRASMORE/EXPLORE 2,170 QUERIES

The four major index trackers across the same window, rebased to the first open

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-08-25, from Biggest Stock Movers This Month.

as of series 21×5read in context →
The four major index trackers across the same window, rebased to the first open — 21 rows by 5 columns, computed from US exchange, SIP and OPRA data.
sessionsp500_pctnasdaq100_pctdow_pctrussell2000_pct
2026-07-220.10.23-0.02-0.65
2026-07-23-1.12-1.65-1.04-1.22
2026-07-24-1.04-2.76-0.54-1.52
2026-07-27-1.02-3.06-0.06-0.94
2026-07-28-0.78-41.02-0.79
2026-07-29-2.29-5.98-1.2-2.4
2026-07-30-0.65-2.85-0.02-1.07
2026-07-310.03-2.230.5-1.53
2026-08-031.48-0.511.840.18
2026-08-043.32.853.592.02
2026-08-053.11.944.061.37
2026-08-062.931.563.180.86
2026-08-073.562.753.441.97
2026-08-103.542.443.331.45
2026-08-113.192.0931.79
2026-08-123.472.852.962.37
2026-08-134.184.043.122.63
2026-08-143.983.92.913.17
2026-08-173.493.732.422.83
2026-08-182.781.992.171.54
2026-08-193.011.782.442.04
Rows × columns
21 × 5
Period covered
to
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for The four major index trackers across the same window, rebased to the first open, derived from the stored result.
ColumnTypeRangeNotes
session date 2026-07-22 to 2026-08-19
sp500_pct number -2.29 to 4.18 percent
nasdaq100_pct number -5.98 to 4.04 percent
dow_pct number -1.2 to 4.06 percent
russell2000_pct number -2.4 to 3.17 percent

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

the exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT session,
       round(anyIf(cum_pct, ticker = 'SPY'), 2) AS sp500_pct,
       round(anyIf(cum_pct, ticker = 'QQQ'), 2) AS nasdaq100_pct,
       round(anyIf(cum_pct, ticker = 'DIA'), 2) AS dow_pct,
       round(anyIf(cum_pct, ticker = 'IWM'), 2) AS russell2000_pct
FROM (
    SELECT ticker,
           formatDateTime(d, '%Y-%m-%d') AS session,
           100 * (c / first_value(o) OVER (PARTITION BY ticker ORDER BY d) - 1) AS cum_pct
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMin(toFloat64(open), window_start) AS o,
               argMax(toFloat64(close), window_start) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 34 DAY
          AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
          AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
        GROUP BY ticker, d
    )
)
GROUP BY session
ORDER BY session

Run your own version of this

The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.

More from this analysisBiggest Stock Movers This Month
Biggest stock losers this month (companies trading $1B+ over the window) ranking 10×3 Biggest stock gainers this month (companies trading $1B+ over the window) ranking 10×3 Eight household mega-cap names over the same window ranking 8×2 Where every screened company landed: monthly returns by bucket ranking 6×2 The window and the screened universe behind every board on this page scalar 1×5 Biggest stock losers this week (names trading $1B+, leveraged/inverse ETFs excluded) ranking 10×4 See all 2,170 queries →