Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-08-11

What Is 0DTE? Zero Days to Expiry Options

0DTE options expire the same day they trade, zero days to expiry. What DTE means, how traders build a 0DTE trade, and one real contract traced to the bell.

0DTE options are contracts trading on their last day of life, zero days to expiration, expiring at that afternoon's close. Any listed option becomes 0DTE on its expiry date; the label took hold once the biggest index products began listing a contract that expires every trading day. On Monday, July 6, 2026, same-day-expiring contracts carried 38.8% of all US options volume. Everything below is measured from the tape, one real contract included.

What does 0DTE mean?

DTE is trader shorthand for days to expiration: the calendar days until an option expires. A 30-DTE option has a month of life left; a 0-DTE option, "zero days to expiry," a same-day option, a "daily", expires today. At the close an in-the-money option is exercised or cash-settled; an out-of-the-money option lapses with no value.

0DTE is not a separate product: the SPY call that was a 30-DTE contract in early June is 0-DTE on its final trading day. The full ladder of expiries sits in what DTE means in options. Volume here counts contracts traded, not positions held, see options volume vs. open interest.

Which options expire every day?

For decades, listed US stock options expired once a month, on the third Friday; weekly Fridays spread through the 2000s and 2010s. In 2022 the exchanges completed the calendar for the biggest index products: Cboe added Tuesday and Thursday S&P 500 (SPX) expirations that spring, and Tuesday/Thursday listings for the SPY and QQQ ETFs followed in November. Since late 2022 SPX, SPY and QQQ have listed an expiration for every trading day of the week; the Russell 2000 ETF (IWM) expires daily too. Single stocks kept the old rhythm, so a Friday was once the only day a stock option could be 0DTE.

What share of options volume is 0DTE?

The panel buckets every contract traded that Monday, a verified full session, receipts in the data notes, by its days to expiration, parsed from the OCC ticker.

QueryJuly 6, 2026: whole-tape options volume by days to expiry
The exact SQL behind every number
SELECT multiIf(dte = 0, '0 (expires today)',
               dte = 1, '1 day',
               dte <= 7, '2-7 days',
               dte <= 30, '8-30 days',
               '31+ days') AS days_to_expiry,
       round(sum(volume) / 1e6, 2) AS contracts_mm,
       round(100.0 * sum(volume) / sum(sum(volume)) OVER (), 1) AS pct_of_volume
FROM (
    SELECT toFloat64(volume) AS volume,
           dateDiff('day',
                    toDate(toTimeZone(window_start, 'America/New_York')),
                    toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) AS dte
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 08:00:00')
      AND window_start < toDateTime('2026-07-07 04:00:00')
      AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2026-07-06')
)
WHERE dte >= 0
GROUP BY days_to_expiry
ORDER BY min(dte)
Run this yourself

Same-day contracts were the largest bucket: 23.52 million, 38.8% of the session's 60.64 million total, ahead of the 18.6% that traded more than a month from expiry. The quietest bucket sits next door: contracts with one day left drew 4.5%. Short-dated activity concentrates into the expiry session itself, not the day before.

Now a full month:

QueryJune 2026: whole-month options volume and its same-day-expiry share
The exact SQL behind every number
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / 1e6, 1) AS zero_dte_contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')
Run this yourself

Across 21 June sessions and 1477.9 million contracts, 506.3 million, 34.3%, traded on the day they expired. Our first-half 2026 market recap ran that scan month by month and measured the same-day share climbing from its January level to its June high.

How traders structure a 0DTE trade

"Trading 0DTE" is not one trade. Four structures cover most of the tape, each a combination of same-day calls and puts. Definitions only, not recommendations.

  • Single-leg directional. Buy a same-day call (it pays off above the strike) or a put (below it). The most a buyer can lose is the premium paid; the contract is worth zero at the close unless it finishes in the money.
  • Credit spread (vertical). Sell one option and buy a cheaper, further-out-of-the-money one of the same type and expiry. The seller collects the difference, the credit, and keeps it if the underlying finishes on the right side; the long leg caps the loss at the strike gap minus that credit ("defined risk").
  • Iron condor. Two credit spreads at once: a call spread above the market, a put spread below. The trader keeps both credits if the underlying closes between the short strikes, and the loss is capped either way, settled at that afternoon's bell.
  • Gamma scalping. Trading the underlying against an options position to stay delta-neutral as its sensitivity swings. On expiry day those swings are fastest and the hedging most frequent, one reason market makers are so active in same-day contracts.

Every leg pays a bid-ask spread and a fee going in and coming out, what it costs to trade options measures that bill, and a condor pays it four times.

Why 0DTE options move so fast: theta and gamma

Two terms from options math carry most of the difference, mechanics of the contract, not anyone's forecast.

Theta is time decay. An option's price has two parts: intrinsic value (what exercising it would be worth now) and time value (the premium for what might still happen). Time value must reach zero at expiration; on the final day whatever remains burns off over hours, not weeks.

Gamma is how fast an option's delta, its sensitivity to the underlying's price, changes. Near expiry, an at-the-money delta swings quickly between near zero and near one as the underlying crosses the strike.

Theta, gamma, and delta are three of the option Greeks, the standard sensitivities every options desk quotes. For the full set measured on real tape, start with the option Greeks, explained, then the deep dives on theta, gamma, and delta.

Both, on the tape. Of every same-day SPY contract traded that Monday, the two busiest were the $751 call (1.08 million contracts) and the $750 put (0.99 million); the ranking sits in the data notes below. The panel samples both every thirty minutes against SPY's distance from the $751 strike. SPY opened at $748.74.

QueryOne 0DTE contract, all day: SPY's busiest same-day call and put, July 6, 2026
The exact SQL behind every number
SELECT formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_time,
       round(anyIf(close, ticker = 'O:SPY260706C00751000'), 2) AS call_751_price,
       round(anyIf(close, ticker = 'O:SPY260706P00750000'), 2) AS put_750_price,
       round(anyIf(close, ticker = 'SPY') - 751, 2) AS spy_vs_751_strike
FROM (
    SELECT window_start, ticker, close
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-06 16:01:00', 'America/New_York')
      AND ticker IN ('O:SPY260706C00751000', 'O:SPY260706P00750000')
    UNION ALL
    SELECT window_start, ticker, close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-06 16:01:00', 'America/New_York')
      AND ticker = 'SPY'
)
WHERE toMinute(window_start) % 30 = 0
GROUP BY et_time, window_start
ORDER BY window_start
Run this yourself

At the 09:30 open the call traded at $0.7 and the put at $1.88, SPY sitting $-1.75 from the strike (the third column). One contract covers 100 shares: tens of dollars of premium against 100 shares of an ETF trading near $748.74. That is the leverage.

Theta runs the middle of the day. At 11:30 the call was $0.57 and the put $0.48, SPY $-0.29 from the strike. Two hours later, at 13:30, SPY was still within a dollar of it ($-0.52), and the call had slipped to $0.42, the put sitting about where it began at $0.47. The call held no intrinsic value at either sample and SPY ended the stretch where it started: the clock alone took the premium down.

Gamma runs the afternoon. SPY crossed above the $751 strike after 14:00 and finished $0.47 above it, well under half a percent in the ETF. Over that stretch the call ran from $0.29 to $1.29 at 15:30 and the put fell from $0.52 to $0.03: a small move in the index, a triple-digit percentage gain in the call and a near-total collapse in the put, opposite directions in the same afternoon.

What happens at the 4 p.m. close?

At the bell the arithmetic is simple: a same-day contract is worth its intrinsic value, or nothing. The 16:00 row above is the closing minute, the call printed $0.57, near the $0.47 of intrinsic value it settled with; the put, with SPY above its $750 strike, printed $0.01. Widen that to every same-day SPY strike, sorted against SPY's $751.47 close:

QueryHow July 6's same-day SPY contracts finished: out of the money vs. in the money
The exact SQL behind every number
WITH (
    SELECT round(argMax(close, window_start), 2)
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-06 16:01:00', 'America/New_York')
) AS spy_close
SELECT if(expired_at_zero, 'Out of the money at the close (expired at zero)',
                           'In the money at the close (settled with value)') AS at_the_bell,
       count() AS contracts,
       round(sumIf(vol, opt_type = 'C') / 1e6, 2) AS call_contracts_mm,
       round(sumIf(vol, opt_type = 'P') / 1e6, 2) AS put_contracts_mm,
       round(100.0 * sum(vol) / sum(sum(vol)) OVER (), 1) AS pct_of_spy_zero_dte_volume
FROM (
    SELECT substring(ticker, length(ticker) - 8, 1) AS opt_type,
           toFloat64(substring(ticker, length(ticker) - 7, 8)) / 1000 AS strike,
           (opt_type = 'C' AND strike > spy_close) OR (opt_type = 'P' AND strike < spy_close) AS expired_at_zero,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 08:00:00')
      AND window_start < toDateTime('2026-07-07 04:00:00')
      AND startsWith(ticker, 'O:SPY260706')
    GROUP BY ticker, opt_type, strike, expired_at_zero
)
GROUP BY expired_at_zero
ORDER BY expired_at_zero DESC
Run this yourself

86 of the day's SPY strikes finished out of the money and expired at zero, carrying 66.9% of the session's same-day SPY volume, 3.91 million puts and 1.78 million calls. The 33.1% that finished in the money spread across 163 strikes.

Read that in both directions: every contract in the top row was a total loss for whoever was long it at the bell, and the whole premium kept by whoever was short it. Volume is not ownership, the tape cannot say who held these contracts at 4 p.m. It does say that the majority of the session's same-day SPY volume sat in contracts that ended worth nothing. Ask which closing price would have left the most of the chain worthless and you are computing max pain, the strike where option holders as a group collect the least at expiry. For the size of both tails, the best and worst thousand dollars of June 2026 ran a month's hindsight ledger.

Settlement differs by product: SPY, QQQ and single-stock options settle in shares, so an in-the-money contract held through expiry becomes a stock position: one $751 SPY call delivers 100 shares at that strike. SPX options settle in cash.

Which tickers dominate 0DTE trading?

Every option ticker embeds a root, the product it belongs to. The panel ranks roots by same-day volume.

QueryJuly 6, 2026: top roots by same-day-expiry options volume
The exact SQL behind every number
SELECT root AS underlying,
       round(sum(volume) / 1e6, 2) AS zero_dte_contracts_mm,
       round(100.0 * sum(volume) / sum(sum(volume)) OVER (), 1) AS pct_of_zero_dte_volume
FROM (
    SELECT substring(ticker, 3, length(ticker) - 17) AS root,
           toFloat64(volume) AS volume
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 08:00:00')
      AND window_start < toDateTime('2026-07-07 04:00:00')
      AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2026-07-06')
      AND toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))
)
WHERE root != 'SPCX'
GROUP BY root
ORDER BY sum(volume) DESC
LIMIT 8
Run this yourself

The two biggest index ETFs top the list: SPY carried 36.1% of the session's same-day volume (8.49 million contracts), QQQ another 21.2%. SPXW, the root for weekly, cash-settled S&P 500 index options, printed 11.3%, IWM 3.5%. The notable part: TSLA was the largest single-stock same-day root at 11.9%, with NVDA, AAPL and META behind it, on a Monday, a day no stock option would have expired under the old Friday-only convention.

Who trades 0DTE options, and when?

The tape records contracts, prices, sizes and times, never identities. Exchanges and regulators describe the flow as a mix: institutional desks running spreads and hedges, retail traders taking directional positions. The when is measurable, when 0DTE options trade finds same-day flow fastest in the opening half hour, not the last.

Data notes: session and parse receipts

SPY printed 390 regular-session minute bars on July 6, a complete 9:30-to-4:00 session, opening at $748.74 and closing at $751.47. Options volume whose expiry failed to parse from the OCC ticker: 0%. Volume on contracts past their expiry: 0%. Timestamps are UTC, converted to Eastern before any date comparison; the contract-path panel reads minute-bar closes (last-trade prints, not quoted mids).

The two contracts the theta/gamma section follows are the busiest same-day SPY strikes of the session, ranked here by contracts traded.

QueryJuly 6, 2026: SPY's two busiest same-day contracts
The exact SQL behind every number
SELECT if(opt_type = 'P', 'Put', 'Call') AS side,
       toString(intDiv(strike_thousandths, 1000)) AS strike,
       round(contracts / 1e6, 2) AS contracts_mm
FROM (
    SELECT substring(ticker, length(ticker) - 8, 1) AS opt_type,
           toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)) AS strike_thousandths,
           sum(toFloat64(volume)) AS contracts
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-07-06 08:00:00')
      AND window_start < toDateTime('2026-07-07 04:00:00')
      AND startsWith(ticker, 'O:SPY260706')
    GROUP BY ticker, opt_type, strike_thousandths
    ORDER BY contracts DESC
    LIMIT 2
)
ORDER BY contracts DESC
Run this yourself
QueryThe receipt: July 6, 2026 session completeness and OCC parse coverage
The exact SQL behind every number
WITH (
    SELECT countIf(window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
               AND window_start < toDateTime('2026-07-06 16:00:00', 'America/New_York'))
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-07-06 00:00:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-07 00:00:00', 'America/New_York')
) AS spy_bars,
(
    SELECT round(argMin(open, window_start), 2)
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-06 16:01:00', 'America/New_York')
) AS spy_open,
(
    SELECT round(argMax(close, window_start), 2)
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-07-06 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-06 16:01:00', 'America/New_York')
) AS spy_close
SELECT spy_bars AS spy_session_bars_jul06,
       spy_open AS spy_open_jul06,
       spy_close AS spy_close_jul06,
       round(sum(toFloat64(volume)) / 1e6, 2) AS total_contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) IS NULL) / sum(toFloat64(volume)), 2) AS unparsable_expiry_pct,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) < toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 2) AS past_expiry_pct
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-07-06 08:00:00')
  AND window_start < toDateTime('2026-07-07 04:00:00')
  AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2026-07-06')
Run this yourself

0DTE options FAQ

What are zero days to expiry (0DTE) options?

Zero days to expiry, 0DTE, is an option trading on its own expiration date: at that day's close it is exercised for its intrinsic value or it lapses at zero. "Zero days to expiration," "same-day options" and "dailies" name the same thing, a stage of any contract's life, not a product. SPX, SPY, QQQ and IWM list one every trading day; every optionable stock has them on its expiration Fridays.

What share of options volume is 0DTE?

Across the US options tape, contracts traded on their own expiry day were 34.3% of June 2026's volume, 506.3 million of 1477.9 million contracts. On Monday, July 6, 2026, the same-day share printed 38.8%.

Do I need special approval to trade 0DTE options?

Yes. 0DTE contracts sit inside a broker's ordinary options-approval process, which runs in levels: buying calls and puts at a lower level, spreads and condors higher, uncovered (naked) selling higher still, generally with a margin account and a minimum balance. Buying and selling the same contract within one session is a day trade, so a frequent 0DTE trader falls under the US pattern-day-trader rule: four or more day trades in five business days requires $25,000 of margin-account equity. Levels vary by broker.

Are 0DTE options riskier than longer-dated options?

They compress the same outcomes into one session: time value decays within hours, gamma is highest near the strike, and an out-of-the-money contract expires with no value at the close, a total loss of the premium. FINRA investor guidance flags short-dated options trading.


Every panel above is a stored query, expand the SQL under any table, or ask the same question in plain English on the Strasmore terminal.