free expiry day ↓

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):

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

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.

more guides

Building an expiry-day dataset in Python: pandas and DuckDB recipesOne-second or one-minute bars for the last hour of expiry?Does NIFTY pin to max pain on expiry day? Testing it with open interest by strike