blog /
How fast an at-the-money straddle bleeds on expiry day: a minute-by-minute look
On the 14 Oct 2025 NIFTY expiry the 25,150 straddle fell from 171.65 at the open to 4.45 at the close, and lost half its remaining value between 14:30 and 15:00. Here is how to measure it.
Short-straddle sellers talk about expiry-day "theta" as if it were a smooth line. Minute data shows something lumpier: long flat stretches, and then most of the remaining premium vanishing in a short window late in the day.
The day
We used the free sample, NIFTY on Tuesday 14 October 2025. The index opened at 25,277.55, touched 25,310.35 at 09:24, fell to 25,060.55 at 12:44 and closed the regular session at 25,123.35. By the close, the 25,150 strike held the most call and the most put open interest of the expiring series, so it is a natural straddle to follow.
| Time (IST) | NIFTY | 25,150 CE | 25,150 PE | Straddle |
|---|---|---|---|---|
| 09:15 | 25,291.65 | 159.75 | 11.90 | 171.65 |
| 11:00 | 25,195.70 | 82.25 | 25.05 | 107.30 |
| 13:00 | 25,094.35 | 15.75 | 80.05 | 95.80 |
| 14:00 | 25,126.05 | 18.60 | 36.55 | 55.15 |
| 14:30 | 25,154.40 | 25.25 | 14.60 | 39.85 |
| 15:00 | 25,170.90 | 20.55 | 1.85 | 22.40 |
| 15:10 | 25,140.60 | 1.65 | 4.50 | 6.15 |
| 15:29 | 25,123.35 | 0.05 | 4.40 | 4.45 |
One-minute closes from the sample files. Straddle = call close + put close at the same minute.
What the table says
- Between the open and 13:00 the straddle lost about 44% of its value even though the index moved 200 points. A big move does not save a long straddle on expiry morning, because the leg that goes into the money starts with little time value left.
- From 14:00 to 15:00 the straddle lost another 33 rupees, 60% of what was left.
- Between 15:00 and 15:10 it fell from 22.40 to 6.15 while the index moved only 30 points. That ten-minute window holds most of the late decay.
Repeat it on any expiry
import pandas as pd
opt = pd.read_parquet("NIFTY_OPT_1min_2025-10-14_exp2025-10-14.parquet")
opt = opt.rename(columns={"datetime": "ts", "strike_price": "strike"})
opt["cp"] = opt["right"].str[0].str.upper().map({"C": "CE", "P": "PE"})
px = opt.pivot_table(index="ts", columns=["strike", "cp"], values="close")
k = 25150
straddle = (px[(k, "CE")] + px[(k, "PE")]).rename("straddle")
print(straddle.resample("30min").last())
Older files name the columns timestamp, strike, option_type; rename those the same way and the rest of the code is unchanged. To follow the straddle nearest the index instead of a fixed strike, merge in the index file and round its close to the strike step (50 for NIFTY) every minute.
Turning one day into a study
One day is an anecdote. Run the loop over every expiry session in a pack and record the share of the opening straddle left at 13:00, 14:00, 14:30 and 15:00. The distribution of those shares, split by how far the index travelled, tells you far more about entry timing than any rule of thumb.