Created
January 20, 2022 17:28
-
-
Save Varad2305/41f3064c58e55d859bb079f92a93503f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
import numpy as np | |
from datetime import date,time,timedelta | |
from nsepy import get_history | |
import copy | |
import requests | |
import datetime | |
#@st.cache() | |
def fetchInsiderData(lookback_period): | |
today = datetime.datetime.now().date() | |
lookback = datetime.datetime.now().date() - datetime.timedelta(days=lookback_period) | |
today = today.strftime("%d-%m-%Y") | |
lookback = lookback.strftime("%d-%m-%Y") | |
headers = { | |
'User-Agent': 'Apache/2.4.34 (Ubuntu) OpenSSL/1.1.1 (internal dummy connection)', | |
'Accept': '*/*', | |
'Accept-Language': 'en-US,en;q=0.5', | |
'DNT': '1', | |
'Connection': 'keep-alive', | |
'Referer': 'https://www.nseindia.com/companies-listing/corporate-filings-insider-trading', | |
} | |
params = ( | |
('index', 'equities'), | |
('from_date', lookback), | |
('to_date', today), | |
) | |
# If response recieved | |
while True: | |
print("Sending request") | |
s = requests.Session() | |
r = s.get('https://www.nseindia.com/companies-listing/corporate-filings-insider-trading', | |
headers=headers, | |
params=params) | |
r = s.get('https://www.nseindia.com/api/corporates-pit', | |
headers=headers, | |
params=params, | |
cookies=s.cookies.get_dict()) | |
print("response received") | |
if r.status_code == 200: | |
data_dict = r.json() | |
keys = list(data_dict.keys()) | |
df = pd.DataFrame(data_dict[keys[1]]) | |
print("Data fetched") | |
break | |
else: | |
print("Insider Trading Data Denied") | |
continue | |
df = df[["symbol","company", "anex", "acqName", "personCategory", "secType", "befAcqSharesNo", | |
"befAcqSharesPer", "tkdAcqm", "secAcq", "secVal","tdpTransactionType", "securitiesTypePost", | |
"afterAcqSharesNo" , "afterAcqSharesPer", "acqfromDt", "acqtoDt", "intimDt", "acqMode", | |
"derivativeType", "tdpDerivativeContractType", "buyValue", "buyQuantity", | |
"sellValue", "sellquantity", "exchange", "remarks", "date", "xbrl"]] | |
df.columns = ['SYMBOL', 'COMPANY', 'REGULATION', 'NAME OF THE ACQUIRER/DISPOSER', | |
'CATEGORY OF PERSON', 'TYPE OF SECURITY (PRIOR)', | |
'NO. OF SECURITY (PRIOR)', '% SHAREHOLDING (PRIOR)', | |
'TYPE OF SECURITY (ACQUIRED/DISPLOSED)', | |
'NO. OF SECURITIES (ACQUIRED/DISPLOSED)', | |
'VALUE OF SECURITY (ACQUIRED/DISPLOSED)', | |
'ACQUISITION/DISPOSAL TRANSACTION TYPE', 'TYPE OF SECURITY (POST)', | |
'NO. OF SECURITY (POST)', '% POST', | |
'DATE OF ALLOTMENT/ACQUISITION FROM', | |
'DATE OF ALLOTMENT/ACQUISITION TO', 'DATE OF INITMATION TO COMPANY', | |
'MODE OF ACQUISITION', 'DERIVATIVE TYPE SECURITY', | |
'DERIVATIVE CONTRACT SPECIFICATION', 'NOTIONAL VALUE(BUY)', | |
'NUMBER OF UNITS/CONTRACT LOT SIZE (BUY)', 'NOTIONAL VALUE(SELL)', | |
'NUMBER OF UNITS/CONTRACT LOT SIZE (SELL)', 'EXCHANGE', 'REMARK', | |
'BROADCASTE DATE AND TIME', 'XBRL'] | |
# Saving to a csv file | |
# This is daily data | |
df.to_csv(r"Insider Trading {today}.csv", index=False) | |
print("Insider Data Saved!") | |
def process(lookback_input): | |
today = datetime.datetime.now().date() | |
l = datetime.datetime.now().date() - datetime.timedelta(days=lookback_input) | |
today = today.strftime("%d-%m-%Y") | |
lookback = l.strftime("%d-%m-%Y") | |
end_date = date.today().strftime("%d-%m-%Y") | |
fetchInsiderData(lookback_input) | |
print('back in process') | |
data = pd.read_csv(r"Insider Trading {today}.csv") | |
new_columns = [] | |
for col in data.columns: | |
new_columns.append(col.split(" \n")[0]) | |
data.columns = new_columns | |
data = data[data["CATEGORY OF PERSON"].isin(["Promoters", "Promoter Group"])] | |
data_last_txn = copy.deepcopy(data) | |
data_promoter_sell = data[data["MODE OF ACQUISITION"] == "Market Sale"] | |
data = data[data["MODE OF ACQUISITION"] == "Market Purchase"] | |
data = data[["SYMBOL", "VALUE OF SECURITY (ACQUIRED/DISPLOSED)", "NO. OF SECURITIES (ACQUIRED/DISPLOSED)"]] | |
data_promoter_sell = data_promoter_sell[["SYMBOL", "VALUE OF SECURITY (ACQUIRED/DISPLOSED)", "NO. OF SECURITIES (ACQUIRED/DISPLOSED)"]] | |
data_last_txn = data_last_txn[["SYMBOL", "NAME OF THE ACQUIRER/DISPOSER", "VALUE OF SECURITY (ACQUIRED/DISPLOSED)", | |
"NO. OF SECURITIES (ACQUIRED/DISPLOSED)", "MODE OF ACQUISITION", | |
"DATE OF ALLOTMENT/ACQUISITION TO"]] | |
data_last_txn = data_last_txn[data_last_txn["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"]!='-'] | |
data_last_txn = data_last_txn[data_last_txn["DATE OF ALLOTMENT/ACQUISITION TO"]!='-'] | |
data_last_txn["DATE OF ALLOTMENT/ACQUISITION TO"].iloc[0] | |
ser1 = data["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"].astype("float") | |
ser2 = data["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"].astype("float") | |
ser3 = data_promoter_sell["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"].astype("float") | |
ser4 = data_promoter_sell["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"].astype("float") | |
ser5 = data_last_txn["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"].astype("float") | |
ser6 = data_last_txn["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"].astype("float") | |
ser7 = pd.to_datetime(pd.Series(data_last_txn["DATE OF ALLOTMENT/ACQUISITION TO"]), format="%d-%b-%Y") | |
# print(data_last_txn[["SYMBOL", "DATE OF ALLOTMENT/ACQUISITION TO"]]) | |
data_last_txn_symbolwise = data_last_txn[["SYMBOL", "DATE OF ALLOTMENT/ACQUISITION TO"]].sort_values(by = ["SYMBOL", "DATE OF ALLOTMENT/ACQUISITION TO"], ascending = [True,False])#.drop_duplicates(subset=["SYMBOL"], keep='first').sort_values(by = ["DATE OF ALLOTMENT/ACQUISITION TO"], ascending = False) | |
print(data_last_txn_symbolwise) | |
data["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"] = ser1 | |
data["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"] = ser2 | |
data_promoter_sell["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"] = ser3 | |
data_promoter_sell["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"] = ser4 | |
data_last_txn["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"] = ser5 | |
data_last_txn["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"] = ser6 | |
data_last_txn["DATE OF ALLOTMENT/ACQUISITION TO"] = ser7 | |
data = data.groupby('SYMBOL')[['VALUE OF SECURITY (ACQUIRED/DISPLOSED)','NO. OF SECURITIES (ACQUIRED/DISPLOSED)']].sum().reset_index() | |
data_promoter_sell = data_promoter_sell.groupby('SYMBOL')[['VALUE OF SECURITY (ACQUIRED/DISPLOSED)','NO. OF SECURITIES (ACQUIRED/DISPLOSED)']].sum().reset_index() | |
data.sort_values(by = "VALUE OF SECURITY (ACQUIRED/DISPLOSED)", ascending=False, inplace = True) | |
data_promoter_sell.sort_values(by = "VALUE OF SECURITY (ACQUIRED/DISPLOSED)", ascending=False, inplace = True) | |
data.rename(columns = {"VALUE OF SECURITY (ACQUIRED/DISPLOSED)" : "Net Acquired Value", "NO. OF SECURITIES (ACQUIRED/DISPLOSED)": "Net Acquired Qty"}, inplace=True) | |
data_promoter_sell.rename(columns = {"VALUE OF SECURITY (ACQUIRED/DISPLOSED)" : "Net Disposed Value", "NO. OF SECURITIES (ACQUIRED/DISPLOSED)": "Net Disposed Qty"}, inplace = True) | |
merged_data = pd.merge(data,data_promoter_sell, how = "left").fillna(0) | |
merged_data["Net Value Acquired"] = merged_data["Net Acquired Value"] - merged_data["Net Disposed Value"] | |
merged_data["Net Qty Acquired"] = merged_data["Net Acquired Qty"] - merged_data["Net Disposed Qty"] | |
merged_data.sort_values(by = "Net Value Acquired", ascending = False, inplace = True) | |
merged_data["Avg buy price"] = round(merged_data["Net Value Acquired"]/merged_data["Net Qty Acquired"],2) | |
merged_data = merged_data[["SYMBOL", "Net Value Acquired","Net Qty Acquired", "Avg buy price"]] | |
merged_data = merged_data[merged_data["Net Value Acquired"] >= 10000000] | |
# ltp = [] | |
# i = 0 | |
# for sym in merged_data["SYMBOL"]: | |
# try: | |
# print('getting history for ',sym) | |
# ltp.append(get_history(sym,date.today() - timedelta(5), date.today())["Close"][-1:][0]) | |
# except: | |
# print("ERROR FOR ", sym) | |
# ltp.append(0) | |
# print(i, sym) | |
# i+=1 | |
# merged_data["LTP"] = ltp | |
# merged_data["% diff"] = round((merged_data["LTP"] - merged_data["Avg buy price"])*100/merged_data["Avg buy price"],2) | |
# merged_data = merged_data[merged_data["LTP"]!=0] | |
merged_data.sort_values(by = ["Net Value Acquired"], ascending=[True], inplace = True) | |
txns = {} | |
for i in range(len(merged_data)): | |
try: | |
sym = merged_data.iloc[i]["SYMBOL"] | |
curr_txns = data_last_txn[data_last_txn["SYMBOL"] == sym] | |
txns[sym] = curr_txns | |
txns[sym]["Avg. txn price"] = round(txns[sym]["VALUE OF SECURITY (ACQUIRED/DISPLOSED)"]/txns[sym]["NO. OF SECURITIES (ACQUIRED/DISPLOSED)"],3) | |
except: | |
print("txns error for ", merged_data.iloc[i]["SYMBOL"]) | |
# merged_data = merged_data[merged_data["% diff"] <= 5].sort_values(by = "Net Value Acquired", ascending=False) | |
print(merged_data) | |
return merged_data,txns | |
lookback = 90 | |
df,txns = process(int(lookback)) | |
print(df) | |
print(txns) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment