free expiry day ↓

blog /

NIFTY monthly expiry options historical data: studying the last-Tuesday contract

How to get NIFTY monthly expiry options historical data from a full archive: identifying monthly contracts, following them for a month, and comparing them with weeklies.

Monthly NIFTY options have a longer life, deeper open interest and a different set of users from the weeklies. Studying them means finding the monthly contracts in the archive and following each from about a month out to its final session.

Identify the monthly contracts

The monthly expiry is the last expiry date in each calendar month. It moved from the last Thursday to the last Tuesday in September 2025, and holidays can pull it a day earlier. Derive it from the data rather than a calendar:

import re
from pathlib import Path
import pandas as pd

pat = re.compile(r"_exp(\d{4}-\d{2}-\d{2})")
exps = sorted({pat.search(f.name)[1] for f in Path("NIFTY").rglob("NIFTY_OPT_1min_*.parquet")})
s = pd.Series(pd.to_datetime(exps))
monthly = s.groupby(s.dt.to_period("M")).max()
print(monthly.tail(6))

What to study

Which pack

A month of history needs the days before expiry too, and every pack includes every trading day in its window. For a few dozen monthly expiries, take the last 3 years; with futures and the index, NIFTY Complete, 3 years.

FAQ

When do NIFTY monthly options expire?

On the last Tuesday of the month since September 2025, and the last Thursday before that. A holiday moves the expiry to the previous trading day.

Are monthly and weekly contracts in separate files?

Each expiry has its own file per trading day, so the monthly contract is always a separate file.

Is open interest included?

Yes, on every NIFTY option row.

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