STRASMORE/EXPLORE 2,170 QUERIES

Where five broad-market ETFs sit inside their own 52-week range

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 Stocks at 52-Week Highs and Lows.

as of ranking 5×4read in context →
Where five broad-market ETFs sit inside their own 52-week range — 5 rows by 4 columns, computed from US exchange, SIP and OPRA data.
labelpct_below_highpct_above_lowytd_return_pct
S&P 500 equal weight (RSP)0.3821.815.9
Dow 30 (DIA)1.6918.211
S&P 500 (SPY)1.8520.812
Russell 2000 (IWM)2.3330.121
Nasdaq 100 (QQQ)5.3426.515
Rows × columns
5 × 4
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 Where five broad-market ETFs sit inside their own 52-week range, derived from the stored result.
ColumnTypeRangeNotes
label text 5 distinct values
pct_below_high number 0.38 to 5.34 percent
pct_above_low number 18.2 to 30.1 percent
ytd_return_pct number 11 to 21 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 last_session AS (
    SELECT max(date) AS d FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY' AND date >= today() - 12 AND date < today()
),
daily AS (
    SELECT ticker, date AS dt, toFloat64(close) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE date < today()
      AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM', 'RSP')
      AND date > (SELECT d FROM last_session) - 365
),
ranged AS (
    SELECT ticker,
           argMax(c, dt) AS last_close,
           max(c) AS hi,
           min(c) AS lo,
           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
           count() AS n_sessions,
           min(dt) AS first_dt,
           max(dt) AS last_dt
    FROM daily
    GROUP BY ticker
    HAVING n_sessions >= 200
       AND countIf(dt <= toDate('2025-12-31')) > 0
       AND last_dt = (SELECT d FROM last_session)
       AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT multiIf(ticker = 'SPY', 'S&P 500 (SPY)',
               ticker = 'QQQ', 'Nasdaq 100 (QQQ)',
               ticker = 'DIA', 'Dow 30 (DIA)',
               ticker = 'RSP', 'S&P 500 equal weight (RSP)',
               'Russell 2000 (IWM)') AS label,
       round((1 - last_close / hi) * 100, 2) AS pct_below_high,
       round((last_close / lo - 1) * 100, 1) AS pct_above_low,
       round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
ORDER BY pct_below_high ASC

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 analysisStocks at 52-Week Highs and Lows
Stocks at 52-week highs, ordered by year-to-date return ranking 12×3 Stocks at 52-week lows, ordered by year-to-date return ranking 9×3 How far the whole screen sits below its 52-week high ranking 6×4 New 52-week highs against new lows, daily, over the past six weeks series 31×4 Annualized volatility vs total return, 25 large caps, calmest to wildest (~2 years) ranking 25×3 When headlines actually land: article counts by ET clock hour, July 2026 ranking 24×4 See all 2,170 queries →