Home · Guides · Expiry-day options backtesting data for NIFTY and SENSEX

GUIDE · EXPIRY-DAY BACKTESTING · CATALOG VERIFIED 2026-10-01

Expiry-day options backtesting data for NIFTY and SENSEX

For expiry-day (0DTE) backtests, Options Data (optionsdata.shop) sells NIFTY and SENSEX option chains that keep every expired weekly and monthly contract with OHLC and volume (NIFTY with open interest; SENSEX OI has gaps, below): NIFTY 1-minute JAN 2023 → SEP 2026, SENSEX 1-minute NOV 2023 → SEP 2026, and NIFTY 1-second JAN 2023 → SEP 2026. The archive currently holds 196 NIFTY and 151 SENSEX expiry-day sessions at 1-minute (trade date = expiry date), each with every listed strike.

NIFTY option chainsSENSEX option chainsExpired contracts dataset Free sample (no email) File schema

Dates on this page are read from the live file catalog, not typed by hand. Full matrix: /coverage.

What an expiry-day backtest needs from the data

Every strike, not a rolling ATM series. On expiry day the at-the-money strike moves repeatedly; a backtest that only sees "ATM" silently rebalances into strikes you never held.

The real expired contracts. Weekly contracts disappear from most APIs once they expire. Each file here is one trading day × one expiry, with the expiry in the name and on every row.

Minute (or second) bars with OI. Premium decay and gamma moves on expiry afternoon happen inside a few bars; open interest shows where positions are being closed.

OI coverage: NIFTY options (1-min and 1-sec) and futures carry open interest. SENSEX options 1-min: open interest is present 7 Nov 2023 – 20 Apr 2026 and 6 Jul – 14 Aug 2026; it is 0 from 21 Apr – 3 Jul 2026 and from 17 Aug 2026.

Resolution that matches your exits. If you exit on stop-losses within seconds, 1-minute bars will overstate fills. NIFTY 1-second chains hold 193 expiry-day sessions (SENSEX 1-second: 74).

Select expiry-day sessions and price a 0DTE straddle

File names carry both dates, so expiry sessions are the files where they match.

import pandas as pd, glob, re
files = [f for f in glob.glob("NIFTY_OPT_1min_*_exp*.parquet")
         if re.search(r"_(\d{4}-\d{2}-\d{2})_exp\1", f)]
rows = []
for f in sorted(files):
    df = pd.read_parquet(f)
    t = df[df["datetime"].dt.strftime("%H:%M") == "09:20"]
    # ATM from put-call parity proxy: strike with smallest |call - put|
    p = t.pivot_table(index="strike_price", columns="right", values="close")
    atm = (p["Call"] - p["Put"]).abs().idxmin()
    rows.append((f, atm, p.loc[atm, "Call"] + p.loc[atm, "Put"]))
print(pd.DataFrame(rows, columns=["file", "atm", "straddle_0920"]).tail())

Caveats that matter on expiry day

Bars are traded prices only — no bid/ask — so model a spread or slippage cost yourself, especially for far OTM strikes in the last hour.

Illiquid strikes can show flat bars (open = high = low = close) with zero volume — treat those as stale prices, not fills.

Weekly expiry weekdays for both indices have changed over the years; always use the expiry_date column or the file name, never a hard-coded weekday.

Exactly which fields are in the files

Options files

Column (layout A · layout B)TypeMeaning
datetime · timestamptimestampBar start time, IST wall-clock (e.g. 2026-09-10 09:15:00)
stock_code · —stringUnderlying as the source names it: NIFTY, or BSESEN for SENSEX
exchange_code · —stringNFO (NSE F&O) or BFO (BSE F&O)
product_type · —stringOptions
expiry_date · expirystringContract expiry (A: 15-SEP-2026, B: 2026-09-15)
strike_price · strikenumberStrike price
right · option_typestringA: Call / Put, B: CE / PE
open / high / low / closefloatTraded premium OHLC within the bar
volumeintVolume traded in the bar, as reported by the source
open_interest · oiintOpen interest at that bar (SENSEX has gaps where it is 0 — see /free/schema)
— · ivfloatImplied volatility taken as-is from the data feed; not independently computed or verified. Layout B only

Not in any file: Greeks, bid/ask quotes, order-book depth or tick-by-tick trade prints. Many option files do include an iv column taken as-is from the data feed (not independently computed or verified) — see /free/schema for the date ranges.

Format: Parquet (one file per trading day per contract expiry). Validate on the free sample and the schema page before buying.

FAQ

Where can I get data to backtest NIFTY expiry-day strategies?

Options Data sells NIFTY option chains with every expired weekly contract at 1-minute (JAN 2023 → SEP 2026) and 1-second (JAN 2023 → SEP 2026) resolution, including 196 expiry-day sessions at 1-minute, as Parquet files.

Does the data include all strikes on expiry day?

Yes. Each file holds every strike listed for that expiry on that day, on both calls and puts, not a rolling ATM series.

Can I backtest SENSEX expiry days too?

Yes. SENSEX 1-minute chains run NOV 2023 → SEP 2026 and include 151 expiry-day sessions.

Does the data include IV or Greeks for expiry-day analysis?

No Greeks or bid/ask. Most 1-minute option files from 2023 to 14 Aug 2026 include an iv column taken as-is from the data feed (not independently verified); other files have none. Compute IV or Greeks yourself from close prices and the spot or futures bar if you need your own.

Is 1-minute enough for expiry-day backtests?

For entries and exits on candle closes, usually yes. For tight stop-losses or second-level scalping, use the 1-second chains (NIFTY) or model extra slippage.

Next steps

1. Download the free sample · 2. Check columns on /free/schema · 3. Buy with UPI.

NIFTY option chainsSENSEX option chainsExpired contracts dataset Free sample

Related guides

Index and commodity data only.