Skip to content

Instantly share code, notes, and snippets.

@Varad2305
Created January 20, 2022 17:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Varad2305/41f3064c58e55d859bb079f92a93503f to your computer and use it in GitHub Desktop.
Save Varad2305/41f3064c58e55d859bb079f92a93503f to your computer and use it in GitHub Desktop.
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