nsepython 1.1__tar.gz → 1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nsepython-1.1 → nsepython-1.2}/PKG-INFO +1 -1
- {nsepython-1.1 → nsepython-1.2}/nsepython/rahu.py +0 -17
- {nsepython-1.1 → nsepython-1.2}/nsepython.egg-info/PKG-INFO +1 -1
- {nsepython-1.1 → nsepython-1.2}/nsepython.egg-info/SOURCES.txt +0 -1
- {nsepython-1.1 → nsepython-1.2}/setup.py +1 -1
- nsepython-1.1/nsepython/rahuserver.py +0 -812
- {nsepython-1.1 → nsepython-1.2}/LICENSE +0 -0
- {nsepython-1.1 → nsepython-1.2}/README.md +0 -0
- {nsepython-1.1 → nsepython-1.2}/nsepython/__init__.py +0 -0
- {nsepython-1.1 → nsepython-1.2}/nsepython.egg-info/dependency_links.txt +0 -0
- {nsepython-1.1 → nsepython-1.2}/nsepython.egg-info/requires.txt +0 -0
- {nsepython-1.1 → nsepython-1.2}/nsepython.egg-info/top_level.txt +0 -0
- {nsepython-1.1 → nsepython-1.2}/setup.cfg +0 -0
|
@@ -13,23 +13,6 @@ import re
|
|
|
13
13
|
|
|
14
14
|
mode ='local'
|
|
15
15
|
|
|
16
|
-
if(mode=='vpn'):
|
|
17
|
-
def nsefetch(payload):
|
|
18
|
-
if (("%26" in payload) or ("%20" in payload)):
|
|
19
|
-
encoded_url = payload
|
|
20
|
-
else:
|
|
21
|
-
encoded_url = urllib.parse.quote(payload, safe=':/?&=')
|
|
22
|
-
payload_var = 'curl -b cookies.txt "' + encoded_url + '"' + curl_headers + ''
|
|
23
|
-
try:
|
|
24
|
-
output = os.popen(payload_var).read()
|
|
25
|
-
output=json.loads(output)
|
|
26
|
-
except ValueError: # includes simplejson.decoder.JSONDecodeError:
|
|
27
|
-
payload2 = "https://www.nseindia.com"
|
|
28
|
-
output2 = os.popen('curl -c cookies.txt "'+payload2+'"'+curl_headers+'').read()
|
|
29
|
-
|
|
30
|
-
output = os.popen(payload_var).read()
|
|
31
|
-
output=json.loads(output)
|
|
32
|
-
return output
|
|
33
16
|
if(mode=='local'):
|
|
34
17
|
def nsefetch(payload):
|
|
35
18
|
output = requests.get(payload,headers=headers).json()
|
|
@@ -6,7 +6,7 @@ with open("README.md", "r") as fh:
|
|
|
6
6
|
setuptools.setup(
|
|
7
7
|
name = 'nsepython',
|
|
8
8
|
packages=setuptools.find_packages(),
|
|
9
|
-
version = '1.
|
|
9
|
+
version = '1.2',
|
|
10
10
|
include_package_data=True,
|
|
11
11
|
description = 'Python library for NSE India APIs',
|
|
12
12
|
long_description=long_description,
|
|
@@ -1,812 +0,0 @@
|
|
|
1
|
-
import os,sys
|
|
2
|
-
# os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
|
3
|
-
# sys.path.insert(1, os.path.join(sys.path[0], '..'))
|
|
4
|
-
|
|
5
|
-
import requests
|
|
6
|
-
import pandas as pd
|
|
7
|
-
import json
|
|
8
|
-
import random
|
|
9
|
-
import datetime,time
|
|
10
|
-
import logging
|
|
11
|
-
import re
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
mode ='vpn'
|
|
15
|
-
|
|
16
|
-
if(mode=='vpn'):
|
|
17
|
-
def nsefetch(payload):
|
|
18
|
-
if (("%26" in payload) or ("%20" in payload)):
|
|
19
|
-
encoded_url = payload
|
|
20
|
-
else:
|
|
21
|
-
encoded_url = urllib.parse.quote(payload, safe=':/?&=')
|
|
22
|
-
payload_var = 'curl -b cookies.txt "' + encoded_url + '"' + curl_headers + ''
|
|
23
|
-
try:
|
|
24
|
-
output = os.popen(payload_var).read()
|
|
25
|
-
output=json.loads(output)
|
|
26
|
-
except ValueError: # includes simplejson.decoder.JSONDecodeError:
|
|
27
|
-
payload2 = "https://www.nseindia.com"
|
|
28
|
-
output2 = os.popen('curl -c cookies.txt "'+payload2+'"'+curl_headers+'').read()
|
|
29
|
-
|
|
30
|
-
output = os.popen(payload_var).read()
|
|
31
|
-
output=json.loads(output)
|
|
32
|
-
return output
|
|
33
|
-
if(mode=='local'):
|
|
34
|
-
def nsefetch(payload):
|
|
35
|
-
output = requests.get(payload,headers=headers).json()
|
|
36
|
-
return output
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
headers = {
|
|
40
|
-
'Connection': 'keep-alive',
|
|
41
|
-
'Cache-Control': 'max-age=0',
|
|
42
|
-
'DNT': '1',
|
|
43
|
-
'Upgrade-Insecure-Requests': '1',
|
|
44
|
-
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
|
|
45
|
-
'Sec-Fetch-User': '?1',
|
|
46
|
-
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
|
|
47
|
-
'Sec-Fetch-Site': 'none',
|
|
48
|
-
'Sec-Fetch-Mode': 'navigate',
|
|
49
|
-
'Accept-Encoding': 'gzip, deflate, br',
|
|
50
|
-
'Accept-Language': 'en-US,en;q=0.9,hi;q=0.8',
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
#Curl headers
|
|
54
|
-
curl_headers = ''' -H "authority: beta.nseindia.com" -H "cache-control: max-age=0" -H "dnt: 1" -H "upgrade-insecure-requests: 1" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" -H "sec-fetch-user: ?1" -H "accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" -H "sec-fetch-site: none" -H "sec-fetch-mode: navigate" -H "accept-encoding: gzip, deflate, br" -H "accept-language: en-US,en;q=0.9,hi;q=0.8" --compressed'''
|
|
55
|
-
|
|
56
|
-
run_time=datetime.datetime.now()
|
|
57
|
-
|
|
58
|
-
#Constants
|
|
59
|
-
indices = ['NIFTY','FINNIFTY','BANKNIFTY']
|
|
60
|
-
|
|
61
|
-
def running_status():
|
|
62
|
-
start_now=datetime.datetime.now().replace(hour=9, minute=15, second=0, microsecond=0)
|
|
63
|
-
end_now=datetime.datetime.now().replace(hour=15, minute=30, second=0, microsecond=0)
|
|
64
|
-
return start_now<datetime.datetime.now()<end_now
|
|
65
|
-
|
|
66
|
-
#Getting FNO Symboles
|
|
67
|
-
def fnolist():
|
|
68
|
-
# df = pd.read_csv("https://www1.nseindia.com/content/fo/fo_mktlots.csv")
|
|
69
|
-
# return [x.strip(' ') for x in df.drop(df.index[3]).iloc[:,1].to_list()]
|
|
70
|
-
|
|
71
|
-
positions = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
72
|
-
|
|
73
|
-
nselist=['NIFTY','NIFTYIT','BANKNIFTY']
|
|
74
|
-
|
|
75
|
-
i=0
|
|
76
|
-
for x in range(i, len(positions['data'])):
|
|
77
|
-
nselist=nselist+[positions['data'][x]['symbol']]
|
|
78
|
-
|
|
79
|
-
return nselist
|
|
80
|
-
|
|
81
|
-
def nsesymbolpurify(symbol):
|
|
82
|
-
symbol = symbol.replace('&','%26') #URL Parse for Stocks Like M&M Finance
|
|
83
|
-
return symbol
|
|
84
|
-
|
|
85
|
-
def nse_optionchain_scrapper(symbol):
|
|
86
|
-
symbol = nsesymbolpurify(symbol)
|
|
87
|
-
if any(x in symbol for x in indices):
|
|
88
|
-
payload = nsefetch('https://www.nseindia.com/api/option-chain-indices?symbol='+symbol)
|
|
89
|
-
else:
|
|
90
|
-
payload = nsefetch('https://www.nseindia.com/api/option-chain-equities?symbol='+symbol)
|
|
91
|
-
return payload
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def oi_chain_builder(symbol,expiry="latest",oi_mode="full"):
|
|
95
|
-
|
|
96
|
-
payload = nse_optionchain_scrapper(symbol)
|
|
97
|
-
|
|
98
|
-
if(oi_mode=='compact'):
|
|
99
|
-
col_names = ['CALLS_OI','CALLS_Chng in OI','CALLS_Volume','CALLS_IV','CALLS_LTP','CALLS_Net Chng','Strike Price','PUTS_OI','PUTS_Chng in OI','PUTS_Volume','PUTS_IV','PUTS_LTP','PUTS_Net Chng']
|
|
100
|
-
if(oi_mode=='full'):
|
|
101
|
-
col_names = ['CALLS_Chart','CALLS_OI','CALLS_Chng in OI','CALLS_Volume','CALLS_IV','CALLS_LTP','CALLS_Net Chng','CALLS_Bid Qty','CALLS_Bid Price','CALLS_Ask Price','CALLS_Ask Qty','Strike Price','PUTS_Bid Qty','PUTS_Bid Price','PUTS_Ask Price','PUTS_Ask Qty','PUTS_Net Chng','PUTS_LTP','PUTS_IV','PUTS_Volume','PUTS_Chng in OI','PUTS_OI','PUTS_Chart']
|
|
102
|
-
oi_data = pd.DataFrame(columns = col_names)
|
|
103
|
-
|
|
104
|
-
#oi_row = {'CALLS_OI':0, 'CALLS_Chng in OI':0, 'CALLS_Volume':0, 'CALLS_IV':0, 'CALLS_LTP':0, 'CALLS_Net Chng':0, 'Strike Price':0, 'PUTS_OI':0, 'PUTS_Chng in OI':0, 'PUTS_Volume':0, 'PUTS_IV':0, 'PUTS_LTP':0, 'PUTS_Net Chng':0}
|
|
105
|
-
oi_row = {'CALLS_OI':0, 'CALLS_Chng in OI':0, 'CALLS_Volume':0, 'CALLS_IV':0, 'CALLS_LTP':0, 'CALLS_Net Chng':0, 'CALLS_Bid Qty':0,'CALLS_Bid Price':0,'CALLS_Ask Price':0,'CALLS_Ask Qty':0,'Strike Price':0, 'PUTS_OI':0, 'PUTS_Chng in OI':0, 'PUTS_Volume':0, 'PUTS_IV':0, 'PUTS_LTP':0, 'PUTS_Net Chng':0,'PUTS_Bid Qty':0,'PUTS_Bid Price':0,'PUTS_Ask Price':0,'PUTS_Ask Qty':0}
|
|
106
|
-
if(expiry=="latest"):
|
|
107
|
-
expiry = payload['records']['expiryDates'][0]
|
|
108
|
-
m=0
|
|
109
|
-
for m in range(len(payload['records']['data'])):
|
|
110
|
-
if(payload['records']['data'][m]['expiryDate']==expiry):
|
|
111
|
-
if(1>0):
|
|
112
|
-
try:
|
|
113
|
-
oi_row['CALLS_OI']=payload['records']['data'][m]['CE']['openInterest']
|
|
114
|
-
oi_row['CALLS_Chng in OI']=payload['records']['data'][m]['CE']['changeinOpenInterest']
|
|
115
|
-
oi_row['CALLS_Volume']=payload['records']['data'][m]['CE']['totalTradedVolume']
|
|
116
|
-
oi_row['CALLS_IV']=payload['records']['data'][m]['CE']['impliedVolatility']
|
|
117
|
-
oi_row['CALLS_LTP']=payload['records']['data'][m]['CE']['lastPrice']
|
|
118
|
-
oi_row['CALLS_Net Chng']=payload['records']['data'][m]['CE']['change']
|
|
119
|
-
if(oi_mode=='full'):
|
|
120
|
-
oi_row['CALLS_Bid Qty']=payload['records']['data'][m]['CE']['bidQty']
|
|
121
|
-
oi_row['CALLS_Bid Price']=payload['records']['data'][m]['CE']['bidprice']
|
|
122
|
-
oi_row['CALLS_Ask Price']=payload['records']['data'][m]['CE']['askPrice']
|
|
123
|
-
oi_row['CALLS_Ask Qty']=payload['records']['data'][m]['CE']['askQty']
|
|
124
|
-
except KeyError:
|
|
125
|
-
oi_row['CALLS_OI'], oi_row['CALLS_Chng in OI'], oi_row['CALLS_Volume'], oi_row['CALLS_IV'], oi_row['CALLS_LTP'],oi_row['CALLS_Net Chng']=0,0,0,0,0,0
|
|
126
|
-
if(oi_mode=='full'):
|
|
127
|
-
oi_row['CALLS_Bid Qty'],oi_row['CALLS_Bid Price'],oi_row['CALLS_Ask Price'],oi_row['CALLS_Ask Qty']=0,0,0,0
|
|
128
|
-
pass
|
|
129
|
-
|
|
130
|
-
oi_row['Strike Price']=payload['records']['data'][m]['strikePrice']
|
|
131
|
-
|
|
132
|
-
try:
|
|
133
|
-
oi_row['PUTS_OI']=payload['records']['data'][m]['PE']['openInterest']
|
|
134
|
-
oi_row['PUTS_Chng in OI']=payload['records']['data'][m]['PE']['changeinOpenInterest']
|
|
135
|
-
oi_row['PUTS_Volume']=payload['records']['data'][m]['PE']['totalTradedVolume']
|
|
136
|
-
oi_row['PUTS_IV']=payload['records']['data'][m]['PE']['impliedVolatility']
|
|
137
|
-
oi_row['PUTS_LTP']=payload['records']['data'][m]['PE']['lastPrice']
|
|
138
|
-
oi_row['PUTS_Net Chng']=payload['records']['data'][m]['PE']['change']
|
|
139
|
-
if(oi_mode=='full'):
|
|
140
|
-
oi_row['PUTS_Bid Qty']=payload['records']['data'][m]['PE']['bidQty']
|
|
141
|
-
oi_row['PUTS_Bid Price']=payload['records']['data'][m]['PE']['bidprice']
|
|
142
|
-
oi_row['PUTS_Ask Price']=payload['records']['data'][m]['PE']['askPrice']
|
|
143
|
-
oi_row['PUTS_Ask Qty']=payload['records']['data'][m]['PE']['askQty']
|
|
144
|
-
except KeyError:
|
|
145
|
-
oi_row['PUTS_OI'], oi_row['PUTS_Chng in OI'], oi_row['PUTS_Volume'], oi_row['PUTS_IV'], oi_row['PUTS_LTP'],oi_row['PUTS_Net Chng']=0,0,0,0,0,0
|
|
146
|
-
if(oi_mode=='full'):
|
|
147
|
-
oi_row['PUTS_Bid Qty'],oi_row['PUTS_Bid Price'],oi_row['PUTS_Ask Price'],oi_row['PUTS_Ask Qty']=0,0,0,0
|
|
148
|
-
else:
|
|
149
|
-
logging.info(m)
|
|
150
|
-
|
|
151
|
-
if(oi_mode=='full'):
|
|
152
|
-
oi_row['CALLS_Chart'],oi_row['PUTS_Chart']=0,0
|
|
153
|
-
#oi_data = oi_data.append(oi_row, ignore_index=True)
|
|
154
|
-
#oi_data = pd.concat([oi_data, oi_row], ignore_index=True)
|
|
155
|
-
oi_data = pd.concat([oi_data, pd.DataFrame([oi_row])], ignore_index=True)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
oi_data['time_stamp']=payload['records']['timestamp']
|
|
160
|
-
return oi_data,float(payload['records']['underlyingValue']),payload['records']['timestamp']
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def nse_quote(symbol,section=""):
|
|
164
|
-
#https://forum.unofficed.com/t/nsetools-get-quote-is-not-fetching-delivery-data-and-delivery-can-you-include-this-as-part-of-feature-request/1115/4
|
|
165
|
-
symbol = nsesymbolpurify(symbol)
|
|
166
|
-
|
|
167
|
-
if(section==""):
|
|
168
|
-
if any(x in symbol for x in fnolist()):
|
|
169
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-derivative?symbol='+symbol)
|
|
170
|
-
else:
|
|
171
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-equity?symbol='+symbol)
|
|
172
|
-
return payload
|
|
173
|
-
|
|
174
|
-
if(section!=""):
|
|
175
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-equity?symbol='+symbol+'§ion='+section)
|
|
176
|
-
return payload
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def nse_expirydetails(payload,i=0):
|
|
180
|
-
currentExpiry = payload['records']['expiryDates'][i]
|
|
181
|
-
currentExpiry = datetime.datetime.strptime(currentExpiry,'%d-%b-%Y').date() # converting json datetime to alice datetime
|
|
182
|
-
date_today = run_time.strftime('%Y-%m-%d') # required to remove hh:mm:ss
|
|
183
|
-
date_today = datetime.datetime.strptime(date_today,'%Y-%m-%d').date()
|
|
184
|
-
dte = (currentExpiry - date_today).days
|
|
185
|
-
return currentExpiry,dte
|
|
186
|
-
|
|
187
|
-
def pcr(payload,inp='0'):
|
|
188
|
-
ce_oi = 0
|
|
189
|
-
pe_oi = 0
|
|
190
|
-
for i in payload['records']['data']:
|
|
191
|
-
if i['expiryDate'] == payload['records']['expiryDates'][inp]:
|
|
192
|
-
try:
|
|
193
|
-
ce_oi += i['CE']['openInterest']
|
|
194
|
-
pe_oi += i['PE']['openInterest']
|
|
195
|
-
except KeyError:
|
|
196
|
-
pass
|
|
197
|
-
return pe_oi / ce_oi
|
|
198
|
-
|
|
199
|
-
def nse_quote_ltp(symbol,expiryDate="latest",optionType="-",strikePrice=0):
|
|
200
|
-
payload = nse_quote(symbol)
|
|
201
|
-
#https://stackoverflow.com/questions/7961363/removing-duplicates-in-lists
|
|
202
|
-
#https://stackoverflow.com/questions/19199984/sort-a-list-in-python
|
|
203
|
-
|
|
204
|
-
#BankNIFTY and NIFTY has weekly options. Using this Jugaad which has primary base of assumption that Reliance will not step out of FNO.
|
|
205
|
-
#forum.unofficed.com/t/unable-to-find-nse-quote-meta-api/702/4
|
|
206
|
-
if((symbol in indices) and (optionType=="Fut")):
|
|
207
|
-
dates = expiry_list("RELIANCE","list")
|
|
208
|
-
if(expiryDate=="latest"): expiryDate=dates[0]
|
|
209
|
-
if(expiryDate=="next"): expiryDate=dates[1]
|
|
210
|
-
|
|
211
|
-
if(expiryDate=="latest") or (expiryDate=="next"):
|
|
212
|
-
dates=list(set((payload["expiryDates"])))
|
|
213
|
-
dates.sort(key = lambda date: datetime.datetime.strptime(date, '%d-%b-%Y'))
|
|
214
|
-
if(expiryDate=="latest"): expiryDate=dates[0]
|
|
215
|
-
if(expiryDate=="next"): expiryDate=dates[1]
|
|
216
|
-
|
|
217
|
-
meta = "Options"
|
|
218
|
-
if(optionType=="Fut"): meta = "Futures"
|
|
219
|
-
if(optionType=="PE"):optionType="Put"
|
|
220
|
-
if(optionType=="CE"):optionType="Call"
|
|
221
|
-
|
|
222
|
-
if(optionType!="-"):
|
|
223
|
-
for i in payload['stocks']:
|
|
224
|
-
if meta in i['metadata']['instrumentType']:
|
|
225
|
-
#print(i['metadata'])
|
|
226
|
-
if(optionType=="Fut"):
|
|
227
|
-
if(i['metadata']['expiryDate']==expiryDate):
|
|
228
|
-
lastPrice = i['metadata']['lastPrice']
|
|
229
|
-
|
|
230
|
-
if((optionType=="Put")or(optionType=="Call")):
|
|
231
|
-
if (i['metadata']["expiryDate"]==expiryDate):
|
|
232
|
-
if (i['metadata']["optionType"]==optionType):
|
|
233
|
-
if (i['metadata']["strikePrice"]==strikePrice):
|
|
234
|
-
#print(i['metadata'])
|
|
235
|
-
lastPrice = i['metadata']['lastPrice']
|
|
236
|
-
|
|
237
|
-
if(optionType=="-"):
|
|
238
|
-
lastPrice = payload['underlyingValue']
|
|
239
|
-
|
|
240
|
-
return lastPrice
|
|
241
|
-
|
|
242
|
-
# print(nse_quote_ltp("RELIANCE"))
|
|
243
|
-
# print(nse_quote_ltp("RELIANCE","latest","Fut"))
|
|
244
|
-
# print(nse_quote_ltp("RELIANCE","next","Fut"))
|
|
245
|
-
# print(nse_quote_ltp("BANKNIFTY","latest","PE",32000))
|
|
246
|
-
# print(nse_quote_ltp("BANKNIFTY","next","PE",32000))
|
|
247
|
-
# print(nse_quote_ltp("BANKNIFTY","10-Jun-2021","PE",32000))
|
|
248
|
-
# print(nse_quote_ltp("BANKNIFTY","17-Jun-2021","PE",32000))
|
|
249
|
-
# print(nse_quote_ltp("RELIANCE","latest","PE",2300))
|
|
250
|
-
# print(nse_quote_ltp("RELIANCE","next","PE",2300))
|
|
251
|
-
|
|
252
|
-
def nse_quote_meta(symbol,expiryDate="latest",optionType="-",strikePrice=0):
|
|
253
|
-
payload = nse_quote(symbol)
|
|
254
|
-
#https://stackoverflow.com/questions/7961363/removing-duplicates-in-lists
|
|
255
|
-
#https://stackoverflow.com/questions/19199984/sort-a-list-in-python
|
|
256
|
-
|
|
257
|
-
#BankNIFTY and NIFTY has weekly options. Using this Jugaad which has primary base of assumption that Reliance will not step out of FNO.
|
|
258
|
-
#forum.unofficed.com/t/unable-to-find-nse-quote-meta-api/702/4
|
|
259
|
-
if((symbol in indices) and (optionType=="Fut")):
|
|
260
|
-
dates = expiry_list("RELIANCE","list")
|
|
261
|
-
if(expiryDate=="latest"): expiryDate=dates[0]
|
|
262
|
-
if(expiryDate=="next"): expiryDate=dates[1]
|
|
263
|
-
|
|
264
|
-
if(expiryDate=="latest") or (expiryDate=="next"):
|
|
265
|
-
dates=list(set((payload["expiryDates"])))
|
|
266
|
-
dates.sort(key = lambda date: datetime.datetime.strptime(date, '%d-%b-%Y'))
|
|
267
|
-
if(expiryDate=="latest"): expiryDate=dates[0]
|
|
268
|
-
if(expiryDate=="next"): expiryDate=dates[1]
|
|
269
|
-
|
|
270
|
-
meta = "Options"
|
|
271
|
-
if(optionType=="Fut"): meta = "Futures"
|
|
272
|
-
if(optionType=="PE"):optionType="Put"
|
|
273
|
-
if(optionType=="CE"):optionType="Call"
|
|
274
|
-
|
|
275
|
-
if(optionType!="-"):
|
|
276
|
-
for i in payload['stocks']:
|
|
277
|
-
if meta in i['metadata']['instrumentType']:
|
|
278
|
-
#print(i['metadata'])
|
|
279
|
-
if(optionType=="Fut"):
|
|
280
|
-
if(i['metadata']['expiryDate']==expiryDate):
|
|
281
|
-
metadata = i['metadata']
|
|
282
|
-
|
|
283
|
-
if((optionType=="Put")or(optionType=="Call")):
|
|
284
|
-
if (i['metadata']["expiryDate"]==expiryDate):
|
|
285
|
-
if (i['metadata']["optionType"]==optionType):
|
|
286
|
-
if (i['metadata']["strikePrice"]==strikePrice):
|
|
287
|
-
#print(i['metadata'])
|
|
288
|
-
metadata = i['metadata']
|
|
289
|
-
|
|
290
|
-
if(optionType=="-"):
|
|
291
|
-
metadata = i['metadata']
|
|
292
|
-
|
|
293
|
-
return metadata
|
|
294
|
-
|
|
295
|
-
def nse_optionchain_ltp(payload,strikePrice,optionType,inp=0,intent=""):
|
|
296
|
-
expiryDate=payload['records']['expiryDates'][inp]
|
|
297
|
-
for x in range(len(payload['records']['data'])):
|
|
298
|
-
if((payload['records']['data'][x]['strikePrice']==strikePrice) & (payload['records']['data'][x]['expiryDate']==expiryDate)):
|
|
299
|
-
if(intent==""): return payload['records']['data'][x][optionType]['lastPrice']
|
|
300
|
-
if(intent=="sell"): return payload['records']['data'][x][optionType]['bidprice']
|
|
301
|
-
if(intent=="buy"): return payload['records']['data'][x][optionType]['askPrice']
|
|
302
|
-
|
|
303
|
-
def nse_eq(symbol):
|
|
304
|
-
symbol = nsesymbolpurify(symbol)
|
|
305
|
-
try:
|
|
306
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-equity?symbol='+symbol)
|
|
307
|
-
try:
|
|
308
|
-
if(payload['error']=={}):
|
|
309
|
-
print("Please use nse_fno() function to reduce latency.")
|
|
310
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-derivative?symbol='+symbol)
|
|
311
|
-
except:
|
|
312
|
-
pass
|
|
313
|
-
except KeyError:
|
|
314
|
-
print("Getting Error While Fetching.")
|
|
315
|
-
return payload
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def nse_fno(symbol):
|
|
319
|
-
symbol = nsesymbolpurify(symbol)
|
|
320
|
-
try:
|
|
321
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-derivative?symbol='+symbol)
|
|
322
|
-
try:
|
|
323
|
-
if(payload['error']=={}):
|
|
324
|
-
print("Please use nse_eq() function to reduce latency.")
|
|
325
|
-
payload = nsefetch('https://www.nseindia.com/api/quote-equity?symbol='+symbol)
|
|
326
|
-
except KeyError:
|
|
327
|
-
pass
|
|
328
|
-
except KeyError:
|
|
329
|
-
print("Getting Error While Fetching.")
|
|
330
|
-
return payload
|
|
331
|
-
|
|
332
|
-
def quote_equity(symbol):
|
|
333
|
-
return nse_eq(symbol)
|
|
334
|
-
|
|
335
|
-
def quote_derivative(symbol):
|
|
336
|
-
return nse_fno(symbol)
|
|
337
|
-
|
|
338
|
-
def option_chain(symbol):
|
|
339
|
-
return nse_optionchain_scrapper(symbol)
|
|
340
|
-
|
|
341
|
-
def nse_holidays(type="trading"):
|
|
342
|
-
if(type=="clearing"):
|
|
343
|
-
payload = nsefetch('https://www.nseindia.com/api/holiday-master?type=clearing')
|
|
344
|
-
if(type=="trading"):
|
|
345
|
-
payload = nsefetch('https://www.nseindia.com/api/holiday-master?type=trading')
|
|
346
|
-
return payload
|
|
347
|
-
|
|
348
|
-
def holiday_master(type="trading"):
|
|
349
|
-
return nse_holidays(type)
|
|
350
|
-
|
|
351
|
-
def nse_results(index="equities",period="Quarterly"):
|
|
352
|
-
if(index=="equities") or (index=="debt") or (index=="sme"):
|
|
353
|
-
if(period=="Quarterly") or (period=="Annual")or (period=="Half-Yearly")or (period=="Others"):
|
|
354
|
-
payload = nsefetch('https://www.nseindia.com/api/corporates-financial-results?index='+index+'&period='+period)
|
|
355
|
-
return pd.json_normalize(payload)
|
|
356
|
-
else:
|
|
357
|
-
print("Give Correct Period Input")
|
|
358
|
-
else:
|
|
359
|
-
print("Give Correct Index Input")
|
|
360
|
-
|
|
361
|
-
def nse_events():
|
|
362
|
-
output = nsefetch('https://www.nseindia.com/api/event-calendar')
|
|
363
|
-
return pd.json_normalize(output)
|
|
364
|
-
|
|
365
|
-
def nse_past_results(symbol):
|
|
366
|
-
symbol = nsesymbolpurify(symbol)
|
|
367
|
-
return nsefetch('https://www.nseindia.com/api/results-comparision?symbol='+symbol)
|
|
368
|
-
|
|
369
|
-
def expiry_list(symbol,type="list"):
|
|
370
|
-
logging.info("Getting Expiry List of: "+ symbol)
|
|
371
|
-
|
|
372
|
-
if(type!="list"):
|
|
373
|
-
payload = nse_optionchain_scrapper(symbol)
|
|
374
|
-
payload = pd.DataFrame({'Date':payload['records']['expiryDates']})
|
|
375
|
-
return payload
|
|
376
|
-
|
|
377
|
-
if(type=="list"):
|
|
378
|
-
payload = nse_quote(symbol)
|
|
379
|
-
dates=list(set((payload["expiryDates"])))
|
|
380
|
-
dates.sort(key = lambda date: datetime.datetime.strptime(date, '%d-%b-%Y'))
|
|
381
|
-
return dates
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
def nse_custom_function_secfno(symbol,attribute="lastPrice"):
|
|
385
|
-
positions = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
386
|
-
endp = len(positions['data'])
|
|
387
|
-
for x in range(0, endp):
|
|
388
|
-
if(positions['data'][x]['symbol']==symbol.upper()):
|
|
389
|
-
return positions['data'][x][attribute]
|
|
390
|
-
|
|
391
|
-
def nse_blockdeal():
|
|
392
|
-
payload = nsefetch('https://nseindia.com/api/block-deal')
|
|
393
|
-
return payload
|
|
394
|
-
|
|
395
|
-
def nse_marketStatus():
|
|
396
|
-
payload = nsefetch('https://nseindia.com/api/marketStatus')
|
|
397
|
-
return payload
|
|
398
|
-
|
|
399
|
-
def nse_circular(mode="latest"):
|
|
400
|
-
if(mode=="latest"):
|
|
401
|
-
payload = nsefetch('https://nseindia.com/api/latest-circular')
|
|
402
|
-
else:
|
|
403
|
-
payload = nsefetch('https://www.nseindia.com/api/circulars')
|
|
404
|
-
return payload
|
|
405
|
-
|
|
406
|
-
def nse_fiidii(mode="pandas"):
|
|
407
|
-
try:
|
|
408
|
-
if(mode=="pandas"):
|
|
409
|
-
return pd.DataFrame(nsefetch('https://www.nseindia.com/api/fiidiiTradeReact'))
|
|
410
|
-
else:
|
|
411
|
-
return nsefetch('https://www.nseindia.com/api/fiidiiTradeReact')
|
|
412
|
-
except:
|
|
413
|
-
logger.info("Pandas is not working for some reason.")
|
|
414
|
-
return nsefetch('https://www.nseindia.com/api/fiidiiTradeReact')
|
|
415
|
-
|
|
416
|
-
def nsetools_get_quote(symbol):
|
|
417
|
-
payload = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
418
|
-
for m in range(len(payload['data'])):
|
|
419
|
-
if(payload['data'][m]['symbol']==symbol.upper()):
|
|
420
|
-
return payload['data'][m]
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
def nse_index():
|
|
424
|
-
payload = nsefetch('https://iislliveblob.niftyindices.com/jsonfiles/LiveIndicesWatch.json')
|
|
425
|
-
payload = pd.DataFrame(payload["data"])
|
|
426
|
-
return payload
|
|
427
|
-
|
|
428
|
-
def nse_get_index_list():
|
|
429
|
-
payload = nsefetch('https://iislliveblob.niftyindices.com/jsonfiles/LiveIndicesWatch.json')
|
|
430
|
-
payload = pd.DataFrame(payload["data"])
|
|
431
|
-
return payload["indexName"].tolist()
|
|
432
|
-
|
|
433
|
-
def nse_get_index_quote(index):
|
|
434
|
-
payload = nsefetch('https://iislliveblob.niftyindices.com/jsonfiles/LiveIndicesWatch.json')
|
|
435
|
-
for m in range(len(payload['data'])):
|
|
436
|
-
if(payload['data'][m]["indexName"] == index.upper()):
|
|
437
|
-
return payload['data'][m]
|
|
438
|
-
|
|
439
|
-
def nse_get_advances_declines(mode="pandas"):
|
|
440
|
-
try:
|
|
441
|
-
if(mode=="pandas"):
|
|
442
|
-
positions = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
443
|
-
return pd.DataFrame(positions['data'])
|
|
444
|
-
else:
|
|
445
|
-
return nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
446
|
-
except:
|
|
447
|
-
logger.info("Pandas is not working for some reason.")
|
|
448
|
-
return nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
449
|
-
|
|
450
|
-
def nse_get_top_losers():
|
|
451
|
-
positions = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
452
|
-
df = pd.DataFrame(positions['data'])
|
|
453
|
-
df = df.sort_values(by="pChange")
|
|
454
|
-
return df.head(5)
|
|
455
|
-
|
|
456
|
-
def nse_get_top_gainers():
|
|
457
|
-
positions = nsefetch('https://www.nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O')
|
|
458
|
-
df = pd.DataFrame(positions['data'])
|
|
459
|
-
df = df.sort_values(by="pChange" , ascending = False)
|
|
460
|
-
return df.head(5)
|
|
461
|
-
|
|
462
|
-
def nse_get_fno_lot_sizes(symbol="all",mode="list"):
|
|
463
|
-
url="https://archives.nseindia.com/content/fo/fo_mktlots.csv"
|
|
464
|
-
|
|
465
|
-
if(mode=="list"):
|
|
466
|
-
s=requests.get(url).text
|
|
467
|
-
res_dict = {}
|
|
468
|
-
for line in s.split('\n'):
|
|
469
|
-
if line != '' and re.search(',', line) and (line.casefold().find('symbol') == -1):
|
|
470
|
-
(code, name) = [x.strip() for x in line.split(',')[1:3]]
|
|
471
|
-
res_dict[code] = int(name)
|
|
472
|
-
if(symbol=="all"):
|
|
473
|
-
return res_dict
|
|
474
|
-
if(symbol!=""):
|
|
475
|
-
return res_dict[symbol.upper()]
|
|
476
|
-
|
|
477
|
-
if(mode=="pandas"):
|
|
478
|
-
payload = pd.read_csv(url)
|
|
479
|
-
if(symbol=="all"):
|
|
480
|
-
return payload
|
|
481
|
-
else:
|
|
482
|
-
payload = payload[(payload.iloc[:, 1] == symbol.upper())]
|
|
483
|
-
return payload
|
|
484
|
-
|
|
485
|
-
def whoistheboss():
|
|
486
|
-
return "subhash"
|
|
487
|
-
|
|
488
|
-
def indiavix():
|
|
489
|
-
payload = nsefetch("https://www.nseindia.com/api/allIndices")
|
|
490
|
-
for x in range(0, len(payload["data"])):
|
|
491
|
-
if(payload["data"][x]["index"]=="INDIA VIX"):
|
|
492
|
-
return payload["data"][x]["last"]
|
|
493
|
-
|
|
494
|
-
def index_info(index):
|
|
495
|
-
payload = nsefetch("https://www.nseindia.com/api/allIndices")
|
|
496
|
-
for x in range(0, len(payload["data"])):
|
|
497
|
-
if(payload["data"][x]["index"]==index):
|
|
498
|
-
return payload["data"][x]
|
|
499
|
-
|
|
500
|
-
import math
|
|
501
|
-
from scipy.stats import norm
|
|
502
|
-
|
|
503
|
-
def black_scholes_dexter(S0,X,t,σ="",r=10,q=0.0,td=365):
|
|
504
|
-
|
|
505
|
-
if(σ==""):σ =indiavix()
|
|
506
|
-
|
|
507
|
-
S0,X,σ,r,q,t = float(S0),float(X),float(σ/100),float(r/100),float(q/100),float(t/td)
|
|
508
|
-
#https://unofficed.com/black-scholes-model-options-calculator-google-sheet/
|
|
509
|
-
|
|
510
|
-
d1 = (math.log(S0/X)+(r-q+0.5*σ**2)*t)/(σ*math.sqrt(t))
|
|
511
|
-
#stackoverflow.com/questions/34258537/python-typeerror-unsupported-operand-types-for-float-and-int
|
|
512
|
-
|
|
513
|
-
#stackoverflow.com/questions/809362/how-to-calculate-cumulative-normal-distribution
|
|
514
|
-
Nd1 = (math.exp((-d1**2)/2))/math.sqrt(2*math.pi)
|
|
515
|
-
d2 = d1-σ*math.sqrt(t)
|
|
516
|
-
Nd2 = norm.cdf(d2)
|
|
517
|
-
call_theta =(-((S0*σ*math.exp(-q*t))/(2*math.sqrt(t))*(1/(math.sqrt(2*math.pi)))*math.exp(-(d1*d1)/2))-(r*X*math.exp(-r*t)*norm.cdf(d2))+(q*math.exp(-q*t)*S0*norm.cdf(d1)))/td
|
|
518
|
-
put_theta =(-((S0*σ*math.exp(-q*t))/(2*math.sqrt(t))*(1/(math.sqrt(2*math.pi)))*math.exp(-(d1*d1)/2))+(r*X*math.exp(-r*t)*norm.cdf(-d2))-(q*math.exp(-q*t)*S0*norm.cdf(-d1)))/td
|
|
519
|
-
call_premium =math.exp(-q*t)*S0*norm.cdf(d1)-X*math.exp(-r*t)*norm.cdf(d1-σ*math.sqrt(t))
|
|
520
|
-
put_premium =X*math.exp(-r*t)*norm.cdf(-d2)-math.exp(-q*t)*S0*norm.cdf(-d1)
|
|
521
|
-
call_delta =math.exp(-q*t)*norm.cdf(d1)
|
|
522
|
-
put_delta =math.exp(-q*t)*(norm.cdf(d1)-1)
|
|
523
|
-
gamma =(math.exp(-r*t)/(S0*σ*math.sqrt(t)))*(1/(math.sqrt(2*math.pi)))*math.exp(-(d1*d1)/2)
|
|
524
|
-
vega = ((1/100)*S0*math.exp(-r*t)*math.sqrt(t))*(1/(math.sqrt(2*math.pi))*math.exp(-(d1*d1)/2))
|
|
525
|
-
call_rho =(1/100)*X*t*math.exp(-r*t)*norm.cdf(d2)
|
|
526
|
-
put_rho =(-1/100)*X*t*math.exp(-r*t)*norm.cdf(-d2)
|
|
527
|
-
|
|
528
|
-
return call_theta,put_theta,call_premium,put_premium,call_delta,put_delta,gamma,vega,call_rho,put_rho
|
|
529
|
-
|
|
530
|
-
def equity_history_virgin(symbol,series,start_date,end_date):
|
|
531
|
-
#url="https://www.nseindia.com/api/historical/cm/equity?symbol="+symbol+"&series=[%22"+series+"%22]&from="+str(start_date)+"&to="+str(end_date)+""
|
|
532
|
-
url = 'https://www.nseindia.com/api/historical/cm/equity?symbol=' + symbol + '&series=["' + series + '"]&from=' + start_date + '&to=' + end_date
|
|
533
|
-
|
|
534
|
-
payload = nsefetch(url)
|
|
535
|
-
return pd.DataFrame.from_records(payload["data"])
|
|
536
|
-
|
|
537
|
-
# You shall see beautiful use the logger function.
|
|
538
|
-
def equity_history(symbol,series,start_date,end_date):
|
|
539
|
-
#We are getting the input in text. So it is being converted to Datetime object from String.
|
|
540
|
-
start_date = datetime.datetime.strptime(start_date, "%d-%m-%Y")
|
|
541
|
-
end_date = datetime.datetime.strptime(end_date, "%d-%m-%Y")
|
|
542
|
-
logging.info("Starting Date: "+str(start_date))
|
|
543
|
-
logging.info("Ending Date: "+str(end_date))
|
|
544
|
-
|
|
545
|
-
#We are calculating the difference between the days
|
|
546
|
-
diff = end_date-start_date
|
|
547
|
-
logging.info("Total Number of Days: "+str(diff.days))
|
|
548
|
-
logging.info("Total FOR Loops in the program: "+str(int(diff.days/40)))
|
|
549
|
-
logging.info("Remainder Loop: " + str(diff.days-(int(diff.days/40)*40)))
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
total=pd.DataFrame()
|
|
553
|
-
for i in range (0,int(diff.days/40)):
|
|
554
|
-
|
|
555
|
-
temp_date = (start_date+datetime.timedelta(days=(40))).strftime("%d-%m-%Y")
|
|
556
|
-
start_date = datetime.datetime.strftime(start_date, "%d-%m-%Y")
|
|
557
|
-
|
|
558
|
-
logging.info("Loop = "+str(i))
|
|
559
|
-
logging.info("====")
|
|
560
|
-
logging.info("Starting Date: "+str(start_date))
|
|
561
|
-
logging.info("Ending Date: "+str(temp_date))
|
|
562
|
-
logging.info("====")
|
|
563
|
-
|
|
564
|
-
#total=total.append(equity_history_virgin(symbol,series,start_date,temp_date))
|
|
565
|
-
#total=total.concat(equity_history_virgin(symbol,series,start_date,temp_date))
|
|
566
|
-
total = pd.concat([total, equity_history_virgin(symbol, series, start_date, temp_date)])
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
logging.info("Length of the Table: "+ str(len(total)))
|
|
570
|
-
|
|
571
|
-
#Preparation for the next loop
|
|
572
|
-
start_date = datetime.datetime.strptime(temp_date, "%d-%m-%Y")
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
start_date = datetime.datetime.strftime(start_date, "%d-%m-%Y")
|
|
576
|
-
end_date = datetime.datetime.strftime(end_date, "%d-%m-%Y")
|
|
577
|
-
|
|
578
|
-
logging.info("End Loop")
|
|
579
|
-
logging.info("====")
|
|
580
|
-
logging.info("Starting Date: "+str(start_date))
|
|
581
|
-
logging.info("Ending Date: "+str(end_date))
|
|
582
|
-
logging.info("====")
|
|
583
|
-
|
|
584
|
-
#total=total.append(equity_history_virgin(symbol,series,start_date,end_date))
|
|
585
|
-
#total=total.concat(equity_history_virgin(symbol,series,start_date,end_date))
|
|
586
|
-
total = pd.concat([total, equity_history_virgin(symbol, series, start_date, end_date)])
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
logging.info("Finale")
|
|
590
|
-
logging.info("Length of the Total Dataset: "+ str(len(total)))
|
|
591
|
-
payload = total.iloc[::-1].reset_index(drop=True)
|
|
592
|
-
return payload
|
|
593
|
-
|
|
594
|
-
def derivative_history_virgin(symbol,start_date,end_date,instrumentType,expiry_date,strikePrice="",optionType=""):
|
|
595
|
-
|
|
596
|
-
instrumentType = instrumentType.lower()
|
|
597
|
-
|
|
598
|
-
if(instrumentType=="options"):
|
|
599
|
-
if("NIFTY" in symbol): instrumentType="FUTSTK"
|
|
600
|
-
instrumentType="OPTSTK"
|
|
601
|
-
if(instrumentType=="futures"):
|
|
602
|
-
if("NIFTY" in symbol): instrumentType="OPTIDX"
|
|
603
|
-
instrumentType="FUTIDX"
|
|
604
|
-
|
|
605
|
-
if(((instrumentType=="OPTIDX")or (instrumentType=="OPTSTK")) and (expiry_date!="")):
|
|
606
|
-
strikePrice = "%.2f" % strikePrice
|
|
607
|
-
strikePrice = str(strikePrice)
|
|
608
|
-
|
|
609
|
-
nsefetch_url = "https://www.nseindia.com/api/historical/fo/derivatives?&from="+str(start_date)+"&to="+str(end_date)+"&optionType="+optionType+"&strikePrice="+strikePrice+"&expiryDate="+expiry_date+"&instrumentType="+instrumentType+"&symbol="+symbol+""
|
|
610
|
-
payload = nsefetch(nsefetch_url)
|
|
611
|
-
logging.info(nsefetch_url)
|
|
612
|
-
logging.info(payload)
|
|
613
|
-
return pd.DataFrame.from_records(payload["data"])
|
|
614
|
-
|
|
615
|
-
def derivative_history(symbol,start_date,end_date,instrumentType,expiry_date,strikePrice="",optionType=""):
|
|
616
|
-
#We are getting the input in text. So it is being converted to Datetime object from String.
|
|
617
|
-
start_date = datetime.datetime.strptime(start_date, "%d-%m-%Y")
|
|
618
|
-
end_date = datetime.datetime.strptime(end_date, "%d-%m-%Y")
|
|
619
|
-
logging.info("Starting Date: "+str(start_date))
|
|
620
|
-
logging.info("Ending Date: "+str(end_date))
|
|
621
|
-
|
|
622
|
-
#We are calculating the difference between the days
|
|
623
|
-
diff = end_date-start_date
|
|
624
|
-
logging.info("Total Number of Days: "+str(diff.days))
|
|
625
|
-
logging.info("Total FOR Loops in the program: "+str(int(diff.days/40)))
|
|
626
|
-
logging.info("Remainder Loop: " + str(diff.days-(int(diff.days/40)*40)))
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
total=pd.DataFrame()
|
|
630
|
-
for i in range (0,int(diff.days/40)):
|
|
631
|
-
|
|
632
|
-
temp_date = (start_date+datetime.timedelta(days=(40))).strftime("%d-%m-%Y")
|
|
633
|
-
start_date = datetime.datetime.strftime(start_date, "%d-%m-%Y")
|
|
634
|
-
|
|
635
|
-
logging.info("Loop = "+str(i))
|
|
636
|
-
logging.info("====")
|
|
637
|
-
logging.info("Starting Date: "+str(start_date))
|
|
638
|
-
logging.info("Ending Date: "+str(temp_date))
|
|
639
|
-
logging.info("====")
|
|
640
|
-
|
|
641
|
-
#total=total.append(derivative_history_virgin(symbol,start_date,temp_date,instrumentType,expiry_date,strikePrice,optionType))
|
|
642
|
-
#total=total.concat([total, derivative_history_virgin(symbol,start_date,temp_date,instrumentType,expiry_date,strikePrice,optionType)])
|
|
643
|
-
total = pd.concat([total, derivative_history_virgin(symbol, start_date, temp_date, instrumentType, expiry_date, strikePrice, optionType)])
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
logging.info("Length of the Table: "+ str(len(total)))
|
|
647
|
-
|
|
648
|
-
#Preparation for the next loop
|
|
649
|
-
start_date = datetime.datetime.strptime(temp_date, "%d-%m-%Y")
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
start_date = datetime.datetime.strftime(start_date, "%d-%m-%Y")
|
|
653
|
-
end_date = datetime.datetime.strftime(end_date, "%d-%m-%Y")
|
|
654
|
-
|
|
655
|
-
logging.info("End Loop")
|
|
656
|
-
logging.info("====")
|
|
657
|
-
logging.info("Starting Date: "+str(start_date))
|
|
658
|
-
logging.info("Ending Date: "+str(end_date))
|
|
659
|
-
logging.info("====")
|
|
660
|
-
|
|
661
|
-
#total=total.append(derivative_history_virgin(symbol,start_date,end_date,instrumentType,expiry_date,strikePrice,optionType))
|
|
662
|
-
#total = total.concat([total, derivative_history_virgin(symbol,start_date,end_date,instrumentType,expiry_date,strikePrice,optionType)])
|
|
663
|
-
total = pd.concat([total, derivative_history_virgin(symbol, start_date, end_date, instrumentType, expiry_date, strikePrice, optionType)])
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
logging.info("Finale")
|
|
668
|
-
logging.info("Length of the Total Dataset: "+ str(len(total)))
|
|
669
|
-
payload = total.iloc[::-1].reset_index(drop=True)
|
|
670
|
-
return payload
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
def expiry_history(symbol,start_date="",end_date=""):
|
|
674
|
-
if(end_date==""):end_date=end_date
|
|
675
|
-
nsefetch_url = "https://www.nseindia.com/api/historical/fo/derivatives/meta?&from="+start_date+"&to="+end_date+"&symbol="+symbol+""
|
|
676
|
-
payload = nsefetch(nsefetch_url)
|
|
677
|
-
return payload['data'][2]
|
|
678
|
-
|
|
679
|
-
# # Nifty Indicies Site
|
|
680
|
-
|
|
681
|
-
niftyindices_headers = {
|
|
682
|
-
'Connection': 'keep-alive',
|
|
683
|
-
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
|
|
684
|
-
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
|
685
|
-
'DNT': '1',
|
|
686
|
-
'X-Requested-With': 'XMLHttpRequest',
|
|
687
|
-
'sec-ch-ua-mobile': '?0',
|
|
688
|
-
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
|
|
689
|
-
'Content-Type': 'application/json; charset=UTF-8',
|
|
690
|
-
'Origin': 'https://niftyindices.com',
|
|
691
|
-
'Sec-Fetch-Site': 'same-origin',
|
|
692
|
-
'Sec-Fetch-Mode': 'cors',
|
|
693
|
-
'Sec-Fetch-Dest': 'empty',
|
|
694
|
-
'Referer': 'https://niftyindices.com/reports/historical-data',
|
|
695
|
-
'Accept-Language': 'en-US,en;q=0.9,hi;q=0.8',
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
def index_history(symbol,start_date,end_date):
|
|
699
|
-
data = "{'name':'"+symbol+"','startDate':'"+start_date+"','endDate':'"+end_date+"'}"
|
|
700
|
-
payload = requests.post('https://niftyindices.com/Backpage.aspx/getHistoricaldatatabletoString', headers=niftyindices_headers, data=data).json()
|
|
701
|
-
payload = json.loads(payload["d"])
|
|
702
|
-
payload=pd.DataFrame.from_records(payload)
|
|
703
|
-
return payload
|
|
704
|
-
|
|
705
|
-
def index_pe_pb_div(symbol,start_date,end_date):
|
|
706
|
-
data = "{'name':'"+symbol+"','startDate':'"+start_date+"','endDate':'"+end_date+"'}"
|
|
707
|
-
payload = requests.post('https://niftyindices.com/Backpage.aspx/getpepbHistoricaldataDBtoString', headers=niftyindices_headers, data=data).json()
|
|
708
|
-
payload = json.loads(payload["d"])
|
|
709
|
-
payload=pd.DataFrame.from_records(payload)
|
|
710
|
-
return payload
|
|
711
|
-
|
|
712
|
-
def index_total_returns(symbol,start_date,end_date):
|
|
713
|
-
data = "{'name':'"+symbol+"','startDate':'"+start_date+"','endDate':'"+end_date+"'}"
|
|
714
|
-
payload = requests.post('https://niftyindices.com/Backpage.aspx/getTotalReturnIndexString', headers=niftyindices_headers, data=data).json()
|
|
715
|
-
payload = json.loads(payload["d"])
|
|
716
|
-
payload=pd.DataFrame.from_records(payload)
|
|
717
|
-
return payload
|
|
718
|
-
|
|
719
|
-
def get_bhavcopy(date):
|
|
720
|
-
date = date.replace("-","")
|
|
721
|
-
payload=pd.read_csv("https://archives.nseindia.com/products/content/sec_bhavdata_full_"+date+".csv")
|
|
722
|
-
return payload
|
|
723
|
-
|
|
724
|
-
def get_bulkdeals():
|
|
725
|
-
payload=pd.read_csv("https://archives.nseindia.com/content/equities/bulk.csv")
|
|
726
|
-
return payload
|
|
727
|
-
|
|
728
|
-
def get_blockdeals():
|
|
729
|
-
payload=pd.read_csv("https://archives.nseindia.com/content/equities/block.csv")
|
|
730
|
-
return payload
|
|
731
|
-
|
|
732
|
-
#Request from subhash
|
|
733
|
-
## https://unofficed.com/how-to-find-the-beta-of-indian-stocks-using-python/
|
|
734
|
-
def get_beta_df_maker(symbol,days):
|
|
735
|
-
if("NIFTY" in symbol):
|
|
736
|
-
end_date = datetime.datetime.now().strftime("%d-%b-%Y")
|
|
737
|
-
end_date = str(end_date)
|
|
738
|
-
|
|
739
|
-
start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%b-%Y")
|
|
740
|
-
start_date = str(start_date)
|
|
741
|
-
|
|
742
|
-
df2=index_history(symbol,start_date,end_date)
|
|
743
|
-
df2["daily_change"]=df2["CLOSE"].astype(float).pct_change()
|
|
744
|
-
df2=df2[['HistoricalDate','daily_change']]
|
|
745
|
-
df2 = df2.iloc[1: , :]
|
|
746
|
-
return df2
|
|
747
|
-
else:
|
|
748
|
-
end_date = datetime.datetime.now().strftime("%d-%m-%Y")
|
|
749
|
-
end_date = str(end_date)
|
|
750
|
-
|
|
751
|
-
start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%m-%Y")
|
|
752
|
-
start_date = str(start_date)
|
|
753
|
-
|
|
754
|
-
df = equity_history(symbol,"EQ",start_date,end_date)
|
|
755
|
-
|
|
756
|
-
df["daily_change"]=df["CH_CLOSING_PRICE"].pct_change()
|
|
757
|
-
df=df[['CH_TIMESTAMP','daily_change']]
|
|
758
|
-
df = df.iloc[1: , :] #thispointer.com/drop-first-row-of-pandas-dataframe-3-ways/
|
|
759
|
-
return df
|
|
760
|
-
|
|
761
|
-
def getbeta(symbol,days=365,symbol2="NIFTY 50"):
|
|
762
|
-
return get_beta(symbol,days,symbol2)
|
|
763
|
-
|
|
764
|
-
def get_beta(symbol,days=365,symbol2="NIFTY 50"):
|
|
765
|
-
#Default is 248 days. (Input of Subhash)
|
|
766
|
-
df = get_beta_df_maker(symbol,days)
|
|
767
|
-
df2 = get_beta_df_maker(symbol2,days)
|
|
768
|
-
|
|
769
|
-
x=df["daily_change"].tolist()
|
|
770
|
-
y=df2["daily_change"].tolist()
|
|
771
|
-
#stackoverflow.com/questions/42670055/is-there-any-better-way-to-calculate-the-covariance-of-two-lists-than-this
|
|
772
|
-
mean_x = sum(x) / len(x)
|
|
773
|
-
mean_y = sum(y) / len(y)
|
|
774
|
-
covariance = sum((a - mean_x) * (b - mean_y) for (a,b) in zip(x,y)) / len(x)
|
|
775
|
-
|
|
776
|
-
mean = sum(y) / len(y)
|
|
777
|
-
variance = sum((i - mean) ** 2 for i in y) / len(y)
|
|
778
|
-
|
|
779
|
-
beta = covariance/variance
|
|
780
|
-
return round(beta,3)
|
|
781
|
-
|
|
782
|
-
def nse_preopen(key="NIFTY",type="pandas"):
|
|
783
|
-
payload = nsefetch("https://www.nseindia.com/api/market-data-pre-open?key="+key+"")
|
|
784
|
-
if(type=="pandas"):
|
|
785
|
-
payload = pd.DataFrame(payload['data'])
|
|
786
|
-
payload = pd.json_normalize(payload['metadata'])
|
|
787
|
-
return payload
|
|
788
|
-
else:
|
|
789
|
-
return payload
|
|
790
|
-
|
|
791
|
-
#By Avinash https://forum.unofficed.com/t/nsepython-documentation/376/102?u=dexter
|
|
792
|
-
def nse_preopen_movers(key="FO",filter=1.5):
|
|
793
|
-
preOpen_gainer=nse_preopen(key)
|
|
794
|
-
return preOpen_gainer[preOpen_gainer['pChange'] >1.5],preOpen_gainer[preOpen_gainer['pChange'] <-1.5]
|
|
795
|
-
|
|
796
|
-
# type = "securities"
|
|
797
|
-
# type = "etf"
|
|
798
|
-
# type = "sme"
|
|
799
|
-
#
|
|
800
|
-
# sort = "volume"
|
|
801
|
-
# sort = "value"
|
|
802
|
-
|
|
803
|
-
def nse_most_active(type="securities",sort="value"):
|
|
804
|
-
payload = nsefetch("https://www.nseindia.com/api/live-analysis-most-active-"+type+"?index="+sort+"")
|
|
805
|
-
payload = pd.DataFrame(payload["data"])
|
|
806
|
-
return payload
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
def nse_eq_symbols():
|
|
810
|
-
#https://forum.unofficed.com/t/feature-request-stocklist-api/1073/11
|
|
811
|
-
eq_list_pd = pd.read_csv('https://archives.nseindia.com/content/equities/EQUITY_L.csv')
|
|
812
|
-
return eq_list_pd['SYMBOL'].tolist()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|