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

Wetin be di hour wey 0DTE options dey trade pass?

0DTE options dey trade heaviest for morning, no be for close. Check di hourly volume, di calls-vs-puts clock, weekday shares and same-day spreads wey dem measure.

Di tori wey pipo dey tell about 0DTE options na sey e be like casino wey dem dey play for evening: lottery ticket wey dem buy for last hour just to flip coin one more time. But wetin dey show for record no be so. If you check am hour by hour, same-day options dey trade pass for morning — di fastest contract flow dey come for di first thirty minutes, and dia share of all options volume dey end di day for im lowest point. Di panels wey dey below dey measure dat rhythm for one heavy 0DTE session (Friday, July 10, 2026) and test am across underlyings, calls and puts, and weekdays.

Which time of day 0DTE options dey trade pass?

Di panel divide every options trade wey happen for dat Friday into same-day contracts (wey go expire dat afternoon) and everi oda tin, dem arrange am by New York clock. Di 09:00 row cover only half hour — session dey open by 9:30 — so di last column normalise each bucket to contracts per minute, na im be di only fair comparison.

Query0DTE contract volume, share of all options volume, and flow rate by ET hour — Friday, July 10, 2026
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_hour,
    round(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260710') / 1e6, 2) AS same_day_contracts_m,
    round(sum(size) / 1e6, 2) AS all_options_contracts_m,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260710') / sum(size), 1) AS same_day_pct,
    round(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260710')
          / uniqExact(toStartOfMinute(sip_timestamp)) / 1000, 1) AS same_day_k_per_minute
FROM global_markets.options_trades
WHERE sip_timestamp >= toDateTime64('2026-07-10 13:30:00', 9)
  AND sip_timestamp < toDateTime64('2026-07-10 20:00:00', 9)
GROUP BY et_hour
ORDER BY et_hour

Flow rate. Di opening half hour move 148.9 thousand same-day contracts per minute — na im be di fastest stretch of di session. Everi later bucket slow pass am: 119.8k a minute by 10, 66.6k by midday, e drop reach low of 50.3k for di 14:00 hour, 62.6k for di final hour.

Absolute volume. Di biggest bucket na di 10 o'clock hour wey get 7.19 million contracts — na full hour, no be half — afta dat one, volume slide go 3.02M for di 14:00 hour, den e rise enter di close, reach 3.75M. Di late-day pickup dey real; e no near di morning at all.

Share. Di same-day share of ALL options volume open for 52.9%, e peak for di 11:00 hour at 53.4%, den e dey fall everi hour reach 38.4% for di close — na di day low. Read dat last hour well-well, becos na im di folk story dey: total options volume dey rise enter di bell (9.78M contracts against 6.63M di hour before — na di day third-busiest bucket, behind di 10:00 and 11:00 hours at 13.58M and 10.86M) while di 0DTE share dey sink. Di close na busy hour for options, and na di least 0DTE-concentrated hour of di session.

Na morning peak dey only for SPY?

One fair objection: index ETFs dey list expiration for every trading day, so e fit be say "0DTE" na really story about SPY and QQQ. The next panel break down that Friday same-day volume by underlying, e add each name own same-day share and how much of am print before noon.

QuerySame-day options volume by underlying — di ten heaviest names, July 10, 2026
The exact SQL behind every number
WITH by_name AS (
    SELECT substring(ticker, 3, length(ticker) - 17) AS underlying,
           sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260710') AS same_day_size,
           sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260710'
                       AND toHour(toTimeZone(sip_timestamp, 'America/New_York')) < 12) AS morning_size,
           sum(size) AS all_size
    FROM global_markets.options_trades
    WHERE sip_timestamp >= toDateTime64('2026-07-10 13:30:00', 9)
      AND sip_timestamp < toDateTime64('2026-07-10 20:00:00', 9)
      AND ticker NOT LIKE 'O:SPCX%'
    GROUP BY underlying
)
SELECT underlying,
       round(same_day_size / 1e6, 2) AS same_day_contracts_m,
       round(100.0 * same_day_size / sum(same_day_size) OVER (), 1) AS pct_of_all_0dte,
       round(100.0 * same_day_size / all_size, 1) AS same_day_pct_of_name,
       round(100.0 * morning_size / same_day_size, 1) AS pct_traded_before_noon
FROM by_name
ORDER BY same_day_size DESC
LIMIT 10

Index products dey dominate, but dem no monopolise. SPY alone carry 25.5% of every same-day contract wey trade for the whole market, QQQ carry another 14.5%; with the S&P 500 index series (SPXW) and the small-cap ETF (IWM), index products fill four of the top six slots. The other two na single stocks — NVDA at 8.7%, TSLA at 7.3%.

The same_day_pct_of_name column show how 0DTE-heavy each name own options market be: 72.1% of SPY own options volume that day expire the same afternoon, against 46.9% for AMZN wey dey the bottom of the table.

The morning skew hold for all ten. The pre-noon window na 2.5 out of the session 6.5 hours — 38% of the clock — and every name print more than that share of im same-day volume inside am: heaviest na IWM at 67.4%, lightest na MU at 44.5%, SPY at 54.4%, NVDA at 56.3%. The tilt belong to the product, not to one ETF.

Calls and puts dey follow the same clock?

The natural suspicion na say puts dey run late — say the close dey thick with hedges against overnight gap. The tape show say the two sides dey keep almost the same clock.

QuerySame-day calls vs. puts by ET hour, and di put share of 0DTE volume — July 10, 2026
The exact SQL behind every number
SELECT formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_hour,
       round(sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'C') / 1e6, 2) AS call_contracts_m,
       round(sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'P') / 1e6, 2) AS put_contracts_m,
       round(100.0 * sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'P') / sum(size), 1) AS put_share_pct
FROM global_markets.options_trades
WHERE sip_timestamp >= toDateTime64('2026-07-10 13:30:00', 9)
  AND sip_timestamp < toDateTime64('2026-07-10 20:00:00', 9)
  AND substring(ticker, length(ticker) - 14, 6) = '260710'
GROUP BY et_hour
ORDER BY et_hour

Both sides peak for the same 10 o'clock bucket — 4.1M calls against 3.09M puts — both dey slide through afternoon, both dey tick up into the close. The put share of same-day volume na the interesting column: e lowest for the opening bucket (34.9%), e jump go 43% by 10, then e hold narrow band, finish for 41.7%.

The mix effect dey run opposite to the hedging story: the opening rush na the most call-tilted stretch of the day, and puts dey claw back few points of share once e pass. No late-day put surge appear.

E fit hold for Tuesday?

Di hourly rhythm dey follow di daily one: how much 0DTE trading wey session fit get depend on wetin dey expire dat day. Friday na di big side of di expiration calendar — weeklies, monthlies and di daily ETF series all dey land for am — while Tuesday dey offer only daily-expiry names. Di panel pool six weeks of sessions by weekday.

QuerySame-day share of options volume by weekday — all sessions, June 1 to July 10, 2026
The exact SQL behind every number
WITH sessions AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
           sumIf(volume, substring(ticker, length(ticker) - 14, 6)
                         = formatDateTime(toDate(toTimeZone(window_start, 'America/New_York')), '%y%m%d')) AS same_day_vol,
           sum(volume) AS all_vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime64('2026-06-01 13:30:00', 9)
      AND window_start < toDateTime64('2026-07-10 20:00:00', 9)
      AND toHour(toTimeZone(window_start, 'America/New_York')) BETWEEN 9 AND 15
    GROUP BY session_date
)
SELECT toDayOfWeek(session_date) AS dow,
       formatDateTime(session_date, '%W') AS weekday,
       count() AS sessions,
       round(avg(same_day_vol) / 1e6, 2) AS avg_same_day_contracts_m,
       round(100.0 * sum(same_day_vol) / sum(all_vol), 1) AS same_day_pct_of_volume
FROM sessions
GROUP BY dow, weekday
ORDER BY dow

Across 6 Mondays, 6 Tuesdays, 6 Wednesdays, 6 Thursdays and 4 Fridays, di split clear well well. Friday run a 46.1% same-day share of all options volume and average 36.1 million same-day contracts a session — e be di highest of di five for both measures. Tuesday be di lightest (29.2%, 18.92M); di midweek days cluster tight (34.5% on Monday, 34.2% on Wednesday, 35.4% on Thursday). Same-day trading na every-session phenomenon — even di lightest weekday dey run 29.2% of di options tape — but di level na calendar fact, and di Friday for di panels above dey sit near di top of dat range. Di hourly shape dey generalise; di height of di curve no dey.

Why morning be the time, mechanically

One same-day option get only one session as im whole life, so anybody wey want that exposure — day-range traders, event hedgers, premium sellers wey dey harvest the last day of decay — get the most product to work with at the open: the most hours, the most premium, the widest daily range wey never settle. Every hour dey burn the product itself, and the afternoon share wey dey fall na that product dey expire in real time.

Wetin dey really trade for di last hour?

Di normal assumption be say di last hour residue na deep in-the-money contracts wey dey converge to stock, plus lottery strikes wey cost pennies. Di panel test am, dem bucket same-day trades by premium wey dem pay — dat one stand in for moneyness on expiration day, since contract wey get hours to live wey dem price at $0.05 dey far out of di money and one wey pass $10 dey deep inside.

QueryWetin di last hour dey trade: same-day volume by premium paid, 10am hour vs. closing hour — July 10, 2026
The exact SQL behind every number
SELECT multiIf(price < 0.10, 'under $0.10', price < 0.50, '$0.10-0.50', price < 2, '$0.50-2', price < 10, '$2-10', '$10 and up') AS premium_bucket,
       round(100.0 * sumIf(size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 10)
             / sum(sumIf(size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 10)) OVER (), 1) AS pct_of_10am_contracts,
       round(100.0 * sumIf(size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 15)
             / sum(sumIf(size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 15)) OVER (), 1) AS pct_of_3pm_contracts,
       round(100.0 * sumIf(price * size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 15)
             / sum(sumIf(price * size, toHour(toTimeZone(sip_timestamp, 'America/New_York')) = 15)) OVER (), 1) AS pct_of_3pm_premium_dollars
FROM global_markets.options_trades
WHERE sip_timestamp >= toDateTime64('2026-07-10 13:30:00', 9)
  AND sip_timestamp < toDateTime64('2026-07-10 20:00:00', 9)
  AND substring(ticker, length(ticker) - 14, 6) = '260710'
  AND toHour(toTimeZone(sip_timestamp, 'America/New_York')) IN (10, 15)
GROUP BY premium_bucket
ORDER BY min(price)

Di mix shift hard go di cheap end. For di 10 o'clock hour di modal bucket na $0.50-2, at 37.4% of contracts, with di sub-dime bucket on 17.1%. By di closing hour di sub-dime bucket don roughly double im share, to 33.8%, $0.10-0.50 add 34.9%, and $0.50-2 contracts drop to 19.6%. Most of wetin trade into di bell cost under fifty cents.

Di final column na di corrective. Dose expensive contracts dey rare — di $10 and up bucket na 2.6% of last-hour contracts — yet dem carry 54.2% of di premium dollars wey trade for dat hour, against 0.8% for di sub-dime bucket. Both halves of di folk picture dey dia, for different currencies: count am in contracts di last hour na lottery-ticket market; count am in dollars, na thin tape of deep in-the-money contracts wey dey converge on di stock (di 0DTE guide dey follow one such last-hour lottery strike).

When 0DTE spread tight pass?

Volume na one way to measure liquidity; but wetin trader dey pay na di cost to cross di market. Di panel dey read every quote update for dat Friday SPY 0DTE contracts and report di median bid-ask spread by hour, e restrict am to contracts wey dey quoted between $1 and $10 — one like-for-like premium band (di contracts inside am dey change as di day dey go; na so expiring product be).

QueryMedian bid-ask spread on SPY same-day contracts quoted $1-$10, by ET hour — July 10, 2026
The exact SQL behind every number
SELECT formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_hour,
       round(count() / 1e6, 1) AS quote_updates_m,
       round(quantileDeterministic(0.5)(toFloat64(ask_price - bid_price), toUInt64(sequence_number)), 3) AS median_spread_usd,
       round(quantileDeterministic(0.5)(toFloat64(ask_price - bid_price) / toFloat64(bid_price + ask_price) * 200,
                                        toUInt64(sequence_number)), 2) AS median_spread_pct_of_mid
FROM global_markets.cache_options_quotes
WHERE ticker LIKE 'O:SPY260710%'
  AND sip_timestamp >= toDateTime64('2026-07-10 13:30:00', 9)
  AND sip_timestamp < toDateTime64('2026-07-10 20:00:00', 9)
  AND bid_price > 0
  AND toFloat64(bid_price + ask_price) / 2 BETWEEN 1 AND 10
GROUP BY et_hour
ORDER BY et_hour

Di spread dey wide as di session dey old. Di median same-day SPY contract for dat band bin dey quoted 0.8% of im mid-price wide for di first half hour — na im be di tightest bucket for di day — and 2.67% for di closing hour, di widest: e pass double di cost to cross, same product, same premium band, six hours later. For cash, di median spread move from $0.03 go $0.11, midday dey between (1.57% at 12:00). Quote traffic dey move di same way — 1.4 million updates for di 10 o'clock hour against 0.1M for di last one: market makers dey refresh far less often as contracts dey near zero time value, and dem dey quote wider when dem do.

So wetin e mean: how to read am for real

Di picture wey we measure na morning instrument wey dey on top clock wey dey decay:

  • Di heaviest, fastest and cheapest-to-cross part of 0DTE contract life na im first two hours. Every hour wey pass after dat, quotes dey wider and trades dey thinner.
  • E no be something wey just dey happen for index ETFs: all ten of di heaviest underlyings dey push dia same-day volume enter morning, and calls and puts dey follow di same clock.
  • Di last hour dey real but e small — two markets at once: plenty plenty contracts wey cheap well well, and very few wey expensive well well wey dey carry most of di dollars.
  • Di weekday matter: Friday own same-day share dey high pass any midweek day own.

None of dis one dey talk whether make pesin trade product wey im premium fit go zero for one afternoon; e dey talk when di market for am deep pass and cheap pass to cross. Di DTE vocabulary page get di wider expiration spectrum.

FAQ

0DTE options dey more active for closing time?

No be so if you compare am with the rest of the market. For July 10, 2026, same-day contracts drop to 38.4% of all options volume for the closing hour — na im be the lowest share for that day — even as total options volume rise go 9.78 million contracts, wey be the third-busiest hour for that session (behind 13.58M for 10:00 and 10.86M for 11:00). 0DTE volume dey tick up small as bell dey near (3.75M against the 7.19M morning peak), but the rest of the market dey rise pass am. The heaviest same-day flow show for the first half hour, na 148.9 thousand contracts per minute.

Wetin be the percentage of options volume wey be 0DTE for normal day?

E depend on the weekday. For the six weeks wey reach July 10, 2026, same-day contracts na 46.1% of all options volume for Fridays and 29.2% for Tuesdays — every trading day get serious 0DTE volume, and the expiration calendar na im dey decide how much.

Puts and calls dey trade 0DTE for the same time?

E near like that: both peak for the same 10 o'clock hour for July 10, 2026 and both come dey fade as afternoon dey go. The put share of same-day volume dey lowest for the opening bucket (34.9%) and e end for 41.7% — no late-day hedging surge show.

The morning peak dey the same for SPY and single stocks?

Yes. For that Friday, every one of the ten heaviest underlyings — ETFs and single stocks join — print larger share of im same-day volume before noon pass the 38% of the session clock wey that window cover: 56.3% for the single stock NVDA, 54.4% for SPY.


Every figure wey dey up na stored, versioned query over the full options tape — expand any panel to read the SQL, or slice another session for the Strasmore terminal.