DEV Community

Cover image for NSE Option Chain Data using Python
Mr.Shah
Mr.Shah

Posted on • Updated on

NSE Option Chain Data using Python

In Today's Article we are going to learn how to fetch Nifty and Bank Nifty Data using Python and it's going to be amazing.

From where we will Fetch Data?

Ofcourse it's Going to be NSE Website from here we will fetch data such as Strike Price, Call and Put Option Data and based on Call and Put option data we will discover at which level more people are interested in Call and Put Option.

Let's Get into Coding



# Libraries
import requests
import json
import math

# Python program to print

colored text and background

def strRed(skk): return "\033[91m {}\033[00m".format(skk)
def strGreen(skk): return "\033[92m {}\033[00m".format(skk)
def strYellow(skk): return "\033[93m {}\033[00m".format(skk)
def strLightPurple(skk): return "\033[94m {}\033[00m".format(skk)
def strPurple(skk): return "\033[95m {}\033[00m".format(skk)
def strCyan(skk): return "\033[96m {}\033[00m".format(skk)
def strLightGray(skk): return "\033[97m {}\033[00m".format(skk)
def strBlack(skk): return "\033[98m {}\033[00m".format(skk)
def strBold(skk): return "\033[1m {}\033[0m".format(skk)

# Method to get nearest strikes
def round_nearest(x,num=50): return int(math.ceil(float(x)/num)*num)
def nearest_strike_bnf(x): return round_nearest(x,100)
def nearest_strike_nf(x): return round_nearest(x,50)

# Urls for fetching Data
url_oc = "https://www.nseindia.com/option-chain"
url_bnf = 'https://www.nseindia.com/api/option-chain-indices?symbol=BANKNIFTY'
url_nf = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY'
url_indices = "https://www.nseindia.com/api/allIndices"

# Headers
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'accept-language': 'en,gu;q=0.9,hi;q=0.8',
'accept-encoding': 'gzip, deflate, br'}

sess = requests.Session()
cookies = dict()

# Local methods
def set_cookie():
request = sess.get(url_oc, headers=headers, timeout=5)
cookies = dict(request.cookies)

def get_data(url):
set_cookie()
response = sess.get(url, headers=headers, timeout=5, cookies=cookies)
if(response.status_code==401):
set_cookie()
response = sess.get(url_nf, headers=headers, timeout=5, cookies=cookies)
if(response.status_code==200):
return response.text
return ""

def set_header():
global bnf_ul
global nf_ul
global bnf_nearest
global nf_nearest
response_text = get_data(url_indices)
data = json.loads(response_text)
for index in data["data"]:
if index["index"]=="NIFTY 50":
nf_ul = index["last"]
print("nifty")
if index["index"]=="NIFTY BANK":
bnf_ul = index["last"]
print("banknifty")
bnf_nearest=nearest_strike_bnf(bnf_ul)
nf_nearest=nearest_strike_nf(nf_ul)

# Showing Header in structured format with Last Price and Nearest Strike

def print_header(index="",ul=0,nearest=0):
print(strPurple( index.ljust(12," ") + " => ")+ strLightPurple(" Last Price: ") + strBold(str(ul)) + strLightPurple(" Nearest Strike: ") + strBold(str(nearest)))

def print_hr():
print(strYellow("|".rjust(70,"-")))

# Fetching CE and PE data based on Nearest Expiry Date
def print_oi(num,step,nearest,url):
strike = nearest - (stepnum)
start_strike = nearest - (stepnum)
response_text = get_data(url)
data = json.loads(response_text)
currExpiryDate = data["records"]["expiryDates"][0]
for item in data['records']['data']:
if item["expiryDate"] == currExpiryDate:
if item["strikePrice"] == strike and item["strikePrice"] < start_strike+(stepnum2):
#print(strCyan(str(item["strikePrice"])) + strGreen(" CE ") + "[ " + strBold(str(item["CE"]["openInterest"]).rjust(10," ")) + " ]" + strRed(" PE ")+"[ " + strBold(str(item["PE"]["openInterest"]).rjust(10," ")) + " ]")
print(data["records"]["expiryDates"][0] + " " + str(item["strikePrice"]) + " CE " + "[ " + strBold(str(item["CE"]["openInterest"]).rjust(10," ")) + " ]" + " PE " + "[ " + strBold(str(item["PE"]["openInterest"]).rjust(10," ")) + " ]")
strike = strike + step

# Finding highest Open Interest of People's in CE based on CE data

def highest_oi_CE(num,step,nearest,url):
strike = nearest - (stepnum)
start_strike = nearest - (stepnum)
response_text = get_data(url)
data = json.loads(response_text)
currExpiryDate = data["records"]["expiryDates"][0]
max_oi = 0
max_oi_strike = 0
for item in data['records']['data']:
if item["expiryDate"] == currExpiryDate:
if item["strikePrice"] == strike and item["strikePrice"] < start_strike+(stepnum2):
if item["CE"]["openInterest"] > max_oi:
max_oi = item["CE"]["openInterest"]
max_oi_strike = item["strikePrice"]
strike = strike + step
return max_oi_strike

# Finding highest Open Interest of People's in PE based on PE data
def highest_oi_PE(num,step,nearest,url):
strike = nearest - (stepnum)
start_strike = nearest - (stepnum)
response_text = get_data(url)
data = json.loads(response_text)
currExpiryDate = data["records"]["expiryDates"][0]
max_oi = 0
max_oi_strike = 0
for item in data['records']['data']:
if item["expiryDate"] == currExpiryDate:
if item["strikePrice"] == strike and item["strikePrice"] < start_strike+(stepnum2):
if item["PE"]["openInterest"] > max_oi:
max_oi = item["PE"]["openInterest"]
max_oi_strike = item["strikePrice"]
strike = strike + step
return max_oi_strike

set_header()
print('\033c')
print_hr()
print_header("Nifty",nf_ul,nf_nearest)
print_hr()
print_oi(10,50,nf_nearest,url_nf)
print_hr()
print_header("Bank Nifty",bnf_ul,bnf_nearest)
print_hr()
print_oi(10,100,bnf_nearest,url_bnf)
print_hr()

# Finding Highest OI in Call Option In Nifty
nf_highestoi_CE = highest_oi_CE(10,50,nf_nearest,url_nf)

# Finding Highet OI in Put Option In Nifty
nf_highestoi_PE = highest_oi_PE(10,50,nf_nearest,url_nf)

# Finding Highest OI in Call Option In Bank Nifty
bnf_highestoi_CE = highest_oi_CE(10,100,bnf_nearest,url_bnf)

# Finding Highest OI in Put Option In Bank Nifty
bnf_highestoi_PE = highest_oi_PE(10,100,bnf_nearest,url_bnf)

print(strCyan(str("Major Support in Nifty:")) + str(nf_highestoi_CE))
print(strCyan(str("Major Resistance in Nifty:")) + str(nf_highestoi_PE))
print(strPurple(str("Major Support in Bank Nifty:")) + str(bnf_highestoi_CE))
print(strPurple(str("Major Resistance in Bank Nifty:")) + str(bnf_highestoi_PE))

Enter fullscreen mode Exit fullscreen mode




Output

NIFTY


BANKNIFTY

Part-2: Website

If you guys want me to Fetch Call and Put Option Data for Global Stocks and Indices let me know in Comment Section🙂✌️

GoodBye👋

Top comments (20)

Collapse
 
arjunhack profile image
Salai Arjun

Hi bro, very good code.. I am automating my trading strategy into python code. Need some guidance. How can I contact u?

Collapse
 
shahstavan profile image
Mr.Shah

You can contact me through LinkedIn.

Collapse
 
arnavdas profile image
Arnav-Das

TYVM

Collapse
 
kaurav1108 profile image
kaurav1108

Hi @shahstavan : Thank you for python program, I want to customise output as below
as in output i want to print the extra coloum as CENT and PENT and value inside those new 2 coloum based on total open interest number leangth.
eg. CE Open interest for 17400 strike = 12345678 then --> in CENT Coloum is should print first 3 digit of number : 123
eg. PE Open interest for 17400 strike = 456789 then --> in PENT Coloum is should print first 3 digit of number : 45
and leangth condition as :
if leangth is 6 digit then show 1st digit of number
if leangth is 7 digit then show 2st digit of number
if leangth is 8 digit then show 3st digit of number
if leangth is 9 digit then show 4st digit of number
can you help me with code.

Collapse
 
shahstavan profile image
Mr.Shah

Just format the output in Python code.

Collapse
 
kaurav1108 profile image
kaurav1108 • Edited

@shahstavan : Hi, I have updated code my self and its working fine as per my requirement.
Now i can you help me to run this code every 5 min and updated on some html page

Collapse
 
shahstavan profile image
Mr.Shah

Learn Flask or any other Framework and what you can do is reload the page every 5 minute automatically 🌛🙌

Thread Thread
 
thecodingsage profile image
Sivayogeith Umamaheswaran

lol, reloading the page is soooo wrong in 2023.

Collapse
 
pradip_ profile image
Pradip Mukhopadhyay

Hi,

Is the data reported by Bandl is correct?
E.g. I am seeing OI data is much lower scale compared to that of say reported by other Options tools (e.g. Opstra or SensiBull).
Like this shows data as lots? E.g.
03-Nov-2022 17550 CE ( 294.8) [ 1167 ] { 250 } | PE ( 44.5) [ 17693 ] { 8428 }

It's actually 17693 lots?

Collapse
 
anirudh12 profile image
Anirudh-12

yes, it's actually 17693 lots. If you what the data per lot you have to multiply the data by lot_size

Collapse
 
vegaonline profile image
Abhijit Bhattacharyya

This is nice example. How can one plot banknifty converting the json.loads data from this code to the dataframe?

Collapse
 
chintu35395015 profile image
Chintu

is it possible to add difference (CE,PE) column also for each strike price and total CE and PE

Collapse
 
muhammed_nihal_c044fbb99c profile image
Muhammed Nihal

How can I contact you?

Collapse
 
shahstavan profile image
Mr.Shah

You can contact me on LinkedIn or can reach out to me from my portfolio website.

Collapse
 
pavitra profile image
Pavitra

can you add some example of stock like reliance support and resistance in code

Collapse
 
shahstavan profile image
Mr.Shah

I've already created trading strategies you can check it out on my github repo.

Collapse
 
chandra6011 profile image
C P Patel 🇮🇳

Thats great code... From where should one pick up Current time and date of Exchange and whether the "today" is an Expiry day or not..?

Collapse
 
taniksood profile image
taniksood

Hello dear, can you help me out with python code to fetch live data for NSE Top 20 Contracts pl ?

nseindia.com/market-data/equity-de...