STRASMORE/EXPLORE 3,256 QUERIES

The window decides the answer: SPY calendar-year price return and intra-year high-to-low range, 2016-2025

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-07-31, from Multi-Agent AI Trading Systems: What Is Real.

as of ranking 10×4read in context →
The window decides the answer: SPY calendar-year price return and intra-year high-to-low range, 2016-2025 — 10 rows by 4 columns, computed from US exchange, SIP and OPRA data.
yearsessionsprice_return_pcthigh_low_range_pct
201625211.224.4
201725118.519.1
2018251-6.925.3
201925228.632.3
202025315.168
202125228.729.4
2022251-2034
202325024.825.6
20242522430.1
202525016.639
Rows × columns
10 × 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 The window decides the answer: SPY calendar-year price return and intra-year high-to-low range, 2016-2025, derived from the stored result.
ColumnTypeRangeNotes
year number 2,016 to 2,025
sessions number 250 to 253
price_return_pct number -20 to 28.7 percent
high_low_range_pct number 19.1 to 68 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.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(close, window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2025-12-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
yr AS (
    SELECT toYear(d) AS year,
           argMin(close_px, d) AS first_close,
           argMax(close_px, d) AS last_close,
           max(close_px) AS high_close,
           min(close_px) AS low_close,
           count() AS sessions
    FROM daily
    GROUP BY year
)
SELECT year,
       sessions,
       round(100 * (toFloat64(last_close) / toFloat64(first_close) - 1), 1) AS price_return_pct,
       round(100 * (toFloat64(high_close) / toFloat64(low_close) - 1), 1) AS high_low_range_pct
FROM yr
ORDER BY year
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisMulti-Agent AI Trading Systems: What Is Real
The cost floor: median quoted spread in basis points of the midpoint, regular hours, June 22-26 2026 ranking 6×4 → Where the money trades: US dollar volume by liquidity rank tier, regular hours, June 30 2026 ranking 5×4 → How big a typical session is: SPY close-to-close moves by size band, calendar 2025 ranking 5×3 → Median quoted spread and the cost of a $25,000 round trip: midday hour, July 15, 2026 ranking 6×3 → Six US index funds, identical window: price return, January 2 to June 30, 2026 ranking 6×3 → How far SPY travels from its opening print, by ET half hour, first half of 2026 series 13×3 → See all 3,256 queries →