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

DTE Meaning in Options: Days to Expiration

DTE stands for days to expiration: calendar days, not trading days, until an option expires, and expiry day counts as zero. How to count it on a real chain.

DTE means days to expiration, the number of calendar days until an option contract expires. A "30 DTE" call expires in thirty days; a "0DTE" option expires the same day it is trading. It is the most-used shorthand in options conversation, and it compresses the most important fact about any option: how much time it has left. This page defines the term precisely, shows you how to work out the DTE of a real contract in your own chain, and measures, from the actual options tape, what DTE does to an option's price and where the market's volume sits along the spectrum.

What does DTE stand for?

Days to expiration (sometimes read as "days till expiry"). The convention is calendar days, not trading days, and the count runs to the contract's expiration date with the expiration day itself counting as zero: an option expiring this Friday is 2 DTE on Wednesday, 1 DTE on Thursday, and 0 DTE on Friday. Weekends and holidays sit inside the count, a Monday-expiry option is 3 DTE on Friday even though only one trading session remains. That mismatch matters more than it looks: an option's time value erodes across calendar days (the clock does not pause on Saturday), which is why weekend-spanning DTEs behave differently from the same count mid-week.

The number is not printed on the contract, it is derived from the expiration date, so it ticks down by one every day. Your broker's option chain is really a DTE ladder: the expiration tabs across the top are the same spectrum, just labeled with dates instead of day counts.

How to calculate DTE yourself

The arithmetic is one subtraction:

  1. Find the contract's expiration date. Every listed US option carries it in the symbol: O:SPY260710P00740000 reads SPY, then 260710 = 2026-07-10, then P for put, then the strike (740.000). Your broker shows the same date at the top of the chain tab.
  2. Subtract today's date from it, counting every calendar day, weekends and market holidays included.
  3. The answer is the DTE. Expiration day itself is 0; the day before is 1.

Nothing else is involved, no trading-day adjustment, no rounding. Here is the subtraction run on real contracts: the single most-traded SPY contract in each DTE band on the session of Wednesday, July 8, 2026, with the traded date and the expiration date parsed straight out of the symbol.

QueryDTE, worked on real contracts: SPY's most-traded option in each DTE band, July 8, 2026
option_tickertraded_onexpires_oncalendar_dtecontracts_traded
O:SPY260708C00745000July 8, 2026July 8, 20260677,981
O:SPY260709P00740000July 8, 2026July 9, 2026193,266
O:SPY260710P00740000July 8, 2026July 10, 2026256,299
O:SPY260717P00720000July 8, 2026July 17, 2026935,792
O:SPY260918P00650000July 8, 2026September 18, 20267242,388
O:SPY261016P00425000July 8, 2026October 16, 20261004,553
The exact SQL behind every number
SELECT argMax(contract, (vol, contract)) AS option_ticker,
       argMax(traded_on, (vol, contract)) AS traded_on,
       argMax(expires_on, (vol, contract)) AS expires_on,
       argMax(dte, (vol, contract)) AS calendar_dte,
       multiIf(max(vol) >= 1000000,
               concat(toString(intDiv(toUInt64(max(vol)), 1000000)), ',',
                      leftPad(toString(intDiv(toUInt64(max(vol)), 1000) % 1000), 3, '0'), ',',
                      leftPad(toString(toUInt64(max(vol)) % 1000), 3, '0')),
               max(vol) >= 1000,
               concat(toString(intDiv(toUInt64(max(vol)), 1000)), ',',
                      leftPad(toString(toUInt64(max(vol)) % 1000), 3, '0')),
               toString(toUInt64(max(vol)))) AS contracts_traded
FROM (
    SELECT ticker AS contract,
           replaceRegexpAll(formatDateTime(toDate(toTimeZone(window_start, 'America/New_York')), '%M %e, %Y'), '  ', ' ') AS traded_on,
           replaceRegexpAll(formatDateTime(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))), '%M %e, %Y'), '  ', ' ') AS expires_on,
           dateDiff('day',
                    toDate(toTimeZone(window_start, 'America/New_York')),
                    toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) AS dte,
           multiIf(dte = 0, '0 DTE', dte = 1, '1 DTE', dte <= 7, '2-7 DTE',
                   dte <= 30, '8-30 DTE', dte <= 90, '31-90 DTE', '91+ DTE') AS bucket,
           sum(volume) AS vol
    FROM global_markets.options_minute_aggs
    WHERE ticker LIKE 'O:SPY2%'
      AND window_start >= '2026-07-08 04:00:00'
      AND window_start < '2026-07-09 04:00:00'
    GROUP BY contract, traded_on, expires_on, dte, bucket
    HAVING dte >= 0
)
GROUP BY bucket
ORDER BY min(dte)
Run this yourself

Read the 1 DTE row: O:SPY260709P00740000 traded on July 8, 2026 and expires on July 9, 2026, one calendar day apart, so it is 1 DTE, and 93,266 contracts changed hands in it. The leader of the 31-90 DTE band, O:SPY260918P00650000, expires September 18, 2026, 72 calendar days from the same trade date. Same subtraction, same chain, wildly different instruments.

Where the volume actually sits, by DTE

One full session of every listed US option, bucketed by how many days each traded contract had left:

QueryOptions volume by days to expiration: every US option traded July 8, 2026
bucketcontracts_mmpct_of_volume
0 DTE (expires today)24.3438.9
1 DTE2.764.4
2-7 DTE11.618.5
8-30 DTE12.1819.5
31-90 DTE6.6410.6
91+ DTE5.078.1
The exact SQL behind every number
SELECT multiIf(dte = 0, '0 DTE (expires today)',
               dte = 1, '1 DTE',
               dte <= 7, '2-7 DTE',
               dte <= 30, '8-30 DTE',
               dte <= 90, '31-90 DTE',
               '91+ DTE') AS bucket,
       round(sum(vol) / 1e6, 2) AS contracts_mm,
       round(100.0 * sum(vol) / sum(sum(vol)) OVER (), 1) AS pct_of_volume
FROM (
    SELECT toFloat64(volume) AS vol,
           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 >= '2026-07-08 04:00:00'
      AND window_start < '2026-07-09 04:00:00'
)
WHERE dte >= 0
GROUP BY bucket
ORDER BY min(dte)
Run this yourself

The tape is startlingly front-loaded: 38.9% of the day's contract volume was 0 DTE, options in their final hours, against 8.1% for everything 91 days out or longer. The summary receipt puts a number on the whole front of the curve:

QueryThe front of the curve: share of July 8, 2026 volume within a week of expiry
pct_week_or_lesspct_31_dte_plustotal_contracts_mm
61.818.762.6
The exact SQL behind every number
SELECT round(100.0 * sumIf(vol, dte <= 7) / sum(vol), 1) AS pct_week_or_less,
       round(100.0 * sumIf(vol, dte >= 31) / sum(vol), 1) AS pct_31_dte_plus,
       round(sum(vol) / 1e6, 1) AS total_contracts_mm
FROM (
    SELECT toFloat64(volume) AS vol,
           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 >= '2026-07-08 04:00:00'
      AND window_start < '2026-07-09 04:00:00'
)
WHERE dte >= 0
Run this yourself

61.8% of the session's 62.6 million contracts had a week or less to live; only 18.7% had more than a month. The 0DTE phenomenon gets the headlines, but the broader pattern is that options volume as a whole crowds toward expiry, where premiums are smallest, decay is fastest, and every position resolves within days. Volume is not the same thing as positioning, though: open interest counts the contracts still held overnight, and it skews longer. Stack that same open interest by strike instead of by expiration and you get max pain, the strike where option holders as a group would collect the least if settlement landed there.

What DTE does to an option's price

Time is the raw material an option is made of, and DTE is how much of it you are buying. To isolate that, hold everything else fixed, the same underlying, an at-the-money strike, the same half-hour of the same session, and vary only the expiration date. The panel below picks, for a ladder of target lifespans, the SPY call whose strike sat closest to where SPY was trading around midday on July 8, 2026.

QueryThe price of time: at-the-money SPY call price by DTE, midday July 8, 2026
days_to_expirationatm_call_pricepremium_per_remaining_day
0 DTE1.651.65
1 DTE2.922.92
2 DTE3.841.92
7 DTE6.090.87
14 DTE9.250.66
30 DTE13.850.46
54 DTE18.840.35
84 DTE24.080.29
176 DTE41.870.24
344 DTE68.340.2
891 DTE125.640.14
The exact SQL behind every number
WITH spot AS (
    SELECT avg(close) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-07-08 11:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-08 13:00:00', 'America/New_York')
),
chain AS (
    SELECT toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,
           toFloat64(substring(ticker, length(ticker) - 7, 8)) / 1000 AS strike,
           avg(close) AS opt_px
    FROM global_markets.options_minute_aggs
    WHERE ticker LIKE 'O:SPY2%'
      AND substring(ticker, length(ticker) - 8, 1) = 'C'
      AND window_start >= toDateTime('2026-07-08 11:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-08 13:00:00', 'America/New_York')
    GROUP BY expiry, strike
    HAVING sum(volume) > 0
       AND abs(strike - (SELECT px FROM spot)) <= 3
       AND dateDiff('day', toDate('2026-07-08'), expiry) >= 0
),
atm AS (
    SELECT dateDiff('day', toDate('2026-07-08'), expiry) AS dte,
           argMin(opt_px, (abs(strike - (SELECT px FROM spot)), strike)) AS call_price
    FROM chain
    GROUP BY expiry
),
targets AS (
    SELECT arrayJoin([0, 1, 2, 7, 14, 30, 60, 90, 180, 365, 730]) AS target
),
nearest AS (
    SELECT argMin(dte, (abs(dte - target), dte)) AS pick_dte,
           argMin(call_price, (abs(dte - target), dte)) AS pick_px
    FROM targets CROSS JOIN atm
    GROUP BY target
)
SELECT concat(toString(pick_dte), ' DTE') AS days_to_expiration,
       round(pick_px, 2) AS atm_call_price,
       round(pick_px / greatest(pick_dte, 1), 2) AS premium_per_remaining_day
FROM nearest
GROUP BY days_to_expiration, atm_call_price, premium_per_remaining_day, pick_dte
ORDER BY pick_dte
Run this yourself

The at-the-money call expiring that afternoon cost $1.65. The one expiring the next day cost $2.92; a week out, $6.09; a month out, $13.85; and the longest-dated contract on the ladder, 891 DTE, cost $125.64. Notice what the price is not: proportional to time. Roughly thirty times the calendar life of the same-day option carried nowhere near thirty times its price.

The right-hand column turns that into the number traders actually feel, premium divided by remaining calendar days. At 891 DTE the buyer paid $0.14 for each remaining day of optionality; at 7 DTE, $0.87; at 2 DTE, $1.92. Time gets steadily more expensive per day as the expiration date closes in, that steepening is what "theta accelerates" means, and this column is the receipt for it. (The 0 DTE row is the table's one exception, for a mechanical reason: measured at midday it had a few hours of life left rather than a whole day, so dividing its premium by "one day" understates its true per-day burn.)

Which tickers actually offer 0DTE options?

Not every underlying has a same-day contract to trade. The chains carrying near-daily expirations are a short list, the big index ETFs and a handful of mega-cap names. Six household tickers, same session:

QueryDTE menus compared: expirations traded and 0DTE share by underlying, July 8, 2026
underlyingexpiries_tradedshortest_dtelongest_dtepct_0dtecontracts_mm
SPY35089170.111.96
QQQ33089171.57.35
TSLA230891622.62
IWM33089146.61.89
AAPL25089161.81.51
KO16256200.04
The exact SQL behind every number
SELECT underlying,
       uniqExact(expiry) AS expiries_traded,
       min(dte) AS shortest_dte,
       max(dte) AS longest_dte,
       round(100.0 * sumIf(vol, dte = 0) / sum(vol), 1) AS pct_0dte,
       round(sum(vol) / 1e6, 2) AS contracts_mm
FROM (
    SELECT splitByChar(':', ticker)[2] AS raw,
           substring(raw, 1, length(raw) - 15) AS underlying,
           toFloat64(volume) AS vol,
           toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,
           dateDiff('day', toDate(toTimeZone(window_start, 'America/New_York')), expiry) AS dte
    FROM global_markets.options_minute_aggs
    WHERE (ticker LIKE 'O:SPY2%' OR ticker LIKE 'O:QQQ2%' OR ticker LIKE 'O:IWM2%'
           OR ticker LIKE 'O:AAPL2%' OR ticker LIKE 'O:TSLA2%' OR ticker LIKE 'O:KO2%')
      AND window_start >= '2026-07-08 04:00:00'
      AND window_start < '2026-07-09 04:00:00'
)
WHERE dte >= 0
GROUP BY underlying
ORDER BY contracts_mm DESC
Run this yourself

SPY traded 35 distinct expiration dates in that one session, from 0 DTE out to 891 DTE, same-day options and multi-year LEAPS on a single chain, and 70.1% of its volume was in same-day contracts. QQQ and TSLA also had contracts expiring that Wednesday (71.5% and 62% of their volume). KO did not: its nearest expiry sat 2 days out, and 0% of its volume was 0 DTE. Its chain lists Fridays, so on a Wednesday no same-day contract exists to buy.

That is the practical answer to "can I trade 0DTE on my stock?", look in the chain for an expiration dated today. Index ETFs list one nearly every trading day; a mid-cap or a sleepy dividend name typically offers weekly Fridays and monthlies, and nothing shorter. When options expire maps the full calendar, and triple witching covers the quarterly pile-up.

Has the front of the curve always been this crowded?

No, the crowding is recent, and it is measurable. The same five-session mid-June window, SPY options only, one year at a time:

Query0DTE's rise: same-day share of SPY option volume, June 8-12 of each year
yearpct_0dtepct_week_or_lessspy_contracts_mm
202020.261.731.1
202118.668.312.7
202230.376.221.6
202344.280.722.7
202450.179.719.6
20256085.730.4
202669.589.971.9
The exact SQL behind every number
SELECT year,
       round(100.0 * sumIf(vol, dte = 0) / sum(vol), 1) AS pct_0dte,
       round(100.0 * sumIf(vol, dte <= 7) / sum(vol), 1) AS pct_week_or_less,
       round(sum(vol) / 1e6, 1) AS spy_contracts_mm
FROM (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
           toFloat64(volume) AS vol,
           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 ticker LIKE 'O:SPY2%'
      AND toMonth(toTimeZone(window_start, 'America/New_York')) = 6
      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 8 AND 12
      AND toYear(toTimeZone(window_start, 'America/New_York')) >= 2020
)
WHERE dte >= 0
GROUP BY year
ORDER BY year
Run this yourself

In 2020, same-day contracts were 20.2% of SPY's option volume in that window. By 2023 they were 44.2%, and in 2026 they reached 69.5%. The climb is not perfectly monotonic: 2021 came in at 18.6%, under 2020's reading. From 2022 onward every June sample prints above the one before it. Contracts with a week or less to run went from 61.7% to 89.9% over the same span, on 71.9 million SPY contracts in the latest window. The DTE conversation is louder than it was five years ago, and the tape agrees.

Choosing a DTE for your strategy

There is no correct DTE, only trade-offs, and they are mechanical. Short DTE means cheap premium, fast decay, and outsized sensitivity to small moves near the strike. Long DTE means expensive premium, slow decay, and behavior closer to the stock itself. The market's shared dialect:

  • 0-1 DTE (same-day and overnight). The smallest premium on the board, total time-value burn by the close, all-or-nothing outcomes. This is where the volume lives, and where an adverse move leaves no time to recover.
  • Weeklies, 2-7 DTE. Days rather than hours of room. A common home for short-dated credit spreads; still deep in the steep part of the decay curve above.
  • 30-45 DTE. The conventional band for premium selling, covered calls, cash-secured puts. Commonly cited as the balance point where decay is meaningful but not frantic, and where a position can be managed rather than simply endured. On the July 8 ladder the 30 DTE at-the-money call cost $13.85 against $1.65 for the same-day strike: a month of clock at $0.46 per remaining day.
  • LEAPS, roughly 365 DTE and beyond. Priced mostly on the underlying's long-run move rather than the ticking clock, the cheapest time on the board per remaining day ($0.14 at 891 DTE), and the largest cash outlay up front.

None of these bands is a rule. They describe how the market talks, and, per the volume data above, which dialects are actually spoken. Whichever band you pick, trading costs stack on top of the premium: what it costs to trade options breaks down the per-contract bill.

FAQ

How do you calculate DTE?

Subtract today's date from the contract's expiration date and count every calendar day in between, weekends and holidays included. Expiration day is zero. On July 8, 2026, the most-traded SPY contract in the 2-7 DTE band, O:SPY260710P00740000, expired July 10, 2026, 2 calendar days out, making it 2 DTE that day.

What does 0 DTE mean?

An option trading on its own expiration day, zero days to expiration. It stops trading at that day's close and settles worthless or in the money the same evening. On July 8, 2026, 0 DTE contracts alone were 38.9% of all US options volume, what is 0DTE covers the phenomenon in depth.

Is DTE counted in calendar days or trading days?

Calendar days, by near-universal convention. Weekends and holidays count, and time value erodes through them, a 3 DTE option on Friday (expiring Monday) has one trading session left but three days of clock.

What DTE is best for options trading?

There is no single best DTE; the choice sets the trade-off. Short-dated contracts are cheap and burn fast, the at-the-money SPY call expiring the same afternoon cost $1.65 on July 8, 2026, while longer-dated ones cost far more up front and far less per day of life ($0.14 per remaining day at 891 DTE). Premium sellers conventionally work the 30-45 DTE band; buyers who want time on their side go longer.

What DTE do most options traders trade?

The measured answer for July 8, 2026: 61.8% of contract volume sat at 7 DTE or less, with 38.9% at 0 DTE alone. Longer-dated activity exists, 18.7% of volume was 31+ DTE, but the market's center of gravity is the front of the curve, and it has moved further front in every June sample since 2022.


Every number above is a stored, versioned query over the full options tape, expand any panel's SQL, or slice the DTE spectrum for any underlying on the Strasmore terminal.