Home · Guides · NIFTY options data for backtesting
GUIDE · NIFTY BACKTESTING · CATALOG VERIFIED 2026-10-04
NIFTY options data for backtesting
For NIFTY options backtests, AI Options Data Store (optionsdata.shop) sells the historical option chain as Parquet files: expired weekly and monthly contracts, every traded strike on calls and puts, with OHLC, volume and open interest at 1-minute from JAN 2023 to OCT 2026 and at 1-second from JAN 2023 to OCT 2026. NIFTY futures (JAN 2023 → OCT 2026) and spot (JAN 2023 → OCT 2026) 1-minute bars are sold alongside, so the underlying sits on the same clock. No Greeks or bid/ask.
NIFTY options packNIFTY Complete (options, futures, spot)Free sample 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 a NIFTY options backtest needs
The expired contracts. Weeklies drop out of live broker chains the day they expire. A backtest needs them as they traded, with the expiry on every row.
Every traded strike. A rolling "ATM" series quietly swaps into strikes you never held once the market moves.
Intraday bars with open interest. Entries, stop-losses and exits happen inside the day. NIFTY options (1-min and 1-sec) and futures carry open interest.
The underlying on the same timestamps. Futures and spot bars let you mark moneyness and hedges minute by minute.
1-minute or 1-second
1-minute (JAN 2023 → OCT 2026): the default for most strategy research.
1-second (JAN 2023 → OCT 2026): Nearest NIFTY expiries, strikes around the money. Use it for tight stops, slippage and expiry-afternoon studies. See NIFTY 1-second data.
Neither is tick-by-tick trade prints.
Price an intraday ATM straddle from one file
Columns follow the free sample (layout A); the schema page lists both layouts.
import pandas as pd
df = pd.read_parquet("NIFTY_OPT_1min_2026-09-10_exp2026-09-15.parquet")
p = df.pivot_table(index="datetime", columns=["strike_price", "right"], values="close")
first = p.iloc[0].unstack() # strikes x Call/Put at the first bar
atm = (first["Call"] - first["Put"]).abs().idxmin()
straddle = p[(atm, "Call")] + p[(atm, "Put")]
print(atm, straddle.resample("15min").last())
Caveats
Nearest NIFTY and SENSEX expiries, every traded strike. Full detail on the coverage page.
Bars are traded prices with no bid/ask, so model spread and slippage yourself, especially far out of the money.
Flat zero-volume bars are stale prices, not fills.
Expiry weekdays have changed over the years. Read the expiry from the file name or the expiry column, never a hard-coded weekday.
Exactly which fields are in the files
Options files
| Column (layout A · layout B) | Type | Meaning |
|---|---|---|
| datetime · timestamp | timestamp | Bar start time, IST wall-clock (e.g. 2026-09-10 09:15:00) |
| stock_code · — | string | Underlying as the source names it: NIFTY, or BSESEN for SENSEX |
| exchange_code · — | string | NFO (NSE F&O) or BFO (BSE F&O) |
| product_type · — | string | Options |
| expiry_date · expiry | string | Contract expiry (A: 15-SEP-2026, B: 2026-09-15) |
| strike_price · strike | number | Strike price |
| right · option_type | string | A: Call / Put, B: CE / PE |
| open / high / low / close | float | Traded premium OHLC within the bar |
| volume | int | Volume traded in the bar, as reported by the source |
| open_interest · oi | int | Open interest at that bar (SENSEX has gaps where it is 0 — see /free/schema) |
| — · iv | float | Implied volatility taken as-is from the data feed; not independently computed or verified. Layout B only |
No Greeks or bid/ask.
Format: Parquet. Validate on the free sample and the schema page before buying.
FAQ
Where can I get NIFTY options data for backtesting?
AI Options Data Store sells NIFTY option chains with expired weekly and monthly contracts, every traded strike, OHLC, volume and open interest, at 1-minute (JAN 2023 → OCT 2026) and 1-second (JAN 2023 → OCT 2026), as Parquet files. NIFTY futures and spot 1-minute bars are sold alongside.
Does it include expired weekly options?
Yes. Each file is one trading day and one expiry, and expired weeklies and monthlies are kept.
Is the data CSV or Parquet?
Parquet. Any file converts to CSV in one line: pd.read_parquet(f).to_csv("out.csv", index=False).
Does it include Greeks or bid/ask?
No. Compute Greeks yourself from the option close and the spot or futures bar on the same timestamp if you need them.
Can I check the data first?
Yes. The free sample is three real trading days of the NIFTY option chain as Parquet, with no email needed.
Get the data
Free sample · Schema · Ask the AI for your data
NIFTY options packNIFTY Complete (options, futures, spot)Free sample Free sample
Related guides
- NSE option chain historical data in CSV or Parquet
- SENSEX options historical data at 1-minute resolution
- MCX intraday historical data: 1-minute futures and options
- Expiry-day options backtesting data for NIFTY and SENSEX
- Download NIFTY expired options data (Parquet / CSV)
- How the NIFTY 1-second options and spot files are built
- Bitcoin 1-minute historical data: what is in the files and how to load them
- Crypto funding rate history and 1-minute perpetual futures data
- XAUUSD 1-minute (M1) data: files, columns and how to get CSV
- How to load 1-minute NIFTY options Parquet in pandas
Index and commodity data only.