STRASMORE/EXPLORE 2,358 QUERIES

expiry_day

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-18, from are-0dte-options-high-risk.

as of series 21×6read in context →
expiry_day — 21 rows by 6 columns, computed from US exchange, SIP and OPRA data.
expiry_dateexpiry_labelpremium_prior_closevalue_at_expirypct_of_premium_leftspy_move_pct
2026-06-01Mon Jun 12.50.58230.12
2026-06-02Tue Jun 22.712.63970.4
2026-06-03Wed Jun 31.6200-1.2
2026-06-04Thu Jun 43.993.56890.53
2026-06-05Fri Jun 52.9800-2.54
2026-06-08Mon Jun 83.953.72940.46
2026-06-09Tue Jun 92.7500-0.41
2026-06-10Wed Jun 103.6100-1.74
2026-06-11Thu Jun 115.4416.483032.3
2026-06-12Fri Jun 123.53.45990.4
2026-06-15Mon Jun 153.4811.913421.54
2026-06-16Tue Jun 162.2200-0.42
2026-06-17Wed Jun 172.2300-0.69
2026-06-18Thu Jun 180.890.941060.18
2026-06-22Mon Jun 223.1500-0.44
2026-06-23Tue Jun 232.7800-1.16
2026-06-24Wed Jun 242.752.2800.3
2026-06-25Thu Jun 252.6800-0.61
2026-06-26Fri Jun 263.6100-0.2
2026-06-29Mon Jun 293.869.762531.31
2026-06-30Tue Jun 302.315.32290.75
Rows × columns
21 × 6
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 expiry_day, derived from the stored result.
ColumnTypeRangeNotes
expiry_date date 2026-06-01 to 2026-06-30
expiry_label text 21 distinct values (Fri Jun 12, Fri Jun 26, Fri Jun 5…)
premium_prior_close number 0.89 to 5.44 US dollars
value_at_expiry number 0 to 16.48
pct_of_premium_left number 0 to 342 percent
spy_move_pct number -2.54 to 2.3 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 spy_by_day AS
(
    SELECT
        toDate(date)                             AS d,
        medianExact(toFloat64(underlying_close)) AS spot
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date >= toDate('2026-06-01')
      AND date <  toDate('2026-07-01')
      AND underlying_close > 0
    GROUP BY d
),
last_sessions AS
(
    SELECT
        toDate(expiration_date) AS exp_date,
        max(toDate(date))       AS prior_session
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND expiration_date >= toDate('2026-06-01')
      AND expiration_date <  toDate('2026-07-01')
      AND date >= toDate('2026-05-22')
      AND date <  expiration_date
      AND volume > 0
    GROUP BY exp_date
),
atm AS
(
    SELECT
        toDate(g.expiration_date)                                                                                AS exp_date,
        argMin(toFloat64(g.strike_price), abs(toFloat64(g.strike_price) - toFloat64(g.underlying_close)))        AS strike,
        argMin(toFloat64(g.option_close), abs(toFloat64(g.strike_price) - toFloat64(g.underlying_close)))        AS premium_before,
        argMin(toFloat64(g.underlying_close), abs(toFloat64(g.strike_price) - toFloat64(g.underlying_close)))    AS spy_before
    FROM global_markets.options_greeks AS g
    INNER JOIN last_sessions AS ls
        ON ls.exp_date = toDate(g.expiration_date) AND ls.prior_session = toDate(g.date)
    WHERE g.underlying_symbol = 'SPY'
      AND lower(toString(g.option_type)) IN ('call', 'c')
      AND g.date >= toDate('2026-05-22')
      AND g.date <  toDate('2026-07-01')
      AND g.volume > 0
      AND g.option_close > 0
    GROUP BY exp_date
)
SELECT
    toString(a.exp_date)                                                                   AS expiry_date,
    concat(formatDateTime(a.exp_date, '%a %b '), toString(toDayOfMonth(a.exp_date)))       AS expiry_label,
    round(a.premium_before, 2)                                                             AS premium_prior_close,
    round(greatest(s.spot - a.strike, 0.0), 2)                                             AS value_at_expiry,
    round(greatest(s.spot - a.strike, 0.0) / a.premium_before * 100, 0)                    AS pct_of_premium_left,
    round((s.spot / a.spy_before - 1) * 100, 2)                                            AS spy_move_pct
FROM atm AS a
INNER JOIN spy_by_day AS s
    ON s.d = a.exp_date
ORDER BY a.exp_date

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 analysisare-0dte-options-high-risk
greeks_ladder series 5×5 strike_gamma ranking 9×3 premium_ladder table 5×5 expiry_outcomes ranking 5×2 One SPY $600 LEAPS call's price over two years (expired Jan 16 2026) series 470×2 monthly series 241×4 See all 2,358 queries →