-
Notifications
You must be signed in to change notification settings - Fork 0
/
weekdayreturns.py
151 lines (120 loc) · 5.42 KB
/
weekdayreturns.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# -*- coding: utf-8 -*-
"""
This program checks which day of the week is most profitable in order to do
weekly SIP.
Works for NSE only
It assumes we buy 1 stock or 1 Index on close of the day everyday.
We fetch data from 1/1/2000 using nsepy. Am not sure whether the stock data we
receive is adjusted for splits and bonuses.
@author: arkamath
"""
# Import section
import pandas as pd
from datetime import date, timedelta
from nsepy import get_history
#import sys
import matplotlib.pyplot as plt
def draw_graph(df_returns):
#Drop Saturday and Sunday trades value(Probably Mahurat trading)
df_returns.drop(df_returns.index[5],inplace=True)
df_returns.drop(df_returns.index[5],inplace=True)
df_returns.reset_index(drop=True, inplace=True)
df_returns.set_index('Weekday', inplace=True)
#Normalise values
df_returns = (df_returns - df_returns.mean())/df_returns.std()
ax = df_returns[['Units Purchased']].plot(kind='bar',
title ="Units purchased",
figsize=(15, 10), legend=True, fontsize=12,color='#C0FF44')
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Quantity/No of trades", fontsize=12)
plt.show()
ax = df_returns[['Total Investment']].plot(kind='bar',
title ='Total Investment',
figsize=(15, 10), legend=True, fontsize=12,color='#FF4455')
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Total investment till date", fontsize=12)
plt.show()
ax = df_returns[['Profit Today']].plot(kind='bar',
title ="Profit Today",
figsize=(15, 10), legend=True, fontsize=12,color='#C0FF44')
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Profit as of today", fontsize=12)
plt.show()
ax = df_returns[['Profit %']].plot(kind='bar',
title ="Profit %",
figsize=(15, 10), legend=True, fontsize=12,color='#AA44FF')
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Profit % as of today", fontsize=12)
plt.show()
ax = df_returns[['Cost per Unit']].plot(kind='bar',
title ="Cost per Unit",
figsize=(15, 10), legend=True, fontsize=12,color='#FF44A1')
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Per unit cost", fontsize=12)
plt.show()
ax = df_returns[['Profit per Unit']].plot(kind='bar',
title ="Profit per Unit",
figsize=(15, 10), legend=True, fontsize=12)
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Per unit profit", fontsize=12)
plt.show()
def calculate_returns(df_returns,symbol):
df_returns = get_data(symbol.upper())
df_aggregate = pd.DataFrame()
df_aggregate = df_returns.groupby('Wday').count()
df_aggregate.rename(columns={'Close':'Units Purchased'},inplace=True)
df_aggregate['Total Investment'] = df_returns.groupby('Wday').sum()
current_value = df_returns.Close.iat[-1]
df_aggregate['Profit Today'] = (df_aggregate['Units Purchased'] * \
current_value) - df_aggregate['Total Investment']
df_aggregate['Profit %'] = ((df_aggregate['Profit Today'] )\
/ df_aggregate['Total Investment'] )*100
df_aggregate['Cost per Unit'] = df_aggregate['Total Investment']/ \
df_aggregate['Units Purchased']
df_aggregate['Profit per Unit'] = df_aggregate['Profit Today']/ \
df_aggregate['Units Purchased']
days = {0:'Mon',1:'Tue',2:'Wed',3:'Thur',4:'Fri',5:'Sat',6:'Sun'}
df_aggregate.reset_index(drop=False, inplace=True)
df_aggregate['Weekday'] = df_aggregate['Wday'].apply(lambda x: days[x])
df_aggregate.set_index('Wday', inplace=True)
return df_aggregate
def get_data(symbol):
df_data = pd.DataFrame()
if "NIFTY" not in symbol and "ETF" not in symbol:
index_bool = False
else:
index_bool = True
historic_data = get_history(symbol=symbol,
start=date(2000,1,1),
end=date.today(),
index=index_bool)
if historic_data.empty:
print("Data not fetched from NSE. Try after some time")
exit(2)
df_data = historic_data[:].copy()
df_data.reset_index(drop=False, inplace=True)
df_data['Date']= pd.to_datetime(df_data['Date'])
df_data.set_index('Date', inplace=True)
df_data['Wday'] = df_data.index.weekday
df_data.reset_index(drop=False, inplace=True)
df_data = df_data.drop(columns = ['Date','Open', 'High','Low', 'Volume',
'Turnover'])
if index_bool == False:
df_data = df_data.drop(columns = ['Symbol','Series', 'Prev Close',
'Last', 'VWAP','Trades',
'%Deliverble',
'Deliverable Volume',
])
return df_data
def main():
# if len(sys.argv) < 2:
# print ("execute in cmd like 'python weedayreturns.py NIFTY'")
# exit(1)
# symbol = sys.argv[1]
# symbol = 'NIFTY'
symbol = input('Enter the SYMBOL in NSE format ')
df_returns = pd.DataFrame()
df_returns = calculate_returns(df_returns,symbol)
draw_graph(df_returns)
if __name__ == '__main__':
main()