Home · Guides · NIFTY open interest historical data by strike, minute by minute

GUIDE · NIFTY OPEN INTEREST HISTORY · CATALOG VERIFIED 2026-11-11

NIFTY open interest historical data by strike, minute by minute

Options Data (optionsdata.shop) sells NIFTY open interest history as part of its option chain files: every 1-minute row carries the open interest of that strike and side at that minute, for every traded strike of the nearest expiries, covering JAN 2023 → NOV 2026. From those rows you can rebuild the OI profile of the chain at any minute, the change in OI since the open, and the put-call OI ratio. Files download as Parquet or CSV from the NIFTY option chain dataset.

NIFTY option chain dataNIFTY Complete, 1 year Get free sample by email File schema

Get the free sample by email → check the columns

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

What the open interest column holds

open_interest (named oi in older files) is the number of open contracts in that strike, side and expiry at that bar. It sits on every row next to OHLC and volume, so you never join two datasets to see price and positioning together.

OI moves more slowly than price. It can stay flat for several minutes and then step, so treat it as a positioning signal rather than a minute-by-minute trigger. A strike only has a row in a minute when it traded, so for far strikes carry the last OI forward within that one strike, side and expiry.

NIFTY options (1-min and 1-sec) and futures carry open interest. NIFTY futures OI is in the Complete packs, on the same clock.

Change in OI and the OI profile at any minute

Change in OI is not a separate column, because it depends on the window you choose. Since the open, it is the OI at your minute minus the OI of that strike's first row of the day. The snippet builds the profile at 11:00 and the change since the open, per strike and side:

import pandas as pd
df = pd.read_parquet("NIFTY_OPT_1min_2026-09-10_exp2026-09-15.parquet")
# older files use layout B names; map them to the sample names
df = df.rename(columns={"timestamp": "datetime", "strike": "strike_price",
                        "option_type": "right", "expiry": "expiry_date",
                        "oi": "open_interest"})
if "right" in df:
    df["right"] = df["right"].replace({"CE": "Call", "PE": "Put"})
df["datetime"] = pd.to_datetime(df["datetime"])
df = df.sort_values("datetime")
key = ["strike_price", "right"]
first = df.groupby(key)["open_interest"].transform("first")
df["oi_change"] = df["open_interest"] - first

# latest known OI per strike and side at 11:00
upto = df[df["datetime"] <= "2026-09-10 11:00:00"]
prof = upto.groupby(key)[["open_interest", "oi_change"]].last().unstack("right")
print(prof.sort_values(("open_interest", "Put"), ascending=False).head(10))

Put-call OI ratio through the day

The put-call ratio by open interest is total put OI divided by total call OI for one expiry. Computed every minute, it shows how positioning shifted during the session instead of one end-of-day number.

# continue from the frame above
last_oi = df.set_index("datetime").groupby(key)["open_interest"].resample("1min").last()
last_oi = last_oi.groupby(level=[0, 1]).ffill().reset_index()
tot = last_oi.groupby(["datetime", "right"])["open_interest"].sum().unstack("right")
tot["pcr_oi"] = tot["Put"] / tot["Call"]
print(tot["pcr_oi"].between_time("09:15", "15:40").describe())

Expiry-day and roll behaviour to expect

On expiry day the expiring series usually loses open interest as positions are closed or rolled, while the next weekly gains it. Comparing the two expiry files of the same trading day shows the roll directly.

NIFTY weekly and monthly contracts expired on Thursday up to 31 August 2025 and expire on Tuesday from 1 September 2025 (first Tuesday weekly: 2 September 2025). Take the expiry from each row's expiry column, not from the weekday. More on that in the weekly expiry data format guide.

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 code: 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
open_interest · oiintOpen interest at that bar (SENSEX has gaps where it is 0 — see /free/schema)

Each row is one contract in one bar: traded OHLC, volume and open interest, with strike, expiry and call/put on every row.

Format: Parquet. Validate on the free sample and the schema page before buying.

FAQ

Where can I get historical NIFTY open interest data by strike?

Options Data sells NIFTY option chain files with open interest on every row, per strike and side, at 1-minute for JAN 2023 → NOV 2026. See the NIFTY options historical data page.

Is change in open interest included?

Not as its own column. Each row has the OI at that bar, so change in OI over any window is one groupby, as shown above.

How often does NIFTY open interest update in the files?

OI is reported on every row, but its value changes less often than price, so you will see runs of the same OI followed by a step.

Can I calculate the put-call ratio from this data?

Yes. Sum put OI and call OI across strikes of one expiry at each minute and divide; the code on this page does it for a whole session.

Does the 1-second NIFTY data have open interest?

Yes. NIFTY 1-second option files carry open interest too, for the nearest expiries and strikes around the money. See the 1-second dataset.

Get the data

Free sample · Schema · Ask the AI for your data

NIFTY option chain dataNIFTY Complete, 1 year Get free sample by email

Related guides

Index and commodity data only.