Short answer: NSEpy can request historical data for a specific NIFTY option contract, including its expiry, strike, and call or put type. But in 2026, it should not be treated as a dependable way to download a complete, verified 15-year NIFTY-options archive.
The package is old, depends on NSE’s legacy website endpoints, and its maintainer says it is no longer maintained. Use it first as a small compatibility test—not as a guaranteed production data source. For authoritative, repeatable research, compare the results with official NSE historical-data products.
What “15 years of NIFTY options data” actually means
“15 years of options data” is not one continuous time series. An option contract exists only from listing until expiry, so a long history normally consists of many separate contracts identified by:
- Underlying symbol, such as
NIFTY - Expiry date
- Strike price
- Option type: call (
CE) or put (PE) - Trading date
Before downloading anything, define the required universe. You might need daily end-of-day records for monthly expiries, every weekly expiry and strike, selected near-the-money contracts, expiry-day observations, or intraday and tick data. These are materially different datasets.
#1 Best Overall
- Stop spending hours on technical analysis — let AI surface your best trades in under 5 minutes. TradeMAV runs 22 AI signals across 25,000+ global tickers simultaneously, every market session. No charting. No manual scanning. No missed setups. You set the strategy, the AI watches the market. You just act on the signal.
- Stop renting access to your own trading strategy. Cloud screeners charge $99–$299 every single month — $1,188 to $3,588 per year — and they own your data. TradeMAV is $129 once. Your watchlists, signals, and performance history live on your USB forever. No renewals. No cancellations. No server outages right when markets move.
- No PhD required — plug in and be screening professionally in under 2 minutes. 8 ready-to-use strategies with documented win rates (55–70%) activate in one click. Momentum Breakout, Mean Reversion Sniper, Trend Following Pro, and more — each pre-configured with signal thresholds, risk levels, and expected hold times. Works on any Windows or Mac laptop worldwide.
- Your edge stays private — not on someone else's server. Everything processes locally on your machine. Market data comes in, AI analyzes it, signals surface. Nothing uploads. No corporate telemetry. No one at a cloud company studying your strategy patterns. Military-grade encrypted Strategy Packs mean your configurations only work on TradeMAV devices.
- Everything included from day one — 16GB USB 3.1 drive pre-loaded with TradeMAV software, premium matte black branded case, USB-C aluminum adapter, Quick Start Guide 2.0, full video tutorial library, and Jarvis AI support assistant available 24/7. From unboxing to your first professional-grade scan in under 10 minutes. Windows and Mac compatible.
NSEpy’s documented workflow is aimed at historical contract-level records, generally daily data. It is not a complete historical option-chain, intraday-candle, tick, or order-book database. See the NSEpy option-data example and the project’s documentation mirror.
Why NSEpy is risky as a 2026 data source
NSEpy’s latest PyPI release is version 0.8, uploaded on March 7, 2020. Its repository includes a deprecation notice explaining that the package is unmaintained and depends on NSE’s old website. A later issue reports redirect failures after April 2023. That issue demonstrates reported breakage, but does not prove that every request fails in every environment.
In practical terms, the API syntax may still be useful, but a successful installation does not establish that NSE’s current endpoint will return complete or correctly parsed data. The project’s old Python compatibility notes also do not establish support for Python releases current in 2026.
Sources: PyPI NSEpy, NSEpy repository, and issue #251.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallInstall NSEpy in an isolated environment
Use a virtual environment so the legacy package does not interfere with other Python projects:
python -m venv .venv
Activate it with the command for your operating system.
Rank #2
Windows PowerShell
.venvScriptsActivate.ps1
macOS or Linux
source .venv/bin/activate
Then install the package:
python -m pip install --upgrade pip
python -m pip install nsepy
The package’s documented installation commands are also listed on its GitHub repository and PyPI page.
Check which installation Python is importing:
python -c "import nsepy; print(nsepy.__file__)"
Download one known NIFTY option contract first
Do not begin with a 15-year loop. Test one short, known contract request:
Free tools Windows power users keep installed
One-click scans. No signup required.
from datetime import date
from nsepy import get_history
data = get_history(
symbol="NIFTY",
start=date(2016, 4, 1),
end=date(2016, 4, 18),
index=True,
option_type="CE",
strike_price=7900,
expiry_date=date(2016, 4, 28),
)
if data is None or data.empty:
raise RuntimeError(
"No rows returned; check NSEpy compatibility and contract parameters."
)
print(data.shape)
print(data.columns.tolist())
print(data.head())
| Argument | Purpose |
|---|---|
symbol="NIFTY" |
Selects the NIFTY underlying. |
index=True |
Tells NSEpy the underlying is an index. |
option_type="CE" |
Requests a call; use PE for a put. |
strike_price=7900 |
Identifies the strike. |
expiry_date=... |
Identifies the exact contract expiry. |
start and end |
Set the requested historical date range. |
The example follows the parameter pattern shown in NSEpy issue #7. If it returns an empty DataFrame, an HTTP error, a redirect loop, or malformed data, stop and diagnose that result before attempting bulk collection.
Why one date range cannot produce a complete 15-year archive
This request:
start=date(2011, 1, 1)
end=date(2026, 8, 18)
does not mean “all NIFTY options.” It only defines dates for one contract if the other contract parameters are supplied.
A complete panel requires a defensible contract universe covering:
- Trading dates rather than merely calendar dates
- Monthly, weekly, and other applicable expiries
- Historical strike intervals and strikes that actually existed
- Both
CEandPE - Contracts that expired during the period
- Periods with no trade or no published record
Do not use a modern strike grid for the entire 2011–2026 period. Strike intervals and available contracts change over time. Weekly expiries also make the universe much larger than a monthly-expiry-only study.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Rank #3
As of August 18, 2026, a literal rolling 15-year period would approximately cover August 18, 2011 through August 18, 2026. Your manifest should use exact dates and report trading coverage separately from calendar coverage.
Use a resumable, per-contract downloader
A large collection should save each contract separately and maintain a manifest. The following is a collection framework; it does not invent the required contract list. You must obtain or construct a reliable list of valid historical contracts before calling it complete.
from datetime import date
from pathlib import Path
import time
import pandas as pd
from nsepy import get_history
OUT = Path("nifty_options")
OUT.mkdir(exist_ok=True)
MAX_RETRIES = 3
SLEEP_SECONDS = 1.5
def download_contract(start, end, strike, expiry, option_type):
return get_history(
symbol="NIFTY",
index=True,
option_type=option_type,
strike_price=strike,
expiry_date=expiry,
start=start,
end=end,
)
def save_result(df, start, end, strike, expiry, option_type):
if df is None or df.empty:
return False
output = OUT / (
f"NIFTY_{option_type}_{strike}_{expiry:%Y%m%d}_"
f"{start:%Y%m%d}_{end:%Y%m%d}.csv"
)
df.to_csv(output)
return True
# Example only: replace with contracts from your validated manifest.
contract = {
"start": date(2016, 4, 1),
"end": date(2016, 4, 18),
"strike": 7900,
"expiry": date(2016, 4, 28),
"option_type": "CE",
}
for attempt in range(1, MAX_RETRIES + 1):
try:
result = download_contract(**contract)
saved = save_result(result, **contract)
if not saved:
print("EMPTY", contract)
break
except Exception as exc:
print("FAILED", attempt, contract, repr(exc))
if attempt == MAX_RETRIES:
break
time.sleep(SLEEP_SECONDS * attempt)
time.sleep(SLEEP_SECONDS)
For a real batch job, add these controls:
- Skip contracts whose output files already exist.
- Retry only transient failures, not invalid contracts or parsing errors.
- Sleep between requests and avoid assuming that a delay bypasses NSE protections.
- Write empty responses to a separate log from failed requests.
- Save each contract independently so an interruption is recoverable.
- Record requested and completed contracts in a manifest.
- Deduplicate on date, symbol, expiry, strike, and option type.
NSE’s data-sharing and usage policy governs the use and redistribution of its market data. Free Python software does not mean that the underlying data is unrestricted or suitable for redistribution.
Validate every downloaded file
Inspect the returned schema rather than assuming that NSEpy’s column names match every NSE historical-file format:
required = {"Expiry", "Strike Price", "Option Type"}
missing = required.difference(data.columns)
if missing:
print("Columns requiring inspection:", missing)
print(data.index.min(), data.index.max())
print(data.isna().sum())
print(data.index.duplicated().sum())
For each file, verify:
- The returned expiry, strike, and option type match the request.
- Dates stay inside the requested range.
- No duplicate observations exist.
- Prices are non-negative.
- Volume and open interest are parsed as numeric values where appropriate.
- The number of rows is plausible for the requested period.
- Missing trading days are recorded rather than silently filled.
An empty response is ambiguous. It may indicate that the contract did not exist, the date or expiry is wrong, the contract had no returned records, NSE rejected the request, the endpoint changed, or NSEpy failed to parse the response. It is not proof that the market data never existed.
Do not forward-fill option prices or open interest unless your methodology explicitly requires it. A missing observation is not automatically a zero price.
Rank #4
Daily data is not intraday or tick data
NSEpy’s documented examples support the daily historical workflow. A repository issue asking about five-minute and fifteen-minute historical data illustrates that the standard interface should not be presented as an intraday archive. See issue #107.
If you need minute bars, tick-by-tick trades, order-book events, historical option-chain snapshots, Greeks, or implied volatility, choose a separate source. NSE’s official material distinguishes EOD and historical products from specialized historical order-and-trade data. Relevant sources include the NSE EOD and historical-data subscription page and its historical order/trade specification.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Common NSEpy failures and recovery steps
TooManyRedirects
This commonly indicates that the old endpoint or redirect chain no longer behaves as NSEpy expects. Confirm the installed version, reproduce the error with a small request, and inspect the exception and response URL. Avoid blindly editing URLs inside the installed package. If the endpoint is obsolete, move to a maintained library or an official historical-file source.
Empty DataFrame
Check the exact expiry, strike, option type, and date range. Test a shorter period and a known historical example. Record the result as empty rather than successful.
SSL, timeout, or connection errors
Check network and certificate configuration, retry with backoff, reduce request frequency, and avoid unnecessary concurrency. Headers or proxies do not guarantee access and may create policy or operational issues.
Unexpected columns
Print data.columns, preserve the raw response where possible, and create an explicit schema-mapping layer. Fail loudly when required fields are absent.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Repair Windows errors before they cause bigger problems3Fix the driver behind crashes, sound loss and screen glitchesBest Value
Partial coverage
Compare the requested contract manifest with completed files. Keep failed requests, empty responses, and coverage dates in separate logs so a partial download cannot be mistaken for a complete archive.
NSEpy alternatives and official data
The NSEpy repository names jugaad-data, NSEDownload, and nsepython as related alternatives. Treat these as software candidates, not guaranteed substitutes for a complete 15-year NIFTY-options archive. Test their current maintenance, endpoint coverage, schema, and licensing for your exact requirements.
| Requirement | Practical direction |
|---|---|
| Small educational experiment | Try NSEpy or a maintained community library after a small compatibility test. |
| Selected daily contracts | Use a validated contract manifest and a resumable downloader. |
| Complete daily archive | Obtain and normalize official historical files or a reputable archive vendor. |
| Intraday, tick, or order data | Use a dedicated licensed historical-data product. |
| Commercial redistribution | Confirm the appropriate NSE or vendor licence before using the data. |
NSE advertises official paid EOD and historical-data products for the F&O segment, including historical order-and-trade data. It describes EOD delivery through SFTP and provides product information through its data-information-vending directory. NSE states that pricing for its market-data products is effective from April 1, 2026; do not assume a price or coverage level without confirming the specific product directly.
Bottom line
NSEpy is useful for learning the request pattern and possibly retrieving selected daily NIFTY option contracts when its legacy NSE connection works. It is not a defensible promise of a complete, verified 15-year dataset in 2026.
Define the contract universe, test one known request, log empty and failed responses separately, validate every file, and publish coverage limits. For repeatable backtesting, institutional research, intraday data, or redistribution, prefer an official NSE product or a documented licensed data supplier.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




