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 - (step*num)
start_strike = nearest - (step*num)
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+(step*num*2):
#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 - (step*num)
start_strike = nearest - (step*num)
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+(step*num*2):
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 - (step*num)
start_strike = nearest - (step*num)
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+(step*num*2):
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))
Output
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)
Hi bro, very good code.. I am automating my trading strategy into python code. Need some guidance. How can I contact u?
You can contact me through LinkedIn.
TYVM
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.
Just format the output in Python code.
@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
Learn Flask or any other Framework and what you can do is reload the page every 5 minute automatically 🌛🙌
lol, reloading the page is soooo wrong in 2023.
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?
yes, it's actually 17693 lots. If you what the data per lot you have to multiply the data by lot_size
This is nice example. How can one plot banknifty converting the
json.loads
data from this code to the dataframe?is it possible to add difference (CE,PE) column also for each strike price and total CE and PE
How can I contact you?
You can contact me on LinkedIn or can reach out to me from my portfolio website.
can you add some example of stock like reliance support and resistance in code
I've already created trading strategies you can check it out on my github repo.
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..?
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...