kollis commited on
Commit
77fd868
·
1 Parent(s): 954fe06

Create function.py

Browse files
Files changed (1) hide show
  1. function.py +181 -0
function.py ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import yfinance as yf
4
+ from datetime import timedelta,datetime
5
+ import pytz
6
+ import matplotlib.pyplot as plt
7
+ from PIL import Image
8
+ import numpy as np
9
+ from IPython.display import display
10
+
11
+
12
+
13
+ def dateoffset(input_date_str):
14
+
15
+ input_date_dt = datetime.strptime(input_date_str, "%Y-%m-%d")
16
+
17
+
18
+ new_date_dt = input_date_dt - timedelta(days=1)
19
+
20
+
21
+ new_date_str = new_date_dt.strftime("%Y-%m-%d")
22
+
23
+ return new_date_str
24
+
25
+
26
+ def setdates(startdate, enddate):
27
+ while startdate not in nifty50["nifty50"].data.index:
28
+ startdate = dateoffset(startdate)
29
+
30
+ while enddate not in nifty50["nifty50"].data.index:
31
+ enddate = dateoffset(enddate)
32
+
33
+ return startdate, enddate
34
+
35
+
36
+ def organisedata(startdate, enddate):
37
+
38
+ startdate, enddate = setdates(startdate, enddate)
39
+
40
+
41
+ symbols = list(nifty_stocks.keys())
42
+
43
+
44
+ common_index = nifty50["nifty50"].data.loc[startdate:enddate].index
45
+
46
+
47
+ data_frame = pd.DataFrame(index=symbols, columns=common_index)
48
+
49
+
50
+ for symbol, stock_object in nifty_stocks.items():
51
+ stock_data = stock_object.data.loc[startdate:enddate, 'Close']
52
+ data_frame.loc[symbol] = stock_data.reindex(common_index).values
53
+
54
+ return data_frame
55
+
56
+ def previoustimeframedata(n, startdate):
57
+
58
+ startdate_dt = pd.to_datetime(startdate)
59
+
60
+
61
+ ndaysagodate = startdate_dt - timedelta(days=int(n))
62
+
63
+
64
+ ndaysagodate_str = ndaysagodate.strftime("%Y-%m-%d")
65
+ startdate_str = startdate_dt.strftime("%Y-%m-%d")
66
+
67
+
68
+ return organisedata(ndaysagodate_str, startdate_str)
69
+
70
+ def portfoliooperations(equity,startdate,ndaywindow,portfolio):
71
+
72
+ startdate_dt = pd.to_datetime(startdate)
73
+ windowenddate = startdate_dt + timedelta(days=int(ndaywindow))
74
+ windowenddate_str = windowenddate.strftime("%Y-%m-%d")
75
+
76
+ startdate,windowenddate = setdates(startdate,windowenddate_str)
77
+
78
+ window_data = organisedata(startdate,windowenddate)
79
+
80
+ differences = window_data.iloc[:, -1] - window_data.iloc[:, 0]
81
+
82
+ next_portfolio = differences[differences > 0].index.tolist()
83
+
84
+
85
+ portfolio_sum = window_data.loc[portfolio, window_data.columns[0]].sum()
86
+
87
+
88
+ multiplier = equity / portfolio_sum if portfolio_sum != 0 else 0
89
+
90
+
91
+ portfolio_value = pd.DataFrame(index=window_data.columns, columns=['value'])
92
+
93
+ for date in window_data.columns:
94
+
95
+ portfolio_sum = window_data.loc[portfolio, date].sum()
96
+
97
+ portfolio_value.loc[date, 'value'] = portfolio_sum * multiplier
98
+
99
+
100
+ return next_portfolio,portfolio_value
101
+
102
+ def mainfunction (equity,startdate,enddate,ndaywindow):
103
+
104
+ pastwindow = previoustimeframedata(n=ndaywindow,startdate=startdate) # No Errors untill here
105
+
106
+ differences = pastwindow.iloc[:, -1] - pastwindow.iloc[:, 0]
107
+
108
+ portfolio = differences[differences > 0].index.tolist() # No Errors untill here
109
+
110
+ portfolio,portfolio_value = portfoliooperations(equity=equity,startdate=startdate,ndaywindow=ndaywindow,portfolio=portfolio)
111
+
112
+
113
+
114
+ enddate_tz = datetime.strptime(enddate,"%Y-%m-%d").replace(tzinfo=pytz.timezone('Asia/Kolkata'))
115
+
116
+ while portfolio_value.index[-1] < pd.to_datetime(enddate_tz) - timedelta(days=int(ndaywindow)):
117
+
118
+ portfolio,new_portfolio_value = portfoliooperations(equity=equity,startdate=startdate,ndaywindow=ndaywindow,portfolio=portfolio)
119
+
120
+ portfolio_value = pd.concat([portfolio_value, new_portfolio_value])
121
+
122
+ startdate = (pd.to_datetime(startdate)+ timedelta(days=int(ndaywindow))).strftime("%Y-%m-%d")
123
+
124
+ equity = portfolio_value.iloc[-1, 0]
125
+
126
+ return portfolio_value
127
+
128
+ def calculate_cagr(series):
129
+ total_return = (series.iloc[-1] / series.iloc[0]) - 1
130
+ num_years = len(series) / 252
131
+ cagr = (1 + total_return) ** (1 / num_years) - 1
132
+ return cagr * 100
133
+
134
+
135
+ def calculate_volatility(series):
136
+ return series.pct_change().std() * np.sqrt(252) * 100
137
+
138
+
139
+ def calculate_sharpe_ratio(series, risk_free_rate=0):
140
+ cagr = calculate_cagr(series)
141
+ volatility = calculate_volatility(series)
142
+ sharpe_ratio = (cagr - risk_free_rate) / volatility
143
+ return sharpe_ratio
144
+
145
+
146
+ def final_function(equity,startdate,enddate,ndaywindow):
147
+
148
+ equity = int(equity)
149
+ ndaywindow = int(ndaywindow)
150
+
151
+ portfolio_value = mainfunction(equity=equity,startdate=startdate,enddate=enddate,ndaywindow=ndaywindow)
152
+ nifty_data = nifty50["nifty50"].data
153
+ subset_data = nifty_data[startdate:enddate]
154
+ initial_nifty = subset_data['Close'][0]
155
+ nifty_dataseries = (equity/initial_nifty)*subset_data['Close']
156
+ plt.figure(figsize=(10, 6))
157
+ plt.plot(portfolio_value['value'], label='Strategy')
158
+ plt.plot(nifty_dataseries, label='Nifty50 as Benchmark')
159
+ plt.title('Benchmark vs Strategy')
160
+ plt.xlabel('Date')
161
+ plt.ylabel('Close Price')
162
+ plt.legend()
163
+
164
+
165
+ image_path = "output_plot.png"
166
+ plt.savefig(image_path)
167
+ plt.close()
168
+
169
+
170
+ image = Image.open(image_path)
171
+
172
+ strategy_cagr = calculate_cagr(portfolio_value['value'])
173
+ strategy_volatility = calculate_volatility(portfolio_value['value'])
174
+ strategy_sharpe_ratio = calculate_sharpe_ratio(portfolio_value['value'])
175
+
176
+ benchmark_cagr = calculate_cagr(nifty_dataseries)
177
+ benchmark_volatility = calculate_volatility(nifty_dataseries)
178
+ benchmark_sharpe_ratio = calculate_sharpe_ratio(nifty_dataseries)
179
+
180
+
181
+ return image, strategy_cagr, strategy_volatility, strategy_sharpe_ratio, benchmark_cagr, benchmark_volatility, benchmark_sharpe_ratio