blog /
Far out-of-the-money options on expiry day: measuring the late spikes
Cheap NIFTY options can multiply in minutes on expiry day and then fade to nothing. How to find and measure those late moves in one-minute data, with a pandas scan you can run on the free sample.
Cheap options on expiry day attract two kinds of traders: buyers hoping for a ten-bagger, and sellers collecting the last few rupees of premium. Both are making a claim about how often a nearly worthless option suddenly reprices. That frequency is measurable.
Two moves from one session
On the 14 October 2025 NIFTY expiry (our free sample day):
- The 25,100 put rose to about eight times its opening price as the index slid to its low around 12:40. The index then recovered, and the put finished the day at almost nothing.
- The 25,150 put traded at 0.70 at 15:01 with the index near 25,174. By 15:13 it was 6.60, more than nine times higher, as the index dipped toward 25,130. It closed at 4.40.
Both moves are invisible in end-of-day data. The first shows how much an intraday swing matters to a seller of out-of-the-money puts. The second is the classic last-hour spike.
Scanning a session for spikes
A simple definition: for each option, after 13:00, the largest ratio of its close to its lowest close so far. Restrict to bars with volume so you only count prices that traded.
import pandas as pd
opt = pd.read_parquet("NIFTY_OPT_1min_2025-10-14_exp2025-10-14.parquet")
opt = opt[opt["volume"] > 0]
late = opt[opt["datetime"].dt.time >= pd.Timestamp("13:00").time()]
rows = []
for (k, cp), d in late.sort_values("datetime").groupby(["strike_price", "right"]):
if len(d) < 5:
continue
run_min = d["close"].cummin()
i = (d["close"] / run_min).idxmax()
rows.append({"strike": k, "type": cp, "low": run_min[i],
"peak": d.loc[i, "close"], "at": d.loc[i, "datetime"],
"x": d.loc[i, "close"] / run_min[i]})
print(pd.DataFrame(rows).sort_values("x", ascending=False).head(10))
On the sample day the top of that list is the 25,150 put (0.70 to 6.60), followed by the 25,200 call (2.10 to 16.20 by 14:36) and the 25,150 call (7.40 to 48.95 by 14:37), both carried by the index rally after 14:00.
Things to control for
- Tick size. A move from 0.05 to 0.50 is a tenfold gain but only nine ticks. Report rupee changes beside ratios, or set a minimum starting price.
- Fillable size. Check the volume in the spike minutes before assuming you could have sold into it.
- Distance from the index. Measure each strike's distance from the index in points at the start of the window. "Far" on a calm day and "far" on a 300-point day are different bets.
Run the scan across every expiry in a NIFTY pack and you get a base rate: how often an option under one rupee at 14:30 trades above five rupees before the close. That number is worth knowing whichever side you take.