STRASMORE/EXPLORE 2,707 QUERIES

SPY Friday closes against the whole dollar strike grid, by year

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-09-27, from When a Spread Expires Between the Strikes.

as of table 5×5read in context →
SPY Friday closes against the whole dollar strike grid, by year — 5 rows by 5 columns, computed from US exchange, SIP and OPRA data.
yearexpiration_countbetween_strikes_pctcrossed_strike_pctwithin_10_cents_pct
2022501008620
2023501006618
2024501005224
2025499857.124.5
20263210068.818.8
Rows × columns
5 × 5
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 SPY Friday closes against the whole dollar strike grid, by year, derived from the stored result.
ColumnTypeRangeNotes
year text 5 distinct values (2022, 2023, 2024…)
expiration_count number 32 to 50 count
between_strikes_pct number 98 to 100 percent
crossed_strike_pct number 52 to 86 percent
within_10_cents_pct number 18 to 24.5 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 bars AS (
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York'))        AS session_date,
        toHour(toTimeZone(window_start, 'America/New_York')) * 60
          + toMinute(toTimeZone(window_start, 'America/New_York'))  AS et_minute,
        toFloat64(close)                                            AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2022-01-01 00:00:00'
      AND window_start <  '2026-09-01 00:00:00'
),
day_marks AS (
    SELECT
        session_date,
        anyIf(px, et_minute = 900) AS px_3pm,
        argMax(px, et_minute)      AS px_close
    FROM bars
    WHERE et_minute >= 570
      AND et_minute <= 959
    GROUP BY session_date
    HAVING px_3pm > 0
       AND px_close > 0
       AND max(et_minute) >= 955
)
SELECT
    toString(toYear(session_date)) AS year,
    count()                        AS expiration_count,
    round(100 * countIf(px_close != floor(px_close)) / count(), 1)      AS between_strikes_pct,
    round(100 * countIf(floor(px_close) != floor(px_3pm)) / count(), 1) AS crossed_strike_pct,
    round(100 * countIf(least(px_close - floor(px_close), floor(px_close) + 1 - px_close) <= 0.10) / count(), 1) AS within_10_cents_pct
FROM day_marks
WHERE toDayOfWeek(session_date) = 5
GROUP BY year
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 analysisWhen a Spread Expires Between the Strikes
Where the close finished on a narrow call vertical set at 3:00 p.m. ET table 6×5 → SPY, 3:00 p.m. to the close on the August 21, 2026 expiration series 12×3 → How far SPY travels between 3:00 p.m. ET and the Friday close ranking 5×4 → AAPL's final half hour on its tightest monthly expiration close since 2025 series 30×5 → How far the Friday close lands from the nearest whole dollar ranking 10×3 → NVDA on July 17, 2026: the close and the post close window table 30×3 → See all 2,707 queries →