STRASMORE/EXPLORE 2,707 QUERIES

How far SPY travels between 3:00 p.m. ET and the Friday close

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 ranking 5×4read in context →
How far SPY travels between 3:00 p.m. ET and the Friday close — 5 rows by 4 columns, computed from US exchange, SIP and OPRA data.
yearexpiration_countmedian_final_hour_move_pctp90_final_hour_move_pct
2022500.3530.779
2023500.1410.388
2024500.1150.294
2025490.1030.399
2026320.1240.306
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 How far SPY travels between 3:00 p.m. ET and the Friday close, derived from the stored result.
ColumnTypeRangeNotes
year text 5 distinct values (2022, 2023, 2024…)
expiration_count number 32 to 50 count
median_final_hour_move_pct number 0.103 to 0.353 percent
p90_final_hour_move_pct number 0.294 to 0.779 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(quantileDeterministic(0.5)(100 * abs(px_close - px_3pm) / px_3pm, toUInt32(toUnixTimestamp(session_date))), 3) AS median_final_hour_move_pct,
    round(quantileDeterministic(0.9)(100 * abs(px_close - px_3pm) / px_3pm, toUInt32(toUnixTimestamp(session_date))), 3) AS p90_final_hour_move_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
SPY, 3:00 p.m. to the close on the August 21, 2026 expiration series 12×3 → Where the close finished on a narrow call vertical set at 3:00 p.m. ET table 6×5 → SPY Friday closes against the whole dollar strike grid, by year table 5×5 → How far the Friday close lands from the nearest whole dollar ranking 10×3 → AAPL's final half hour on its tightest monthly expiration close since 2025 series 30×5 → Which tickers carry the most upcoming expirations: option roots by distinct expiration dates in the next six weeks ranking 20×3 → See all 2,707 queries →