Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-07-25

DTE meaning for options: days to expiration

DTE na days to expiration: calendar days, no be trading days, wey remain before one option expire, and expiry day na zero. See how to count am for real chain.

DTE mean days to expiration — di number of calendar days wey remain before one option contract expire. One "30 DTE" call go expire for thirty days time; one "0DTE" option go expire di same day wey dem dey trade am. Na di most common shorthand wey dem dey use for options gist, and e dey pack di most important fact about any option: how much time e still get. Dis page go define di term well-well, show you how to calculate di DTE of one real contract for your own chain, and measure — from di actual options tape — wetin DTE dey do to option price and where di market volume dey sit along di spectrum.

Wetin DTE mean?

Days to expiration (some people dey call am "days till expiry"). The rule na calendar days, no be trading days, and the count dey run go the contract expiration date, with the expiration day itself dey count as zero: one option wey dey expire this Friday na 2 DTE on Wednesday, 1 DTE on Thursday, and 0 DTE on Friday. Weekends and holidays dey inside the count — one Monday-expiry option na 3 DTE on Friday even though only one trading session remain. That mismatch matter pass as e look: the time value of one option dey erode across calendar days (the clock no dey pause on Saturday), na why weekend-spanning DTEs dey behave different from the same count for mid-week.

Dem no dey print the number for the contract — e dey come from the expiration date, so e dey tick down by one every day. Your broker option chain na really DTE ladder: the expiration tabs wey dey across the top na the same spectrum, just label with dates instead of day counts.

How to calculate DTE by yourself

The maths na just one subtraction:

  1. Find the expiration date of the contract. Every US option wey dey listed get am inside the symbol: O:SPY260710P00740000 dey read SPY, then 260710 = 2026-07-10, then P for put, then the strike (740.000). Your broker go show the same date for the top of the chain tab.
  2. Subtract today date from am, count every calendar day — weekends and market holidays dey inside.
  3. The answer na the DTE. Expiration day itself na 0; the day before na 1.

Nothing else dey involved — no trading-day adjustment, no rounding. Na so the subtraction run for real contracts: the single SPY contract wey dem trade pass for each DTE band for the session of Wednesday, July 8, 2026, with the traded date and the expiration date wey dem parse straight from the symbol.

QueryDTE, wey dem trade real contracts — SPY option wey dem trade pass for each DTE band, July 8, 2026
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)

Read the 1 DTE row: O:SPY260709P00740000 trade for July 8, 2026 and e expire for July 9, 2026, one calendar day apart, so e be 1 DTE, and 93,266 contracts change hand inside am. The leader of the 31-90 DTE band, O:SPY260918P00650000, expire September 18, 202672 calendar days from the same trade date. Same subtraction, same chain, instruments wey dey different well well.

Where di volume dey siddon, by DTE

One full session of every listed US option, wey dem group by how many days each traded contract still get:

QueryOptions volume by days to expiration — every US option wey dem trade July 8, 2026
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)

Di tape dey shockingly front-loaded: 38.9% of di day contract volume na 0 DTE — options for dia final hours — against 8.1% for everitin wey be 91 days out or longer. Di summary receipt put number for di whole front of di curve:

QueryFront of the curve — share of July 8, 2026 volume wey dey within one week of expiry
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

61.8% of di session 62.6 million contracts get one week or less to live; only 18.7% get pass one month. Di 0DTE mata dey get headlines, but di broader pattern be say options volume as a whole dey crowd toward expiry — where premiums dey smallest, decay dey fastest, and every position dey resolve within days. Volume no be di same tin as positioning, sha: open interest dey count di contracts wey dem still hold overnight, and e dey skew different.

Wetin DTE dey do to option price

Time na di raw material wey dem take make option, and DTE na how much of am you dey buy. To separate dat one, hold everi oda tin steady — di same underlying, one at-the-money strike, di same half-hour of di same session — and only change di expiration date. Di panel wey dey below pick, for one ladder of target lifespans, di SPY call wey im strike siddon closest to where SPY dey trade around midday on July 8, 2026.

QueryPrice of time — at-the-money SPY call price by DTE, midday July 8, 2026
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

Di at-the-money call wey expire dat afternoon cost $1.65. Di one wey expire di next day cost $2.92; one week out, $6.09; one month out, $13.85; and di longest-dated contract on di ladder, 891 DTE, cost $125.64. Notice wetin di price no be: e no dey proportional to time. Roughly thirty times di calendar life of di same-day option no carry anytin near thirty times im price.

Di right-hand column turn dat one into di number wey traders actually dey feel — premium divide by remaining calendar days. At 891 DTE di buyer pay $0.14 for each remaining day of optionality; at 7 DTE, $0.87; at 2 DTE, $1.92. Time dey steadily get more expensive per day as di expiration date dey close in — dat steepening na wetin "theta accelerates" mean, and dis column na di receipt for am. (Di 0 DTE row na di table one exception, for one mechanical reason: measured at midday e get few hours of life left instead of one whole day, so dividing im premium by "one day" understate im true per-day burn.)

Which tickers dey really get 0DTE options?

No be every underlying get same-day contract wey you fit trade. The chains wey dey carry near-daily expirations na short list — the big index ETFs and some mega-cap names. Six household tickers, same session:

QueryDTE menus wey dem compare — expirations wey dem trade and 0DTE share by underlying, July 8, 2026
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

SPY trade 35 distinct expiration dates for that one session — from 0 DTE go reach 891 DTE, same-day options and multi-year LEAPS for one single chain — and 70.1% of im volume na for same-day contracts. QQQ and TSLA sef get contracts wey expire that Wednesday (71.5% and 62% of their volume). KO no get: im nearest expiry dey 2 days out, and 0% of im volume na 0 DTE. Im chain dey list Fridays, so for Wednesday, no same-day contract dey to buy.

That na the practical answer to "I fit trade 0DTE for my stock?" — check inside the chain for expiration wey date na today. Index ETFs dey list one almost every trading day; mid-cap or sleepy dividend name dey normally offer weekly Fridays and monthlies, and nothing shorter. When options expire dey map the full calendar, and triple witching dey cover the quarterly pile-up.

Di front of di curve don always dey dis crowded?

No — di crowding na recent tin, and dem fit measure am. Di same five-session mid-June window, SPY options only, one year at a time:

QueryHow 0DTE dey rise — same-day share of SPY option volume, June 8-12 of each year
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

For 2020, same-day contracts na 20.2% of SPY option volume for dat window. By 2023 dem don reach 44.2%, and for 2026 dem hit 69.5%. Di climb no dey perfectly monotonic: 2021 come in at 18.6%, under 2020 own reading. From 2022 go forward, every June sample dey print above di one before am. Contracts wey get one week or less to run move from 61.7% to 89.9% over di same period, on top 71.9 million SPY contracts for di latest window. Di DTE conversation loud pass wetin e be five years ago, and di tape agree.

How to choose DTE for your strategy

No correct DTE dey — na only trade-offs, and dem be mechanical. Short DTE mean cheap premium, fast decay, and e dey react big time to small moves near the strike. Long DTE mean expensive premium, slow decay, and e dey behave almost like the stock sef. The market common language:

  • 0-1 DTE (same-day and overnight). Na the smallest premium wey dey for board, total time-value burn by close, all-or-nothing results. Na here volume dey live — and na here one bad move no dey give you time to recover.
  • Weeklies, 2-7 DTE. You get days instead of hours to breathe. Na common place for short-dated credit spreads; e still dey deep for the steep part of the decay curve above.
  • 30-45 DTE. Na the normal range for premium selling — covered calls, cash-secured puts. Dem dey often talk am as the balance point where decay dey matter but e no dey rush you, and where you fit manage position instead of just dey suffer am. For the July 8 ladder, the 30 DTE at-the-money call cost $13.85 against $1.65 for the same-day strike: na one month of clock at $0.46 per remaining day.
  • LEAPS, roughly 365 DTE and beyond. Dem price am mostly on the underlying long-run move instead of the ticking clock — na the cheapest time for board per remaining day ($0.14 at 891 DTE), and na the biggest cash wey you go drop up front.

None of these bands na rule. Dem just dey describe how the market dey talk — and, based on the volume data above, which dialects dem actually dey speak. Any band wey you pick, trading costs go add on top of the premium: wetin e cost to trade options dey break down the per-contract bill.

FAQ

How una dey calculate DTE?

Comot today date from di contract expiration date, den count everi calendar day wey dey between, weekends and holidays join body. Expiration day na zero. For July 8, 2026, di SPY contract wey dem trade pass for di 2-7 DTE band, O:SPY260710P00740000, expire for July 10, 2026 — na 2 calendar days out, wey make am 2 DTE dat day.

Wetin 0 DTE mean?

Na option wey dey trade for im own expiration day — zero days to expiration. E dey stop to trade for dat day close, den e go settle as worthless or in the money dat same evening. For July 8, 2026, 0 DTE contracts alone na 38.9% of all US options volume — wetin be 0DTE cover di mata well-well.

Dem dey count DTE for calendar days or trading days?

Na calendar days, by near-universal convention. Weekends and holidays dey count, and time value dey erode through dem — one 3 DTE option for Friday (wey dey expire Monday) get one trading session wey remain, but three days of clock.

Which DTE better pass for options trading?

No single DTE wey better pass; di choice na im dey set di trade-off. Short-dated contracts cheap and dey burn fast — di at-the-money SPY call wey expire dat same afternoon cost $1.65 for July 8, 2026 — while di ones wey get longer date dey cost well-well more for front, but far less per day of life ($0.14 per remaining day for 891 DTE). Premium sellers normally dey work di 30-45 DTE band; buyers wey want time for dia side dey go longer.

Which DTE most options traders dey trade?

Di measured answer for July 8, 2026: 61.8% of contract volume sit for 7 DTE or less, with 38.9% for 0 DTE alone. Longer-dated activity dey — 18.7% of volume na 31+ DTE — but di market center of gravity na di front of di curve, and e don move further front for everi June sample since 2022.


Everi number wey dey up na stored, versioned query over di full options tape — expand any panel SQL, or slice di DTE spectrum for any underlying for di Strasmore terminal.