prasanth.thangavel commited on
Commit
2d9f266
Β·
1 Parent(s): 9a14443

Minor updates

Browse files
README.md CHANGED
@@ -76,6 +76,9 @@ asset-class-comparison/
76
  └── fd_utils.py # Fixed deposit calculation utilities
77
  ```
78
 
 
 
 
79
  ## Contributing
80
 
81
  Contributions are welcome! Please feel free to submit a Pull Request.
 
76
  └── fd_utils.py # Fixed deposit calculation utilities
77
  ```
78
 
79
+ # Ideas for future improvements
80
+ - [ ] Add credit rating of each stock
81
+
82
  ## Contributing
83
 
84
  Contributions are welcome! Please feel free to submit a Pull Request.
app.py CHANGED
@@ -11,319 +11,624 @@ from utils.currency_utils import get_usd_sgd_rate
11
  from utils.fd_utils import calculate_fd_returns
12
  from utils.hdb_utils import calculate_hdb_returns
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  print("Starting the app ...")
16
 
17
- # Sanity check on the yfinance_utils
18
- print("Sanity check on the yfinance_utils ...")
19
- # print(fetch_yfinance_daily("MSFT", "2020-01-01", "2020-01-03"))
20
- data = yf.download("MSFT", "2020-01-01", "2020-01-03")
21
- print(data.head())
22
-
23
  # Set page config
24
- st.set_page_config(page_title="Asset Class Comparison", layout="wide")
 
 
 
 
 
 
 
 
25
 
26
  # Title and description
27
  st.title("Asset Class Performance Comparison")
28
- st.write("Compare the performance of different asset classes over time")
29
- # st.write("Note: Cryptocurrencies (BTC, ETH, SOL, DOGE) are highly volatile and should be considered high-risk investments")
30
-
31
- # Sidebar for user inputs
32
- st.sidebar.header("Investment Parameters")
33
- currency = st.sidebar.selectbox("Display Currency", ["USD", "SGD"], index=0)
34
- initial_investment = st.sidebar.number_input(f"Initial Investment Amount ({currency})", min_value=1000, value=10000, step=1000)
35
- start_date = st.sidebar.date_input("Start Date", value=datetime.now() - timedelta(days=365*25))
36
- user_end_date = st.sidebar.date_input("End Date", value=datetime.now())
37
-
38
- fd_rate = st.sidebar.number_input("Fixed Deposit Rate (%)", min_value=0.0, value=2.9, step=0.1) / 100
39
- use_log_scale = st.sidebar.checkbox("Use Log Scale", value=True)
40
-
41
- # Calculate and display investment period
42
- investment_days = (user_end_date - start_date).days
43
- investment_years = investment_days / 365
44
- st.write(f"Investment Period: {investment_days} days ({investment_years:.1f} years)")
45
-
46
- # Asset selection
47
- selected_assets = st.sidebar.multiselect(
48
- "Select Assets to Compare",
49
- [
50
- "Fixed Deposit",
51
- "HDB",
52
- "Gold",
53
- "SGS Bonds",
54
- "US Treasury Bonds",
55
- "NASDAQ Composite",
56
- "NASDAQ Large Cap",
57
- "NASDAQ 100",
58
- "S&P 500",
59
- "Dow Jones",
60
- "Microsoft",
61
- "Google",
62
- "Nvidia",
63
- "Apple",
64
- "Amazon",
65
- "Tesla",
66
- "Netflix",
67
- "Meta",
68
- "Bitcoin",
69
- "Ethereum",
70
- "Solana",
71
- "Dogecoin",
72
- ],
73
- default=[
74
- "Fixed Deposit",
75
- "HDB",
76
- "Gold",
77
- "US Treasury Bonds", "SGS Bonds",
78
- "S&P 500", "Dow Jones", "NASDAQ Composite", #"NASDAQ Large Cap", "NASDAQ 100",
79
- "Microsoft", "Google", "Nvidia",
80
- "Bitcoin"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  ]
82
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- # Today's date for reference
85
- today = datetime.now().date()
86
-
87
- usd_to_sgd = get_usd_sgd_rate() if currency == "SGD" else 1.0
88
- currency_symbol = "$" if currency == "USD" else "S$"
89
-
90
- # Create a dictionary of tickers for yfinance
91
- tickers = {
92
- "Gold": "GC=F",
93
- "HDB": "A12.SI",
94
- "SGS Bonds": "A35.SI", # Nikko AM SGD Investment Grade Corporate Bond ETF
95
- "US Treasury Bonds": "TLT", # iShares 20+ Year Treasury Bond ETF
96
- "NASDAQ Composite": "^IXIC",
97
- "NASDAQ Large Cap": "^NDX",
98
- "NASDAQ 100": "^NDX",
99
- "S&P 500": "^GSPC",
100
- "Dow Jones": "^DJI",
101
- "Microsoft": "MSFT",
102
- "Google": "GOOGL",
103
- "Nvidia": "NVDA",
104
- "Apple": "AAPL",
105
- "Amazon": "AMZN",
106
- "Tesla": "TSLA",
107
- "Netflix": "NFLX",
108
- "Meta": "META",
109
- "Bitcoin": "BTC-USD",
110
- "Ethereum": "ETH-USD",
111
- "Solana": "SOL-USD",
112
- "Dogecoin": "DOGE-USD",
113
- }
114
-
115
- # Determine the effective end date for each asset
116
- asset_end_dates = {}
117
- for asset in selected_assets:
118
- if asset == "Fixed Deposit":
119
- asset_end_dates[asset] = user_end_date
120
- else:
121
- if user_end_date > today:
122
- asset_end_dates[asset] = today
123
- else:
124
  asset_end_dates[asset] = user_end_date
125
-
126
- # Warn the user if a future end date is selected for market assets
127
- if any(user_end_date > today and asset != "Fixed Deposit" for asset in selected_assets):
128
- st.warning(f"Market data is only available up to today ({today}). For market assets, the end date has been set to today.")
129
-
130
- # Calculate returns for each selected asset
131
- asset_series = {}
132
- failed_assets = []
133
- actual_start_dates = {}
134
-
135
- for asset in selected_assets:
136
- asset_start = start_date
137
- asset_end = asset_end_dates[asset]
138
- if asset == "Fixed Deposit":
139
- fd_index = pd.date_range(start=asset_start, end=user_end_date)
140
- daily_rate = (1 + fd_rate) ** (1/365) - 1
141
- fd_values = initial_investment * (1 + daily_rate) ** np.arange(len(fd_index))
142
- if currency == "SGD":
143
- fd_values = fd_values * usd_to_sgd
144
- asset_series[asset] = pd.Series(fd_values, index=fd_index)
145
- actual_start_dates[asset] = asset_start
146
- elif asset == "HDB":
147
- hdb_values = calculate_hdb_returns(asset_start, asset_end, initial_investment)
148
- if hdb_values is not None:
149
  if currency == "SGD":
150
- hdb_values = hdb_values * usd_to_sgd
151
- asset_series[asset] = hdb_values
152
  actual_start_dates[asset] = asset_start
 
 
 
 
 
 
 
 
 
153
  else:
154
- failed_assets.append(asset)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  else:
156
- price_data = fetch_yfinance_daily(tickers[asset], asset_start, asset_end)
157
- if price_data is not None and not price_data.empty:
158
- price_data = price_data.sort_index()
159
- actual_start = price_data.index[0]
160
- actual_start_dates[asset] = actual_start
161
- aligned_index = pd.date_range(start=actual_start, end=asset_end)
162
- price_data = price_data.reindex(aligned_index)
163
- price_data = price_data.ffill()
164
- asset_values = initial_investment * (price_data / price_data.iloc[0])
165
- if currency == "SGD":
166
- asset_values = asset_values * usd_to_sgd
167
- asset_series[asset] = asset_values
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  else:
169
- failed_assets.append(asset)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
 
171
- # Combine all asset series into a single DataFrame
172
- if asset_series:
173
- returns_data = pd.DataFrame(asset_series)
174
- else:
175
- returns_data = pd.DataFrame()
176
-
177
- # Remove failed assets from selected_assets (except FD)
178
- selected_assets = [asset for asset in selected_assets if asset not in failed_assets or asset == "Fixed Deposit"]
179
-
180
- if not selected_assets:
181
- st.error("No assets could be loaded. Please try different assets.")
182
- st.stop()
183
-
184
- # Create the plot
185
- fig = go.Figure()
186
-
187
- # Add vertical lines for every 5 years
188
- start_year = returns_data.index[0].year
189
- end_year = returns_data.index[-1].year
190
- for year in range(start_year, end_year + 1, 5):
191
- fig.add_vline(x=datetime(year, 1, 1), line_dash="dash", line_color="gray", opacity=0.3)
192
-
193
- for asset in selected_assets:
194
- fig.add_trace(go.Scatter(
195
- x=returns_data.index,
196
- y=returns_data[asset],
197
- name=asset,
198
- mode='lines'
199
- ))
200
-
201
- fig.update_layout(
202
- title="Asset Performance Comparison",
203
- xaxis_title="Date",
204
- yaxis_title=f"Investment Value ({currency_symbol})",
205
- hovermode="x unified",
206
- height=600,
207
- yaxis_type="log" if use_log_scale else "linear"
208
- )
209
 
210
- # Display the plot
211
- st.plotly_chart(fig, use_container_width=True)
212
-
213
- # Create a summary table
214
- st.subheader("Investment Summary")
215
- summary_data = []
216
- for asset in selected_assets:
217
- valid_series = returns_data[asset].dropna()
218
- if not valid_series.empty:
219
- final_value = valid_series.iloc[-1]
220
- days = (valid_series.index[-1] - valid_series.index[0]).days
221
- years = days / 365
222
- annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
- # Calculate yearly return statistics
225
- yearly_data = valid_series.resample('YE').first()
226
- yearly_returns = yearly_data.pct_change().dropna()
227
- positive_years = (yearly_returns > 0).sum()
228
- total_years = len(yearly_returns)
229
- positive_percentage = (positive_years / total_years) * 100
230
 
231
- summary_data.append({
232
- "Asset": asset,
233
- f"Final Value ({currency_symbol})": final_value,
234
- "Annualized Return (%)": annualized_return,
235
- "Positive Years": f"{positive_years}/{total_years}",
236
- "Positive Years %": positive_percentage,
237
- })
238
- else:
239
- summary_data.append({
240
- "Asset": asset,
241
- f"Final Value ({currency_symbol})": None,
242
- "Annualized Return (%)": None,
243
- "Positive Years": "N/A",
244
- "Positive Years %": None,
245
- })
246
-
247
- # Convert to DataFrame
248
- df = pd.DataFrame(summary_data)
249
-
250
- # Format the display values
251
- df[f"Final Value ({currency_symbol})"] = df[f"Final Value ({currency_symbol})"].apply(lambda x: f"{x:,.2f}" if x is not None else "N/A")
252
- df["Annualized Return (%)"] = df["Annualized Return (%)"].apply(lambda x: f"{x:.2f}" if x is not None else "N/A")
253
- df["Positive Years %"] = df["Positive Years %"].apply(lambda x: f"{x:.1f}" if x is not None else "N/A")
254
-
255
- # Display the summary table with sorting enabled
256
- st.dataframe(
257
- df,
258
- hide_index=True,
259
- column_config={
260
- f"Final Value ({currency_symbol})": st.column_config.NumberColumn(
261
- format="%.2f"
262
- ),
263
- "Annualized Return (%)": st.column_config.NumberColumn(
264
- format="%.2f"
265
- ),
266
- "Positive Years %": st.column_config.NumberColumn(
267
- format="%.1f"
268
- ),
269
- "Performance": st.column_config.ImageColumn(
270
- "Performance"
271
- )
272
- }
273
- )
274
-
275
- # Calculate and display final returns
276
- st.subheader("Final Investment Values")
277
- for asset in selected_assets:
278
- valid_series = returns_data[asset].dropna()
279
- if not valid_series.empty:
280
- final_value = valid_series.iloc[-1]
281
- st.write(f"{asset}: {currency_symbol}{final_value:,.2f}")
282
- else:
283
- st.write(f"{asset}: Data unavailable")
284
-
285
- # Calculate and display annualized returns
286
- st.subheader("Annualized Returns")
287
- for asset in selected_assets:
288
- valid_series = returns_data[asset].dropna()
289
- if len(valid_series) > 1:
290
- actual_start = actual_start_dates[asset]
291
- days = (valid_series.index[-1] - valid_series.index[0]).days
292
- years = days / 365
293
- final_value = valid_series.iloc[-1]
294
- annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
295
- if pd.Timestamp(actual_start).date() > start_date:
296
- st.write(f"{asset}: {annualized_return:.2f}% (Data available from {actual_start.strftime('%Y-%m-%d')})")
297
- else:
298
- st.write(f"{asset}: {annualized_return:.2f}%")
299
- else:
300
- st.write(f"{asset}: N/A")
301
-
302
- # Calculate and display yearly return statistics
303
- st.subheader("Yearly Return Statistics")
304
- for asset in selected_assets:
305
- valid_series = returns_data[asset].dropna()
306
- if len(valid_series) > 1:
307
- # Resample to yearly data
308
- yearly_data = valid_series.resample('YE').first()
309
 
310
- # Calculate yearly returns
311
- yearly_returns = yearly_data.pct_change().dropna()
 
312
 
313
- # Count positive and negative years
314
- positive_years = (yearly_returns > 0).sum()
315
- total_years = len(yearly_returns)
316
- positive_percentage = (positive_years / total_years) * 100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
 
318
- st.write(f"{asset}: {positive_years} out of {total_years} years ({positive_percentage:.1f}%) had positive returns")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
  else:
320
- st.write(f"{asset}: Insufficient data for yearly analysis")
321
-
322
- # Show warnings for data availability
323
- for asset in selected_assets:
324
- if asset in actual_start_dates and pd.Timestamp(actual_start_dates[asset]).date() > start_date:
325
- st.warning(f"Data for {asset} is only available from {actual_start_dates[asset].strftime('%Y-%m-%d')}. The analysis starts from this date.")
326
-
327
- # Show warning for failed assets
328
- if failed_assets:
329
- st.warning(f"Could not load data for the following assets: {', '.join(failed_assets)}")
 
11
  from utils.fd_utils import calculate_fd_returns
12
  from utils.hdb_utils import calculate_hdb_returns
13
 
14
+ def fetch_stock_daily(symbol, start_date, end_date):
15
+ print (f"Fetching stock data for {symbol} from {start_date} to {end_date}")
16
+ start_date_dt = pd.Timestamp(start_date)
17
+ end_date_dt = pd.Timestamp(end_date)
18
+ try:
19
+ folder = "notebooks/stock_data/"
20
+ data = pd.read_csv(
21
+ f"{folder}{symbol}.csv",
22
+ parse_dates=["Date"]
23
+ )
24
+ print (f'Date range: {data["Date"].min()} - {data["Date"].max()}')
25
+ print (f"start_date_dt: {start_date_dt}, end_date_dt: {end_date_dt}")
26
+ data = data[(data["Date"] >= start_date_dt) & (data["Date"] <= end_date_dt)]
27
+ data.set_index("Date", inplace=True)
28
+ data = data["Close"]
29
+ return data
30
+ except FileNotFoundError:
31
+ print(f"File {folder}{symbol}.csv not found.")
32
+ return None
33
+
34
 
35
  print("Starting the app ...")
36
 
 
 
 
 
 
 
37
  # Set page config
38
+ st.set_page_config(
39
+ page_title="Asset Class Comparison",
40
+ layout="wide",
41
+ menu_items={
42
+ 'Get Help': 'https://github.com/yourusername/asset-class-comparison',
43
+ 'Report a bug': 'https://github.com/yourusername/asset-class-comparison/issues',
44
+ 'About': 'Compare the performance of different asset classes over time'
45
+ }
46
+ )
47
 
48
  # Title and description
49
  st.title("Asset Class Performance Comparison")
50
+
51
+ # Initialize session state to track which tab is active
52
+ if 'active_tab' not in st.session_state:
53
+ st.session_state.active_tab = 0
54
+
55
+ # Get URL parameters and set the active tab accordingly
56
+ if "tab" in st.query_params:
57
+ tab_value = st.query_params["tab"].lower()
58
+ if tab_value in ["readme", "2", "calculator", "formulas", "guide"]:
59
+ st.session_state.active_tab = 1
60
+ elif tab_value in ["1", "comparison", "main", "invest", "investment"]:
61
+ st.session_state.active_tab = 0
62
+
63
+ # Create a tab selector
64
+ tab_options = ["Investment Comparison", "README & Formulas"]
65
+ selected_tab = st.radio("Select Tab:", tab_options, horizontal=True, index=st.session_state.active_tab, label_visibility="collapsed")
66
+
67
+ # Update session state and URL when tab changes
68
+ if selected_tab == "Investment Comparison" and st.session_state.active_tab != 0:
69
+ st.session_state.active_tab = 0
70
+ st.query_params["tab"] = "comparison"
71
+ st.rerun()
72
+ elif selected_tab == "README & Formulas" and st.session_state.active_tab != 1:
73
+ st.session_state.active_tab = 1
74
+ st.query_params["tab"] = "readme"
75
+ st.rerun()
76
+
77
+ # Display URL tips
78
+ with st.expander("URL Tips πŸ”—"):
79
+ st.markdown("""
80
+ You can use URL parameters to directly navigate to specific tabs:
81
+
82
+ * Main investment comparison: `?tab=1` or `?tab=comparison`
83
+ * README & Calculator: `?tab=2` or `?tab=readme`
84
+
85
+ Example: `http://yourapp.com/?tab=readme`
86
+
87
+ These links can be bookmarked or shared to go directly to a specific tab.
88
+
89
+ You can also set the tab programmatically in your app:
90
+ ```python
91
+ # To switch to the README tab
92
+ st.query_params["tab"] = "readme"
93
+
94
+ # To clear all parameters
95
+ st.query_params.clear()
96
+ ```
97
+ """)
98
+
99
+ # Display content based on the selected tab
100
+ if st.session_state.active_tab == 0:
101
+ # INVESTMENT COMPARISON TAB
102
+ st.write("Compare the performance of different asset classes over time")
103
+ # st.write("Note: Cryptocurrencies (BTC, ETH, SOL, DOGE) are highly volatile and should be considered high-risk investments")
104
+
105
+ # Sidebar for user inputs
106
+ st.sidebar.header("Investment Parameters")
107
+ currency = st.sidebar.selectbox("Display Currency", ["USD", "SGD"], index=0)
108
+ initial_investment = st.sidebar.number_input(f"Initial Investment Amount ({currency})", min_value=1000, value=10000, step=1000)
109
+ start_date = st.sidebar.date_input("Start Date", value=datetime.now() - timedelta(days=365*25))
110
+ user_end_date = st.sidebar.date_input("End Date", value=datetime.now())
111
+
112
+ fd_rate = st.sidebar.number_input("Fixed Deposit Rate (%)", min_value=0.0, value=2.9, step=0.1) / 100
113
+ use_log_scale = st.sidebar.checkbox("Use Log Scale", value=True)
114
+
115
+ # Calculate and display investment period
116
+ investment_days = (user_end_date - start_date).days
117
+ investment_years = investment_days / 365
118
+ st.write(f"Investment Period: {investment_days} days ({investment_years:.1f} years)")
119
+
120
+ # Asset selection
121
+ selected_assets = st.sidebar.multiselect(
122
+ "Select Assets to Compare",
123
+ [
124
+ "Fixed Deposit",
125
+ "HDB",
126
+ "Gold",
127
+ "SGS Bonds",
128
+ "US Treasury Bonds",
129
+ "NASDAQ Composite",
130
+ "NASDAQ-100",
131
+ "Invesco QQQ Trust",
132
+ "Fidelity NASDAQ Composite Index ETF",
133
+ "Invesco NASDAQ 100 ETF",
134
+ "S&P 500",
135
+ "Dow Jones",
136
+ "Microsoft",
137
+ "Google (Alphabet)",
138
+ "Nvidia",
139
+ "Apple",
140
+ "Amazon",
141
+ "Tesla",
142
+ "Netflix",
143
+ "Meta (Facebook)",
144
+ "Bitcoin",
145
+ "Ethereum",
146
+ "Solana",
147
+ "Dogecoin",
148
+ ],
149
+ default=[
150
+ "Fixed Deposit",
151
+ "HDB",
152
+ "Gold",
153
+ "US Treasury Bonds",
154
+ "SGS Bonds",
155
+ "S&P 500",
156
+ "Dow Jones",
157
+ "NASDAQ Composite",
158
+ "Microsoft",
159
+ "Google (Alphabet)",
160
+ "Meta (Facebook)",
161
+ "Nvidia",
162
+ "Bitcoin"
163
  ]
164
+ )
165
+
166
+ # Today's date for reference
167
+ today = datetime.now().date()
168
+ today = today# - timedelta(days=1) # Temporarily set to yesterday
169
+
170
+ # usd_to_sgd = get_usd_sgd_rate() if currency == "SGD" else 1.0
171
+ usd_to_sgd = 1.30 # Temporarily set to 1.30 to test the app
172
+ currency_symbol = "$" if currency == "USD" else "S$"
173
+
174
+ # Create a dictionary of tickers for yfinance
175
+ tickers = {
176
+ "Gold": "GLD",
177
+ # "HDB": "A12.SI",
178
+ "SGS Bonds": "A35.SI", # Nikko AM SGD Investment Grade Corporate Bond ETF
179
+ "US Treasury Bonds": "TLT", # iShares 20+ Year Treasury Bond ETF
180
+ "NASDAQ Composite": "^IXIC",
181
+ "NASDAQ Large Cap": "^NDX",
182
+ "NASDAQ 100": "^NDX",
183
+ "S&P 500": "^GSPC",
184
+ "Dow Jones": "^DJI",
185
+ "Microsoft": "MSFT",
186
+ "Google (Alphabet)": "GOOGL",
187
+ "Nvidia": "NVDA",
188
+ "Apple": "AAPL",
189
+ "Amazon": "AMZN",
190
+ "Tesla": "TSLA",
191
+ "Netflix": "NFLX",
192
+ "Meta (Facebook)": "META",
193
+ "Bitcoin": "BTC-USD",
194
+ "Ethereum": "ETH-USD",
195
+ "Solana": "SOL-USD",
196
+ "Dogecoin": "DOGE-USD",
197
+ }
198
 
199
+ # Determine the effective end date for each asset
200
+ asset_end_dates = {}
201
+ for asset in selected_assets:
202
+ if asset == "Fixed Deposit":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  asset_end_dates[asset] = user_end_date
204
+ else:
205
+ if user_end_date > today:
206
+ asset_end_dates[asset] = today
207
+ else:
208
+ asset_end_dates[asset] = user_end_date
209
+
210
+ # Warn the user if a future end date is selected for market assets
211
+ if any(user_end_date > today and asset != "Fixed Deposit" for asset in selected_assets):
212
+ st.warning(f"Market data is only available up to today ({today}). For market assets, the end date has been set to today.")
213
+
214
+ # Calculate returns for each selected asset
215
+ asset_series = {}
216
+ failed_assets = []
217
+ actual_start_dates = {}
218
+
219
+ for asset in selected_assets:
220
+ asset_start = start_date
221
+ asset_end = asset_end_dates[asset]
222
+ if asset == "Fixed Deposit":
223
+ fd_index = pd.date_range(start=asset_start, end=user_end_date)
224
+ daily_rate = (1 + fd_rate) ** (1/365) - 1
225
+ fd_values = initial_investment * (1 + daily_rate) ** np.arange(len(fd_index))
 
 
226
  if currency == "SGD":
227
+ fd_values = fd_values * usd_to_sgd
228
+ asset_series[asset] = pd.Series(fd_values, index=fd_index)
229
  actual_start_dates[asset] = asset_start
230
+ elif asset == "HDB":
231
+ hdb_values = calculate_hdb_returns(asset_start, asset_end, initial_investment)
232
+ if hdb_values is not None:
233
+ if currency == "SGD":
234
+ hdb_values = hdb_values * usd_to_sgd
235
+ asset_series[asset] = hdb_values
236
+ actual_start_dates[asset] = asset_start
237
+ else:
238
+ failed_assets.append(asset)
239
  else:
240
+ price_data = fetch_stock_daily(tickers[asset], asset_start, asset_end)
241
+ if price_data is not None and not price_data.empty:
242
+ price_data = price_data.sort_index()
243
+ actual_start = price_data.index[0]
244
+ actual_start_dates[asset] = actual_start
245
+ aligned_index = pd.date_range(start=actual_start, end=asset_end)
246
+ price_data = price_data.reindex(aligned_index)
247
+ price_data = price_data.ffill()
248
+ asset_values = initial_investment * (price_data / price_data.iloc[0])
249
+ if currency == "SGD":
250
+ asset_values = asset_values * usd_to_sgd
251
+ asset_series[asset] = asset_values
252
+ else:
253
+ failed_assets.append(asset)
254
+
255
+ # Combine all asset series into a single DataFrame
256
+ if asset_series:
257
+ returns_data = pd.DataFrame(asset_series)
258
  else:
259
+ returns_data = pd.DataFrame()
260
+
261
+ # Remove failed assets from selected_assets (except FD)
262
+ selected_assets = [asset for asset in selected_assets if asset not in failed_assets or asset == "Fixed Deposit"]
263
+
264
+ if not selected_assets:
265
+ st.error("No assets could be loaded. Please try different assets.")
266
+ st.stop()
267
+
268
+ # Create the plot
269
+ fig = go.Figure()
270
+
271
+ # Add vertical lines for every 5 years
272
+ start_year = returns_data.index[0].year
273
+ end_year = returns_data.index[-1].year
274
+ for year in range(start_year, end_year + 1, 5):
275
+ fig.add_vline(x=datetime(year, 1, 1), line_dash="dash", line_color="gray", opacity=0.3)
276
+
277
+ for asset in selected_assets:
278
+ fig.add_trace(go.Scatter(
279
+ x=returns_data.index,
280
+ y=returns_data[asset],
281
+ name=asset,
282
+ mode='lines'
283
+ ))
284
+
285
+ fig.update_layout(
286
+ title="Asset Performance Comparison",
287
+ xaxis_title="Date",
288
+ yaxis_title=f"Investment Value ({currency_symbol})",
289
+ hovermode="x unified",
290
+ height=600,
291
+ yaxis_type="log" if use_log_scale else "linear"
292
+ )
293
+
294
+ # Display the plot
295
+ st.plotly_chart(fig, use_container_width=True)
296
+
297
+ # Create a summary table
298
+ st.subheader("Investment Summary")
299
+ summary_data = []
300
+ for asset in selected_assets:
301
+ valid_series = returns_data[asset].dropna()
302
+ if not valid_series.empty:
303
+ final_value = valid_series.iloc[-1]
304
+ days = (valid_series.index[-1] - valid_series.index[0]).days
305
+ years = days / 365
306
+ annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
307
+
308
+ # Calculate yearly return statistics
309
+ yearly_data = valid_series.resample('YE').first()
310
+ yearly_returns = yearly_data.pct_change().dropna()
311
+ positive_years = (yearly_returns > 0).sum()
312
+ total_years = len(yearly_returns)
313
+ positive_percentage = (positive_years / total_years) * 100
314
+
315
+ # Calculate return multiple
316
+ return_multiple = final_value / initial_investment
317
+
318
+ # Calculate simple interest based annual return
319
+ simple_annual_return = ((return_multiple - 1) / years) * 100
320
+
321
+ summary_data.append({
322
+ "Asset": asset,
323
+ f"Final Value ({currency_symbol})": final_value,
324
+ "Return Multiple": return_multiple,
325
+ "Annualized Return (%)": annualized_return,
326
+ "Simple Annual Return (%)": simple_annual_return,
327
+ "Positive Years": f"{positive_years}/{total_years}",
328
+ "Positive Years %": positive_percentage,
329
+ })
330
+ else:
331
+ summary_data.append({
332
+ "Asset": asset,
333
+ f"Final Value ({currency_symbol})": None,
334
+ "Return Multiple": None,
335
+ "Annualized Return (%)": None,
336
+ "Simple Annual Return (%)": None,
337
+ "Positive Years": "N/A",
338
+ "Positive Years %": None,
339
+ })
340
+
341
+ # Convert to DataFrame
342
+ df = pd.DataFrame(summary_data)
343
+
344
+ # Format the display values
345
+ df[f"Final Value ({currency_symbol})"] = df[f"Final Value ({currency_symbol})"].apply(lambda x: f"{x:,.2f}" if x is not None else "N/A")
346
+ df["Return Multiple"] = df["Return Multiple"].apply(lambda x: f"{x:.2f}" if x is not None else "N/A")
347
+ df["Annualized Return (%)"] = df["Annualized Return (%)"].apply(lambda x: f"{x:.2f}" if x is not None else "N/A")
348
+ df["Simple Annual Return (%)"] = df["Simple Annual Return (%)"].apply(lambda x: f"{x:.2f}" if x is not None else "N/A")
349
+ df["Positive Years %"] = df["Positive Years %"].apply(lambda x: f"{x:.1f}" if x is not None else "N/A")
350
+
351
+ # Display the summary table with sorting enabled
352
+ st.dataframe(
353
+ df,
354
+ hide_index=True,
355
+ column_config={
356
+ f"Final Value ({currency_symbol})": st.column_config.NumberColumn(
357
+ format="%.2f"
358
+ ),
359
+ "Return Multiple": st.column_config.NumberColumn(
360
+ format="%.2f"
361
+ ),
362
+ "Annualized Return (%)": st.column_config.NumberColumn(
363
+ format="%.2f"
364
+ ),
365
+ "Simple Annual Return (%)": st.column_config.NumberColumn(
366
+ format="%.2f"
367
+ ),
368
+ "Positive Years %": st.column_config.NumberColumn(
369
+ format="%.1f"
370
+ ),
371
+ "Performance": st.column_config.ImageColumn(
372
+ "Performance"
373
+ )
374
+ }
375
+ )
376
+
377
+ # Calculate and display final returns
378
+ st.subheader("Final Investment Values")
379
+ for asset in selected_assets:
380
+ valid_series = returns_data[asset].dropna()
381
+ if not valid_series.empty:
382
+ final_value = valid_series.iloc[-1]
383
+ st.write(f"{asset}: {currency_symbol}{final_value:,.2f}")
384
  else:
385
+ st.write(f"{asset}: Data unavailable")
386
+
387
+ # Calculate and display annualized returns
388
+ st.subheader("Annualized Returns")
389
+ for asset in selected_assets:
390
+ valid_series = returns_data[asset].dropna()
391
+ if len(valid_series) > 1:
392
+ actual_start = actual_start_dates[asset]
393
+ days = (valid_series.index[-1] - valid_series.index[0]).days
394
+ years = days / 365
395
+ final_value = valid_series.iloc[-1]
396
+ annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
397
+ if pd.Timestamp(actual_start).date() > start_date:
398
+ st.write(f"{asset}: {annualized_return:.2f}% (Data available from {actual_start.strftime('%Y-%m-%d')})")
399
+ else:
400
+ st.write(f"{asset}: {annualized_return:.2f}%")
401
+ else:
402
+ st.write(f"{asset}: N/A")
403
+
404
+ # Calculate and display yearly return statistics
405
+ st.subheader("Yearly Return Statistics")
406
+ for asset in selected_assets:
407
+ valid_series = returns_data[asset].dropna()
408
+ if len(valid_series) > 1:
409
+ # Resample to yearly data
410
+ yearly_data = valid_series.resample('YE').first()
411
+
412
+ # Calculate yearly returns
413
+ yearly_returns = yearly_data.pct_change().dropna()
414
+
415
+ # Count positive and negative years
416
+ positive_years = (yearly_returns > 0).sum()
417
+ total_years = len(yearly_returns)
418
+ positive_percentage = (positive_years / total_years) * 100
419
+
420
+ st.write(f"{asset}: {positive_years} out of {total_years} years ({positive_percentage:.1f}%) had positive returns")
421
+ else:
422
+ st.write(f"{asset}: Insufficient data for yearly analysis")
423
 
424
+ # Show warnings for data availability
425
+ for asset in selected_assets:
426
+ if asset in actual_start_dates and pd.Timestamp(actual_start_dates[asset]).date() > start_date:
427
+ st.warning(f"Data for {asset} is only available from {actual_start_dates[asset].strftime('%Y-%m-%d')}. The analysis starts from this date.")
428
+
429
+ # Show warning for failed assets
430
+ if failed_assets:
431
+ st.warning(f"Could not load data for the following assets: {', '.join(failed_assets)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
 
433
+ else:
434
+ # README & FORMULAS TAB
435
+ st.header("Investment Calculation Guide")
436
+
437
+ st.markdown("""
438
+ ## Key Investment Formulas
439
+
440
+ This guide explains the key formulas used in the investment comparison tool and how to interpret them.
441
+
442
+ ### Return Multiple
443
+
444
+ The return multiple shows how many times your initial investment has grown over the investment horizon.
445
+
446
+ ```
447
+ Return Multiple = Final Value / Initial Investment
448
+ ```
449
+
450
+ **Example:**
451
+ - Initial Investment: $10,000
452
+ - Final Value: $25,000
453
+ - Return Multiple = 25,000 / 10,000 = 2.5x
454
+
455
+ This means your investment has grown to 2.5 times its original value over the investment period.
456
+
457
+ ### Annualized Return (CAGR)
458
+
459
+ The annualized return is the geometric average annual return over the investment period, expressed as a percentage. This is equivalent to the Compound Annual Growth Rate (CAGR).
460
+
461
+ ```
462
+ Annualized Return (%) = ((Final Value / Initial Investment) ^ (1 / Years) - 1) Γ— 100
463
+ ```
464
+
465
+ **Example:**
466
+ - Initial Investment: $10,000
467
+ - Final Value: $20,000
468
+ - Investment Period: 10 years
469
+ - Annualized Return = ((20,000 / 10,000) ^ (1/10) - 1) Γ— 100 = 7.18%
470
+
471
+ This means your investment grew at an average rate of 7.18% per year, compounded annually.
472
+
473
+ ### Simple Annual Return
474
+
475
+ Simple annual return calculates the average yearly return by dividing the total return by the number of years.
476
+
477
+ ```
478
+ Simple Annual Return (%) = ((Return Multiple - 1) / Years) Γ— 100
479
+ ```
480
+
481
+ **Example:**
482
+ - Return Multiple: 2.0x
483
+ - Investment Period: 10 years
484
+ - Simple Annual Return = ((2.0 - 1) / 10) Γ— 100 = 10.0%
485
+
486
+ This represents the linear average annual return, which is typically higher than CAGR.
487
+
488
+ ### CAGR vs. Simple Annual Return
489
+
490
+ **Compound Annual Growth Rate (CAGR)** and simple annual return represent two different ways to measure annual performance:
491
+
492
+ - **CAGR** (our "Annualized Return") assumes compounding - each year's gains build upon the previous year's value
493
+ - **Simple Annual Return** assumes linear growth - dividing the total gain by the number of years
494
+
495
+ For the same investment period and final value, the simple annual return is typically higher than CAGR. The difference increases with longer investment periods and higher returns.
496
+
497
+ **Mathematical relationship:**
498
+ - CAGR: (1 + r)^n = Final Value / Initial Value
499
+ - Simple: 1 + (r Γ— n) = Final Value / Initial Value
500
+
501
+ Where r is the rate (as a decimal) and n is the number of years.
502
+
503
+ ### Calculating Final Value from Annualized Return
504
+
505
+ If you know the annualized return, you can calculate the expected final value:
506
+
507
+ ```
508
+ Final Value = Initial Investment Γ— (1 + Annualized Return/100) ^ Years
509
+ ```
510
+
511
+ **Example:**
512
+ - Initial Investment: $10,000
513
+ - Annualized Return: 7%
514
+ - Investment Period: 10 years
515
+ - Final Value = $10000 Γ— (1 + 0.07)^{10} = 19672$
516
+
517
+ ### Positive Years Percentage
518
+
519
+ The percentage of years with positive returns:
520
+
521
+ ```
522
+ Positive Years (%) = (Number of Years with Positive Returns / Total Years) Γ— 100
523
+ ```
524
+
525
+ This helps assess the consistency of positive performance.
526
+ """)
527
+
528
+ st.subheader("How to Use This Information")
529
+
530
+ st.markdown("""
531
+ - **Return Multiple** is useful for quickly understanding total growth
532
+ - **Annualized Return** allows fair comparison between investments with different time periods
533
+ - **Positive Years %** helps assess the consistency and volatility of returns
534
+
535
+ When comparing investments:
536
+ 1. Higher annualized returns are generally better
537
+ 2. More consistent returns (higher positive years %) may indicate lower volatility
538
+ 3. Return multiples must be viewed in context of the time period
539
+ """)
540
+
541
+ # Add interactive investment calculator
542
+ st.subheader("Investment Calculator")
543
+
544
+ st.markdown("""
545
+ Use this calculator to estimate future investment values based on different parameters.
546
+ """)
547
+
548
+ # Add explanation about simple vs compound interest
549
+ with st.expander("Simple vs. Compound Interest"):
550
+ st.markdown("""
551
+ ### Simple Interest vs. Compound Interest
552
 
553
+ **Simple Interest** is calculated only on the initial principal, without considering accumulated interest.
 
 
 
 
 
554
 
555
+ ```
556
+ Final Value = Initial Investment Γ— (1 + (Annual Return/100 Γ— Years))
557
+ ```
558
+
559
+ **Compound Interest** is calculated on both the initial principal and the accumulated interest.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
560
 
561
+ ```
562
+ Final Value = Initial Investment Γ— (1 + Annual Return/100)^Years
563
+ ```
564
 
565
+ **Key Differences:**
566
+ - Simple interest grows linearly (straight line on chart)
567
+ - Compound interest grows exponentially (curved line on chart)
568
+ - Over long periods, the difference becomes substantial
569
+ - Most real-world investments compound (stocks, bonds, etc.)
570
+ """)
571
+
572
+ calc_col1, calc_col2 = st.columns(2)
573
+
574
+ with calc_col1:
575
+ calc_initial = st.number_input("Initial Investment ($)", min_value=100, value=10000, step=1000)
576
+ calc_years = st.number_input("Investment Period (Years)", min_value=1, value=10, step=1)
577
+ interest_type = st.radio("Interest Type", ["Compound", "Simple"], index=0)
578
+
579
+ with calc_col2:
580
+ calc_return = st.number_input("Annual Return (%)", min_value=0.0, value=7.0, step=0.5)
581
+ calc_currency = st.selectbox("Currency", ["USD", "SGD"], index=0)
582
+
583
+ # Calculate results based on interest type
584
+ calc_currency_symbol = "$" if calc_currency == "USD" else "S$"
585
+
586
+ if interest_type == "Compound":
587
+ calc_final_value = calc_initial * ((1 + calc_return/100) ** calc_years)
588
+ interest_formula = f"${calc_initial:,.0f} Γ— (1 + {calc_return/100:.4f})^{calc_years}$"
589
+ else: # Simple Interest
590
+ calc_final_value = calc_initial * (1 + (calc_return/100 * calc_years))
591
+ interest_formula = f"${calc_initial:,.0f} Γ— (1 + {calc_return/100:.4f} Γ— {calc_years})$"
592
+
593
+ calc_return_multiple = calc_final_value / calc_initial
594
+ total_interest = calc_final_value - calc_initial
595
+
596
+ # Display results in a highlighted box
597
+ st.markdown(f"""
598
+ #### Results
599
+ """)
600
+
601
+ results_col1, results_col2, results_col3 = st.columns(3)
602
+
603
+ with results_col1:
604
+ st.metric("Final Investment Value", f"{calc_currency_symbol}{calc_final_value:,.2f}")
605
 
606
+ with results_col2:
607
+ st.metric("Return Multiple", f"{calc_return_multiple:.2f}x")
608
+
609
+ with results_col3:
610
+ st.metric("Total Interest Earned", f"{calc_currency_symbol}{total_interest:,.2f}")
611
+
612
+ st.markdown(f"**Formula Applied:** {interest_formula} = {calc_currency_symbol}{calc_final_value:,.2f}")
613
+
614
+ # Add a chart to visualize growth and compare both methods
615
+ years_range = list(range(0, calc_years + 1))
616
+
617
+ # Calculate both types of growth for comparison
618
+ compound_values = [calc_initial * ((1 + calc_return/100) ** year) for year in years_range]
619
+ simple_values = [calc_initial * (1 + (calc_return/100 * year)) for year in years_range]
620
+
621
+ # Create DataFrame with both growth types
622
+ growth_chart = pd.DataFrame({
623
+ 'Year': years_range,
624
+ 'Compound Interest': compound_values,
625
+ 'Simple Interest': simple_values
626
+ })
627
+
628
+ st.subheader("Investment Growth Projection")
629
+
630
+ # Highlight the selected interest type
631
+ if interest_type == "Compound":
632
+ st.line_chart(growth_chart, x='Year', y=['Compound Interest', 'Simple Interest'])
633
  else:
634
+ st.line_chart(growth_chart, x='Year', y=['Simple Interest', 'Compound Interest'])
 
 
 
 
 
 
 
 
 
app_archived_v1.py ADDED
@@ -0,0 +1,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import yfinance as yf
4
+ import plotly.graph_objects as go
5
+ from datetime import datetime, timedelta
6
+ import numpy as np
7
+
8
+ # Import utility functions
9
+ from utils.yfinance_utils import fetch_yfinance_daily
10
+ from utils.currency_utils import get_usd_sgd_rate
11
+ from utils.fd_utils import calculate_fd_returns
12
+ from utils.hdb_utils import calculate_hdb_returns
13
+
14
+
15
+ print("Starting the app ...")
16
+
17
+ # Sanity check on the yfinance_utils
18
+ print("Sanity check on the yfinance_utils ...")
19
+ # print(fetch_yfinance_daily("MSFT", "2020-01-01", "2020-01-03"))
20
+ data = yf.download("MSFT", "2020-01-01", "2020-01-03")
21
+ print(data.head())
22
+
23
+ # Set page config
24
+ st.set_page_config(page_title="Asset Class Comparison", layout="wide")
25
+
26
+ # Title and description
27
+ st.title("Asset Class Performance Comparison")
28
+ st.write("Compare the performance of different asset classes over time")
29
+ # st.write("Note: Cryptocurrencies (BTC, ETH, SOL, DOGE) are highly volatile and should be considered high-risk investments")
30
+
31
+ # Sidebar for user inputs
32
+ st.sidebar.header("Investment Parameters")
33
+ currency = st.sidebar.selectbox("Display Currency", ["USD", "SGD"], index=0)
34
+ initial_investment = st.sidebar.number_input(f"Initial Investment Amount ({currency})", min_value=1000, value=10000, step=1000)
35
+ start_date = st.sidebar.date_input("Start Date", value=datetime.now() - timedelta(days=365*25))
36
+ user_end_date = st.sidebar.date_input("End Date", value=datetime.now())
37
+
38
+ fd_rate = st.sidebar.number_input("Fixed Deposit Rate (%)", min_value=0.0, value=2.9, step=0.1) / 100
39
+ use_log_scale = st.sidebar.checkbox("Use Log Scale", value=True)
40
+
41
+ # Calculate and display investment period
42
+ investment_days = (user_end_date - start_date).days
43
+ investment_years = investment_days / 365
44
+ st.write(f"Investment Period: {investment_days} days ({investment_years:.1f} years)")
45
+
46
+ # Asset selection
47
+ selected_assets = st.sidebar.multiselect(
48
+ "Select Assets to Compare",
49
+ [
50
+ "Fixed Deposit",
51
+ "HDB",
52
+ "Gold",
53
+ "SGS Bonds",
54
+ "US Treasury Bonds",
55
+ "NASDAQ Composite",
56
+ "NASDAQ Large Cap",
57
+ "NASDAQ 100",
58
+ "S&P 500",
59
+ "Dow Jones",
60
+ "Microsoft",
61
+ "Google",
62
+ "Nvidia",
63
+ "Apple",
64
+ "Amazon",
65
+ "Tesla",
66
+ "Netflix",
67
+ "Meta",
68
+ "Bitcoin",
69
+ "Ethereum",
70
+ "Solana",
71
+ "Dogecoin",
72
+ ],
73
+ default=[
74
+ "Fixed Deposit",
75
+ "HDB",
76
+ "Gold",
77
+ "US Treasury Bonds", "SGS Bonds",
78
+ "S&P 500", "Dow Jones", "NASDAQ Composite", #"NASDAQ Large Cap", "NASDAQ 100",
79
+ "Microsoft", "Google", "Nvidia",
80
+ "Bitcoin"
81
+ ]
82
+ )
83
+
84
+ # Today's date for reference
85
+ today = datetime.now().date()
86
+
87
+ usd_to_sgd = get_usd_sgd_rate() if currency == "SGD" else 1.0
88
+ currency_symbol = "$" if currency == "USD" else "S$"
89
+
90
+ # Create a dictionary of tickers for yfinance
91
+ tickers = {
92
+ "Gold": "GC=F",
93
+ "HDB": "A12.SI",
94
+ "SGS Bonds": "A35.SI", # Nikko AM SGD Investment Grade Corporate Bond ETF
95
+ "US Treasury Bonds": "TLT", # iShares 20+ Year Treasury Bond ETF
96
+ "NASDAQ Composite": "^IXIC",
97
+ "NASDAQ Large Cap": "^NDX",
98
+ "NASDAQ 100": "^NDX",
99
+ "S&P 500": "^GSPC",
100
+ "Dow Jones": "^DJI",
101
+ "Microsoft": "MSFT",
102
+ "Google": "GOOGL",
103
+ "Nvidia": "NVDA",
104
+ "Apple": "AAPL",
105
+ "Amazon": "AMZN",
106
+ "Tesla": "TSLA",
107
+ "Netflix": "NFLX",
108
+ "Meta": "META",
109
+ "Bitcoin": "BTC-USD",
110
+ "Ethereum": "ETH-USD",
111
+ "Solana": "SOL-USD",
112
+ "Dogecoin": "DOGE-USD",
113
+ }
114
+
115
+ # Determine the effective end date for each asset
116
+ asset_end_dates = {}
117
+ for asset in selected_assets:
118
+ if asset == "Fixed Deposit":
119
+ asset_end_dates[asset] = user_end_date
120
+ else:
121
+ if user_end_date > today:
122
+ asset_end_dates[asset] = today
123
+ else:
124
+ asset_end_dates[asset] = user_end_date
125
+
126
+ # Warn the user if a future end date is selected for market assets
127
+ if any(user_end_date > today and asset != "Fixed Deposit" for asset in selected_assets):
128
+ st.warning(f"Market data is only available up to today ({today}). For market assets, the end date has been set to today.")
129
+
130
+ # Calculate returns for each selected asset
131
+ asset_series = {}
132
+ failed_assets = []
133
+ actual_start_dates = {}
134
+
135
+ for asset in selected_assets:
136
+ asset_start = start_date
137
+ asset_end = asset_end_dates[asset]
138
+ if asset == "Fixed Deposit":
139
+ fd_index = pd.date_range(start=asset_start, end=user_end_date)
140
+ daily_rate = (1 + fd_rate) ** (1/365) - 1
141
+ fd_values = initial_investment * (1 + daily_rate) ** np.arange(len(fd_index))
142
+ if currency == "SGD":
143
+ fd_values = fd_values * usd_to_sgd
144
+ asset_series[asset] = pd.Series(fd_values, index=fd_index)
145
+ actual_start_dates[asset] = asset_start
146
+ elif asset == "HDB":
147
+ hdb_values = calculate_hdb_returns(asset_start, asset_end, initial_investment)
148
+ if hdb_values is not None:
149
+ if currency == "SGD":
150
+ hdb_values = hdb_values * usd_to_sgd
151
+ asset_series[asset] = hdb_values
152
+ actual_start_dates[asset] = asset_start
153
+ else:
154
+ failed_assets.append(asset)
155
+ else:
156
+ price_data = fetch_yfinance_daily(tickers[asset], asset_start, asset_end)
157
+ if price_data is not None and not price_data.empty:
158
+ price_data = price_data.sort_index()
159
+ actual_start = price_data.index[0]
160
+ actual_start_dates[asset] = actual_start
161
+ aligned_index = pd.date_range(start=actual_start, end=asset_end)
162
+ price_data = price_data.reindex(aligned_index)
163
+ price_data = price_data.ffill()
164
+ asset_values = initial_investment * (price_data / price_data.iloc[0])
165
+ if currency == "SGD":
166
+ asset_values = asset_values * usd_to_sgd
167
+ asset_series[asset] = asset_values
168
+ else:
169
+ failed_assets.append(asset)
170
+
171
+ # Combine all asset series into a single DataFrame
172
+ if asset_series:
173
+ returns_data = pd.DataFrame(asset_series)
174
+ else:
175
+ returns_data = pd.DataFrame()
176
+
177
+ # Remove failed assets from selected_assets (except FD)
178
+ selected_assets = [asset for asset in selected_assets if asset not in failed_assets or asset == "Fixed Deposit"]
179
+
180
+ if not selected_assets:
181
+ st.error("No assets could be loaded. Please try different assets.")
182
+ st.stop()
183
+
184
+ # Create the plot
185
+ fig = go.Figure()
186
+
187
+ # Add vertical lines for every 5 years
188
+ start_year = returns_data.index[0].year
189
+ end_year = returns_data.index[-1].year
190
+ for year in range(start_year, end_year + 1, 5):
191
+ fig.add_vline(x=datetime(year, 1, 1), line_dash="dash", line_color="gray", opacity=0.3)
192
+
193
+ for asset in selected_assets:
194
+ fig.add_trace(go.Scatter(
195
+ x=returns_data.index,
196
+ y=returns_data[asset],
197
+ name=asset,
198
+ mode='lines'
199
+ ))
200
+
201
+ fig.update_layout(
202
+ title="Asset Performance Comparison",
203
+ xaxis_title="Date",
204
+ yaxis_title=f"Investment Value ({currency_symbol})",
205
+ hovermode="x unified",
206
+ height=600,
207
+ yaxis_type="log" if use_log_scale else "linear"
208
+ )
209
+
210
+ # Display the plot
211
+ st.plotly_chart(fig, use_container_width=True)
212
+
213
+ # Create a summary table
214
+ st.subheader("Investment Summary")
215
+ summary_data = []
216
+ for asset in selected_assets:
217
+ valid_series = returns_data[asset].dropna()
218
+ if not valid_series.empty:
219
+ final_value = valid_series.iloc[-1]
220
+ days = (valid_series.index[-1] - valid_series.index[0]).days
221
+ years = days / 365
222
+ annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
223
+
224
+ # Calculate yearly return statistics
225
+ yearly_data = valid_series.resample('YE').first()
226
+ yearly_returns = yearly_data.pct_change().dropna()
227
+ positive_years = (yearly_returns > 0).sum()
228
+ total_years = len(yearly_returns)
229
+ positive_percentage = (positive_years / total_years) * 100
230
+
231
+ summary_data.append({
232
+ "Asset": asset,
233
+ f"Final Value ({currency_symbol})": final_value,
234
+ "Annualized Return (%)": annualized_return,
235
+ "Positive Years": f"{positive_years}/{total_years}",
236
+ "Positive Years %": positive_percentage,
237
+ })
238
+ else:
239
+ summary_data.append({
240
+ "Asset": asset,
241
+ f"Final Value ({currency_symbol})": None,
242
+ "Annualized Return (%)": None,
243
+ "Positive Years": "N/A",
244
+ "Positive Years %": None,
245
+ })
246
+
247
+ # Convert to DataFrame
248
+ df = pd.DataFrame(summary_data)
249
+
250
+ # Format the display values
251
+ df[f"Final Value ({currency_symbol})"] = df[f"Final Value ({currency_symbol})"].apply(lambda x: f"{x:,.2f}" if x is not None else "N/A")
252
+ df["Annualized Return (%)"] = df["Annualized Return (%)"].apply(lambda x: f"{x:.2f}" if x is not None else "N/A")
253
+ df["Positive Years %"] = df["Positive Years %"].apply(lambda x: f"{x:.1f}" if x is not None else "N/A")
254
+
255
+ # Display the summary table with sorting enabled
256
+ st.dataframe(
257
+ df,
258
+ hide_index=True,
259
+ column_config={
260
+ f"Final Value ({currency_symbol})": st.column_config.NumberColumn(
261
+ format="%.2f"
262
+ ),
263
+ "Annualized Return (%)": st.column_config.NumberColumn(
264
+ format="%.2f"
265
+ ),
266
+ "Positive Years %": st.column_config.NumberColumn(
267
+ format="%.1f"
268
+ ),
269
+ "Performance": st.column_config.ImageColumn(
270
+ "Performance"
271
+ )
272
+ }
273
+ )
274
+
275
+ # Calculate and display final returns
276
+ st.subheader("Final Investment Values")
277
+ for asset in selected_assets:
278
+ valid_series = returns_data[asset].dropna()
279
+ if not valid_series.empty:
280
+ final_value = valid_series.iloc[-1]
281
+ st.write(f"{asset}: {currency_symbol}{final_value:,.2f}")
282
+ else:
283
+ st.write(f"{asset}: Data unavailable")
284
+
285
+ # Calculate and display annualized returns
286
+ st.subheader("Annualized Returns")
287
+ for asset in selected_assets:
288
+ valid_series = returns_data[asset].dropna()
289
+ if len(valid_series) > 1:
290
+ actual_start = actual_start_dates[asset]
291
+ days = (valid_series.index[-1] - valid_series.index[0]).days
292
+ years = days / 365
293
+ final_value = valid_series.iloc[-1]
294
+ annualized_return = ((final_value / initial_investment) ** (1/years) - 1) * 100
295
+ if pd.Timestamp(actual_start).date() > start_date:
296
+ st.write(f"{asset}: {annualized_return:.2f}% (Data available from {actual_start.strftime('%Y-%m-%d')})")
297
+ else:
298
+ st.write(f"{asset}: {annualized_return:.2f}%")
299
+ else:
300
+ st.write(f"{asset}: N/A")
301
+
302
+ # Calculate and display yearly return statistics
303
+ st.subheader("Yearly Return Statistics")
304
+ for asset in selected_assets:
305
+ valid_series = returns_data[asset].dropna()
306
+ if len(valid_series) > 1:
307
+ # Resample to yearly data
308
+ yearly_data = valid_series.resample('YE').first()
309
+
310
+ # Calculate yearly returns
311
+ yearly_returns = yearly_data.pct_change().dropna()
312
+
313
+ # Count positive and negative years
314
+ positive_years = (yearly_returns > 0).sum()
315
+ total_years = len(yearly_returns)
316
+ positive_percentage = (positive_years / total_years) * 100
317
+
318
+ st.write(f"{asset}: {positive_years} out of {total_years} years ({positive_percentage:.1f}%) had positive returns")
319
+ else:
320
+ st.write(f"{asset}: Insufficient data for yearly analysis")
321
+
322
+ # Show warnings for data availability
323
+ for asset in selected_assets:
324
+ if asset in actual_start_dates and pd.Timestamp(actual_start_dates[asset]).date() > start_date:
325
+ st.warning(f"Data for {asset} is only available from {actual_start_dates[asset].strftime('%Y-%m-%d')}. The analysis starts from this date.")
326
+
327
+ # Show warning for failed assets
328
+ if failed_assets:
329
+ st.warning(f"Could not load data for the following assets: {', '.join(failed_assets)}")
notebooks/download-stock-tickers.ipynb ADDED
@@ -0,0 +1,1025 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "de34e023",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Imports"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "code",
13
+ "execution_count": 1,
14
+ "id": "fd7ebd88",
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "import os\n",
19
+ "\n",
20
+ "import FinanceDataReader as fdr\n",
21
+ "import pandas as pd"
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "markdown",
26
+ "id": "5d200466",
27
+ "metadata": {},
28
+ "source": [
29
+ "# Asset metadata"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "execution_count": 21,
35
+ "id": "d18b01df",
36
+ "metadata": {},
37
+ "outputs": [
38
+ {
39
+ "data": {
40
+ "text/html": [
41
+ "<div>\n",
42
+ "<style scoped>\n",
43
+ " .dataframe tbody tr th:only-of-type {\n",
44
+ " vertical-align: middle;\n",
45
+ " }\n",
46
+ "\n",
47
+ " .dataframe tbody tr th {\n",
48
+ " vertical-align: top;\n",
49
+ " }\n",
50
+ "\n",
51
+ " .dataframe thead th {\n",
52
+ " text-align: right;\n",
53
+ " }\n",
54
+ "</style>\n",
55
+ "<table border=\"1\" class=\"dataframe\">\n",
56
+ " <thead>\n",
57
+ " <tr style=\"text-align: right;\">\n",
58
+ " <th></th>\n",
59
+ " <th>Symbol</th>\n",
60
+ " <th>Name</th>\n",
61
+ " <th>Type</th>\n",
62
+ " <th>Description</th>\n",
63
+ " <th>Asset Class</th>\n",
64
+ " <th>FinanceDataReader</th>\n",
65
+ " <th>stooq.com</th>\n",
66
+ " </tr>\n",
67
+ " </thead>\n",
68
+ " <tbody>\n",
69
+ " <tr>\n",
70
+ " <th>0</th>\n",
71
+ " <td>^IXIC</td>\n",
72
+ " <td>NASDAQ Composite</td>\n",
73
+ " <td>Index</td>\n",
74
+ " <td>Tracks ~3,000 stocks listed on NASDAQ</td>\n",
75
+ " <td>Equity Index</td>\n",
76
+ " <td>True</td>\n",
77
+ " <td>False</td>\n",
78
+ " </tr>\n",
79
+ " <tr>\n",
80
+ " <th>1</th>\n",
81
+ " <td>^NDX</td>\n",
82
+ " <td>NASDAQ-100</td>\n",
83
+ " <td>Index</td>\n",
84
+ " <td>Tracks top 100 non-financial companies on NASDAQ</td>\n",
85
+ " <td>Equity Index</td>\n",
86
+ " <td>False</td>\n",
87
+ " <td>True</td>\n",
88
+ " </tr>\n",
89
+ " <tr>\n",
90
+ " <th>2</th>\n",
91
+ " <td>QQQ</td>\n",
92
+ " <td>Invesco QQQ Trust</td>\n",
93
+ " <td>ETF</td>\n",
94
+ " <td>ETF that tracks the NASDAQ-100 index</td>\n",
95
+ " <td>Equity ETF</td>\n",
96
+ " <td>True</td>\n",
97
+ " <td>False</td>\n",
98
+ " </tr>\n",
99
+ " <tr>\n",
100
+ " <th>3</th>\n",
101
+ " <td>ONEQ</td>\n",
102
+ " <td>Fidelity NASDAQ Composite Index ETF</td>\n",
103
+ " <td>ETF</td>\n",
104
+ " <td>ETF that tracks the NASDAQ Composite index</td>\n",
105
+ " <td>Equity ETF</td>\n",
106
+ " <td>True</td>\n",
107
+ " <td>False</td>\n",
108
+ " </tr>\n",
109
+ " <tr>\n",
110
+ " <th>4</th>\n",
111
+ " <td>QQQM</td>\n",
112
+ " <td>Invesco NASDAQ 100 ETF</td>\n",
113
+ " <td>ETF</td>\n",
114
+ " <td>Lower-cost version of QQQ, also tracks NASDAQ-100</td>\n",
115
+ " <td>Equity ETF</td>\n",
116
+ " <td>True</td>\n",
117
+ " <td>False</td>\n",
118
+ " </tr>\n",
119
+ " <tr>\n",
120
+ " <th>5</th>\n",
121
+ " <td>A35.SI</td>\n",
122
+ " <td>SGS Bonds</td>\n",
123
+ " <td>ETF</td>\n",
124
+ " <td>Nikko AM SGD Investment Grade Corporate Bond E...</td>\n",
125
+ " <td>Bond (Singapore)</td>\n",
126
+ " <td>True</td>\n",
127
+ " <td>False</td>\n",
128
+ " </tr>\n",
129
+ " <tr>\n",
130
+ " <th>6</th>\n",
131
+ " <td>TLT</td>\n",
132
+ " <td>US Treasury Bonds</td>\n",
133
+ " <td>ETF</td>\n",
134
+ " <td>iShares 20+ Year Treasury Bond ETF</td>\n",
135
+ " <td>Bond (US)</td>\n",
136
+ " <td>True</td>\n",
137
+ " <td>False</td>\n",
138
+ " </tr>\n",
139
+ " <tr>\n",
140
+ " <th>7</th>\n",
141
+ " <td>^GSPC</td>\n",
142
+ " <td>S&amp;P 500</td>\n",
143
+ " <td>Index</td>\n",
144
+ " <td>Tracks 500 largest U.S. companies</td>\n",
145
+ " <td>Equity Index</td>\n",
146
+ " <td>True</td>\n",
147
+ " <td>False</td>\n",
148
+ " </tr>\n",
149
+ " <tr>\n",
150
+ " <th>8</th>\n",
151
+ " <td>^DJI</td>\n",
152
+ " <td>Dow Jones</td>\n",
153
+ " <td>Index</td>\n",
154
+ " <td>Tracks 30 large U.S. companies, price-weighted</td>\n",
155
+ " <td>Equity Index</td>\n",
156
+ " <td>True</td>\n",
157
+ " <td>False</td>\n",
158
+ " </tr>\n",
159
+ " <tr>\n",
160
+ " <th>9</th>\n",
161
+ " <td>MSFT</td>\n",
162
+ " <td>Microsoft</td>\n",
163
+ " <td>Stock</td>\n",
164
+ " <td>U.S. tech giant, member of all major U.S. indexes</td>\n",
165
+ " <td>Equity</td>\n",
166
+ " <td>True</td>\n",
167
+ " <td>False</td>\n",
168
+ " </tr>\n",
169
+ " <tr>\n",
170
+ " <th>10</th>\n",
171
+ " <td>GOOGL</td>\n",
172
+ " <td>Google (Alphabet)</td>\n",
173
+ " <td>Stock</td>\n",
174
+ " <td>Class A shares of Alphabet Inc., parent compan...</td>\n",
175
+ " <td>Equity</td>\n",
176
+ " <td>True</td>\n",
177
+ " <td>False</td>\n",
178
+ " </tr>\n",
179
+ " <tr>\n",
180
+ " <th>11</th>\n",
181
+ " <td>NVDA</td>\n",
182
+ " <td>Nvidia</td>\n",
183
+ " <td>Stock</td>\n",
184
+ " <td>Leading GPU and AI chipmaker</td>\n",
185
+ " <td>Equity</td>\n",
186
+ " <td>True</td>\n",
187
+ " <td>False</td>\n",
188
+ " </tr>\n",
189
+ " <tr>\n",
190
+ " <th>12</th>\n",
191
+ " <td>AAPL</td>\n",
192
+ " <td>Apple</td>\n",
193
+ " <td>Stock</td>\n",
194
+ " <td>Largest U.S. company by market cap</td>\n",
195
+ " <td>Equity</td>\n",
196
+ " <td>True</td>\n",
197
+ " <td>False</td>\n",
198
+ " </tr>\n",
199
+ " <tr>\n",
200
+ " <th>13</th>\n",
201
+ " <td>AMZN</td>\n",
202
+ " <td>Amazon</td>\n",
203
+ " <td>Stock</td>\n",
204
+ " <td>E-commerce and cloud computing giant</td>\n",
205
+ " <td>Equity</td>\n",
206
+ " <td>True</td>\n",
207
+ " <td>False</td>\n",
208
+ " </tr>\n",
209
+ " <tr>\n",
210
+ " <th>14</th>\n",
211
+ " <td>TSLA</td>\n",
212
+ " <td>Tesla</td>\n",
213
+ " <td>Stock</td>\n",
214
+ " <td>Electric vehicle and energy company</td>\n",
215
+ " <td>Equity</td>\n",
216
+ " <td>True</td>\n",
217
+ " <td>False</td>\n",
218
+ " </tr>\n",
219
+ " <tr>\n",
220
+ " <th>15</th>\n",
221
+ " <td>NFLX</td>\n",
222
+ " <td>Netflix</td>\n",
223
+ " <td>Stock</td>\n",
224
+ " <td>Streaming and media company</td>\n",
225
+ " <td>Equity</td>\n",
226
+ " <td>True</td>\n",
227
+ " <td>False</td>\n",
228
+ " </tr>\n",
229
+ " <tr>\n",
230
+ " <th>16</th>\n",
231
+ " <td>META</td>\n",
232
+ " <td>Meta (Facebook)</td>\n",
233
+ " <td>Stock</td>\n",
234
+ " <td>Parent company of Facebook, Instagram, WhatsApp</td>\n",
235
+ " <td>Equity</td>\n",
236
+ " <td>True</td>\n",
237
+ " <td>False</td>\n",
238
+ " </tr>\n",
239
+ " <tr>\n",
240
+ " <th>17</th>\n",
241
+ " <td>BTC-USD</td>\n",
242
+ " <td>Bitcoin</td>\n",
243
+ " <td>Crypto</td>\n",
244
+ " <td>Decentralized digital currency</td>\n",
245
+ " <td>Cryptocurrency</td>\n",
246
+ " <td>True</td>\n",
247
+ " <td>False</td>\n",
248
+ " </tr>\n",
249
+ " <tr>\n",
250
+ " <th>18</th>\n",
251
+ " <td>ETH-USD</td>\n",
252
+ " <td>Ethereum</td>\n",
253
+ " <td>Crypto</td>\n",
254
+ " <td>Smart contract and decentralized app platform</td>\n",
255
+ " <td>Cryptocurrency</td>\n",
256
+ " <td>True</td>\n",
257
+ " <td>False</td>\n",
258
+ " </tr>\n",
259
+ " <tr>\n",
260
+ " <th>19</th>\n",
261
+ " <td>SOL-USD</td>\n",
262
+ " <td>Solana</td>\n",
263
+ " <td>Crypto</td>\n",
264
+ " <td>High-performance blockchain with low transacti...</td>\n",
265
+ " <td>Cryptocurrency</td>\n",
266
+ " <td>True</td>\n",
267
+ " <td>False</td>\n",
268
+ " </tr>\n",
269
+ " <tr>\n",
270
+ " <th>20</th>\n",
271
+ " <td>DOGE-USD</td>\n",
272
+ " <td>Dogecoin</td>\n",
273
+ " <td>Crypto</td>\n",
274
+ " <td>Meme-inspired coin that gained traction</td>\n",
275
+ " <td>Cryptocurrency</td>\n",
276
+ " <td>True</td>\n",
277
+ " <td>False</td>\n",
278
+ " </tr>\n",
279
+ " <tr>\n",
280
+ " <th>21</th>\n",
281
+ " <td>GLD</td>\n",
282
+ " <td>SPDR Gold Shares</td>\n",
283
+ " <td>ETF</td>\n",
284
+ " <td>Tracks the price of gold bullion, one of the l...</td>\n",
285
+ " <td>Commodity ETF</td>\n",
286
+ " <td>True</td>\n",
287
+ " <td>False</td>\n",
288
+ " </tr>\n",
289
+ " <tr>\n",
290
+ " <th>22</th>\n",
291
+ " <td>IAU</td>\n",
292
+ " <td>iShares Gold Trust</td>\n",
293
+ " <td>ETF</td>\n",
294
+ " <td>Low-cost ETF that tracks the price of gold, si...</td>\n",
295
+ " <td>Commodity ETF</td>\n",
296
+ " <td>True</td>\n",
297
+ " <td>False</td>\n",
298
+ " </tr>\n",
299
+ " <tr>\n",
300
+ " <th>23</th>\n",
301
+ " <td>SGOL</td>\n",
302
+ " <td>Aberdeen Standard Physical Gold Shares ETF</td>\n",
303
+ " <td>ETF</td>\n",
304
+ " <td>Physically-backed gold ETF with gold stored in...</td>\n",
305
+ " <td>Commodity ETF</td>\n",
306
+ " <td>True</td>\n",
307
+ " <td>False</td>\n",
308
+ " </tr>\n",
309
+ " <tr>\n",
310
+ " <th>24</th>\n",
311
+ " <td>PHYS</td>\n",
312
+ " <td>Sprott Physical Gold Trust</td>\n",
313
+ " <td>Trust</td>\n",
314
+ " <td>Closed-end trust that invests in physical gold...</td>\n",
315
+ " <td>Commodity Trust</td>\n",
316
+ " <td>True</td>\n",
317
+ " <td>False</td>\n",
318
+ " </tr>\n",
319
+ " </tbody>\n",
320
+ "</table>\n",
321
+ "</div>"
322
+ ],
323
+ "text/plain": [
324
+ " Symbol Name Type \\\n",
325
+ "0 ^IXIC NASDAQ Composite Index \n",
326
+ "1 ^NDX NASDAQ-100 Index \n",
327
+ "2 QQQ Invesco QQQ Trust ETF \n",
328
+ "3 ONEQ Fidelity NASDAQ Composite Index ETF ETF \n",
329
+ "4 QQQM Invesco NASDAQ 100 ETF ETF \n",
330
+ "5 A35.SI SGS Bonds ETF \n",
331
+ "6 TLT US Treasury Bonds ETF \n",
332
+ "7 ^GSPC S&P 500 Index \n",
333
+ "8 ^DJI Dow Jones Index \n",
334
+ "9 MSFT Microsoft Stock \n",
335
+ "10 GOOGL Google (Alphabet) Stock \n",
336
+ "11 NVDA Nvidia Stock \n",
337
+ "12 AAPL Apple Stock \n",
338
+ "13 AMZN Amazon Stock \n",
339
+ "14 TSLA Tesla Stock \n",
340
+ "15 NFLX Netflix Stock \n",
341
+ "16 META Meta (Facebook) Stock \n",
342
+ "17 BTC-USD Bitcoin Crypto \n",
343
+ "18 ETH-USD Ethereum Crypto \n",
344
+ "19 SOL-USD Solana Crypto \n",
345
+ "20 DOGE-USD Dogecoin Crypto \n",
346
+ "21 GLD SPDR Gold Shares ETF \n",
347
+ "22 IAU iShares Gold Trust ETF \n",
348
+ "23 SGOL Aberdeen Standard Physical Gold Shares ETF ETF \n",
349
+ "24 PHYS Sprott Physical Gold Trust Trust \n",
350
+ "\n",
351
+ " Description Asset Class \\\n",
352
+ "0 Tracks ~3,000 stocks listed on NASDAQ Equity Index \n",
353
+ "1 Tracks top 100 non-financial companies on NASDAQ Equity Index \n",
354
+ "2 ETF that tracks the NASDAQ-100 index Equity ETF \n",
355
+ "3 ETF that tracks the NASDAQ Composite index Equity ETF \n",
356
+ "4 Lower-cost version of QQQ, also tracks NASDAQ-100 Equity ETF \n",
357
+ "5 Nikko AM SGD Investment Grade Corporate Bond E... Bond (Singapore) \n",
358
+ "6 iShares 20+ Year Treasury Bond ETF Bond (US) \n",
359
+ "7 Tracks 500 largest U.S. companies Equity Index \n",
360
+ "8 Tracks 30 large U.S. companies, price-weighted Equity Index \n",
361
+ "9 U.S. tech giant, member of all major U.S. indexes Equity \n",
362
+ "10 Class A shares of Alphabet Inc., parent compan... Equity \n",
363
+ "11 Leading GPU and AI chipmaker Equity \n",
364
+ "12 Largest U.S. company by market cap Equity \n",
365
+ "13 E-commerce and cloud computing giant Equity \n",
366
+ "14 Electric vehicle and energy company Equity \n",
367
+ "15 Streaming and media company Equity \n",
368
+ "16 Parent company of Facebook, Instagram, WhatsApp Equity \n",
369
+ "17 Decentralized digital currency Cryptocurrency \n",
370
+ "18 Smart contract and decentralized app platform Cryptocurrency \n",
371
+ "19 High-performance blockchain with low transacti... Cryptocurrency \n",
372
+ "20 Meme-inspired coin that gained traction Cryptocurrency \n",
373
+ "21 Tracks the price of gold bullion, one of the l... Commodity ETF \n",
374
+ "22 Low-cost ETF that tracks the price of gold, si... Commodity ETF \n",
375
+ "23 Physically-backed gold ETF with gold stored in... Commodity ETF \n",
376
+ "24 Closed-end trust that invests in physical gold... Commodity Trust \n",
377
+ "\n",
378
+ " FinanceDataReader stooq.com \n",
379
+ "0 True False \n",
380
+ "1 False True \n",
381
+ "2 True False \n",
382
+ "3 True False \n",
383
+ "4 True False \n",
384
+ "5 True False \n",
385
+ "6 True False \n",
386
+ "7 True False \n",
387
+ "8 True False \n",
388
+ "9 True False \n",
389
+ "10 True False \n",
390
+ "11 True False \n",
391
+ "12 True False \n",
392
+ "13 True False \n",
393
+ "14 True False \n",
394
+ "15 True False \n",
395
+ "16 True False \n",
396
+ "17 True False \n",
397
+ "18 True False \n",
398
+ "19 True False \n",
399
+ "20 True False \n",
400
+ "21 True False \n",
401
+ "22 True False \n",
402
+ "23 True False \n",
403
+ "24 True False "
404
+ ]
405
+ },
406
+ "execution_count": 21,
407
+ "metadata": {},
408
+ "output_type": "execute_result"
409
+ }
410
+ ],
411
+ "source": [
412
+ "assets = [\n",
413
+ " [\n",
414
+ " \"^IXIC\",\n",
415
+ " \"NASDAQ Composite\",\n",
416
+ " \"Index\",\n",
417
+ " \"Tracks ~3,000 stocks listed on NASDAQ\",\n",
418
+ " \"Equity Index\",\n",
419
+ " True,\n",
420
+ " False,\n",
421
+ " ],\n",
422
+ " [\n",
423
+ " \"^NDX\",\n",
424
+ " \"NASDAQ-100\",\n",
425
+ " \"Index\",\n",
426
+ " \"Tracks top 100 non-financial companies on NASDAQ\",\n",
427
+ " \"Equity Index\",\n",
428
+ " False, # Only available from 2020-02-11\n",
429
+ " True,\n",
430
+ " ],\n",
431
+ " [\n",
432
+ " \"QQQ\",\n",
433
+ " \"Invesco QQQ Trust\",\n",
434
+ " \"ETF\",\n",
435
+ " \"ETF that tracks the NASDAQ-100 index\",\n",
436
+ " \"Equity ETF\",\n",
437
+ " True,\n",
438
+ " False,\n",
439
+ " ],\n",
440
+ " [\n",
441
+ " \"ONEQ\",\n",
442
+ " \"Fidelity NASDAQ Composite Index ETF\",\n",
443
+ " \"ETF\",\n",
444
+ " \"ETF that tracks the NASDAQ Composite index\",\n",
445
+ " \"Equity ETF\",\n",
446
+ " True,\n",
447
+ " False,\n",
448
+ " ],\n",
449
+ " [\n",
450
+ " \"QQQM\",\n",
451
+ " \"Invesco NASDAQ 100 ETF\",\n",
452
+ " \"ETF\",\n",
453
+ " \"Lower-cost version of QQQ, also tracks NASDAQ-100\",\n",
454
+ " \"Equity ETF\",\n",
455
+ " True,\n",
456
+ " False,\n",
457
+ " ],\n",
458
+ " [\n",
459
+ " \"A35.SI\",\n",
460
+ " \"SGS Bonds\",\n",
461
+ " \"ETF\",\n",
462
+ " \"Nikko AM SGD Investment Grade Corporate Bond ETF traded on SGX\",\n",
463
+ " \"Bond (Singapore)\",\n",
464
+ " True,\n",
465
+ " False,\n",
466
+ " ],\n",
467
+ " [\n",
468
+ " \"TLT\",\n",
469
+ " \"US Treasury Bonds\",\n",
470
+ " \"ETF\",\n",
471
+ " \"iShares 20+ Year Treasury Bond ETF\",\n",
472
+ " \"Bond (US)\",\n",
473
+ " True,\n",
474
+ " False,\n",
475
+ " ],\n",
476
+ " [\n",
477
+ " \"^GSPC\",\n",
478
+ " \"S&P 500\",\n",
479
+ " \"Index\",\n",
480
+ " \"Tracks 500 largest U.S. companies\",\n",
481
+ " \"Equity Index\",\n",
482
+ " True,\n",
483
+ " False,\n",
484
+ " ],\n",
485
+ " [\n",
486
+ " \"^DJI\",\n",
487
+ " \"Dow Jones\",\n",
488
+ " \"Index\",\n",
489
+ " \"Tracks 30 large U.S. companies, price-weighted\",\n",
490
+ " \"Equity Index\",\n",
491
+ " True,\n",
492
+ " False,\n",
493
+ " ],\n",
494
+ " [\n",
495
+ " \"MSFT\",\n",
496
+ " \"Microsoft\",\n",
497
+ " \"Stock\",\n",
498
+ " \"U.S. tech giant, member of all major U.S. indexes\",\n",
499
+ " \"Equity\",\n",
500
+ " True,\n",
501
+ " False,\n",
502
+ " ],\n",
503
+ " [\n",
504
+ " \"GOOGL\",\n",
505
+ " \"Google (Alphabet)\",\n",
506
+ " \"Stock\",\n",
507
+ " \"Class A shares of Alphabet Inc., parent company of Google\",\n",
508
+ " \"Equity\",\n",
509
+ " True,\n",
510
+ " False,\n",
511
+ " ],\n",
512
+ " [\n",
513
+ " \"NVDA\",\n",
514
+ " \"Nvidia\",\n",
515
+ " \"Stock\",\n",
516
+ " \"Leading GPU and AI chipmaker\",\n",
517
+ " \"Equity\",\n",
518
+ " True,\n",
519
+ " False,\n",
520
+ " ],\n",
521
+ " [\n",
522
+ " \"AAPL\",\n",
523
+ " \"Apple\",\n",
524
+ " \"Stock\",\n",
525
+ " \"Largest U.S. company by market cap\",\n",
526
+ " \"Equity\",\n",
527
+ " True,\n",
528
+ " False,\n",
529
+ " ],\n",
530
+ " [\n",
531
+ " \"AMZN\",\n",
532
+ " \"Amazon\",\n",
533
+ " \"Stock\",\n",
534
+ " \"E-commerce and cloud computing giant\",\n",
535
+ " \"Equity\",\n",
536
+ " True,\n",
537
+ " False,\n",
538
+ " ],\n",
539
+ " [\n",
540
+ " \"TSLA\",\n",
541
+ " \"Tesla\",\n",
542
+ " \"Stock\",\n",
543
+ " \"Electric vehicle and energy company\",\n",
544
+ " \"Equity\",\n",
545
+ " True,\n",
546
+ " False,\n",
547
+ " ],\n",
548
+ " [\n",
549
+ " \"NFLX\",\n",
550
+ " \"Netflix\",\n",
551
+ " \"Stock\",\n",
552
+ " \"Streaming and media company\",\n",
553
+ " \"Equity\",\n",
554
+ " True,\n",
555
+ " False,\n",
556
+ " ],\n",
557
+ " [\n",
558
+ " \"META\",\n",
559
+ " \"Meta (Facebook)\",\n",
560
+ " \"Stock\",\n",
561
+ " \"Parent company of Facebook, Instagram, WhatsApp\",\n",
562
+ " \"Equity\",\n",
563
+ " True,\n",
564
+ " False,\n",
565
+ " ],\n",
566
+ " [\n",
567
+ " \"BTC-USD\",\n",
568
+ " \"Bitcoin\",\n",
569
+ " \"Crypto\",\n",
570
+ " \"Decentralized digital currency\",\n",
571
+ " \"Cryptocurrency\",\n",
572
+ " True,\n",
573
+ " False,\n",
574
+ " ],\n",
575
+ " [\n",
576
+ " \"ETH-USD\",\n",
577
+ " \"Ethereum\",\n",
578
+ " \"Crypto\",\n",
579
+ " \"Smart contract and decentralized app platform\",\n",
580
+ " \"Cryptocurrency\",\n",
581
+ " True,\n",
582
+ " False,\n",
583
+ " ],\n",
584
+ " [\n",
585
+ " \"SOL-USD\",\n",
586
+ " \"Solana\",\n",
587
+ " \"Crypto\",\n",
588
+ " \"High-performance blockchain with low transaction fees\",\n",
589
+ " \"Cryptocurrency\",\n",
590
+ " True,\n",
591
+ " False,\n",
592
+ " ],\n",
593
+ " [\n",
594
+ " \"DOGE-USD\",\n",
595
+ " \"Dogecoin\",\n",
596
+ " \"Crypto\",\n",
597
+ " \"Meme-inspired coin that gained traction\",\n",
598
+ " \"Cryptocurrency\",\n",
599
+ " True,\n",
600
+ " False,\n",
601
+ " ],\n",
602
+ " # [\n",
603
+ " # \"GOLDAMGBD228NLBM\",\n",
604
+ " # \"LBMA Gold Price (USD)\",\n",
605
+ " # \"Index\",\n",
606
+ " # \"Daily gold price per troy ounce in USD from the London Bullion Market (FRED)\",\n",
607
+ " # \"Commodity Index\",\n",
608
+ " # True,\n",
609
+ " # False,\n",
610
+ " # ],\n",
611
+ " [\n",
612
+ " \"GLD\",\n",
613
+ " \"SPDR Gold Shares\",\n",
614
+ " \"ETF\",\n",
615
+ " \"Tracks the price of gold bullion, one of the largest and most traded gold ETFs\",\n",
616
+ " \"Commodity ETF\",\n",
617
+ " True,\n",
618
+ " False,\n",
619
+ " ],\n",
620
+ " [\n",
621
+ " \"IAU\",\n",
622
+ " \"iShares Gold Trust\",\n",
623
+ " \"ETF\",\n",
624
+ " \"Low-cost ETF that tracks the price of gold, similar to GLD\",\n",
625
+ " \"Commodity ETF\",\n",
626
+ " True,\n",
627
+ " False,\n",
628
+ " ],\n",
629
+ " [\n",
630
+ " \"SGOL\",\n",
631
+ " \"Aberdeen Standard Physical Gold Shares ETF\",\n",
632
+ " \"ETF\",\n",
633
+ " \"Physically-backed gold ETF with gold stored in Switzerland\",\n",
634
+ " \"Commodity ETF\",\n",
635
+ " True,\n",
636
+ " False,\n",
637
+ " ],\n",
638
+ " [\n",
639
+ " \"PHYS\",\n",
640
+ " \"Sprott Physical Gold Trust\",\n",
641
+ " \"Trust\",\n",
642
+ " \"Closed-end trust that invests in physical gold bullion\",\n",
643
+ " \"Commodity Trust\",\n",
644
+ " True,\n",
645
+ " False,\n",
646
+ " ],\n",
647
+ "]\n",
648
+ "columns = [\n",
649
+ " \"Symbol\",\n",
650
+ " \"Name\",\n",
651
+ " \"Type\",\n",
652
+ " \"Description\",\n",
653
+ " \"Asset Class\",\n",
654
+ " \"FinanceDataReader\",\n",
655
+ " \"stooq.com\",\n",
656
+ "]\n",
657
+ "assets_pdf = pd.DataFrame(assets, columns=columns)\n",
658
+ "assets_pdf"
659
+ ]
660
+ },
661
+ {
662
+ "cell_type": "markdown",
663
+ "id": "044e8d84",
664
+ "metadata": {},
665
+ "source": [
666
+ "# Config"
667
+ ]
668
+ },
669
+ {
670
+ "cell_type": "code",
671
+ "execution_count": 22,
672
+ "id": "82117da5",
673
+ "metadata": {},
674
+ "outputs": [
675
+ {
676
+ "data": {
677
+ "text/plain": [
678
+ "Symbol TLT\n",
679
+ "Name US Treasury Bonds\n",
680
+ "Type ETF\n",
681
+ "Description iShares 20+ Year Treasury Bond ETF\n",
682
+ "Asset Class Bond (US)\n",
683
+ "FinanceDataReader True\n",
684
+ "stooq.com False\n",
685
+ "Name: 6, dtype: object"
686
+ ]
687
+ },
688
+ "execution_count": 22,
689
+ "metadata": {},
690
+ "output_type": "execute_result"
691
+ }
692
+ ],
693
+ "source": [
694
+ "class Config:\n",
695
+ " folder = \"stock_data/\"\n",
696
+ " write = True # Options: True, False\n",
697
+ " overwrite = False # Options: True, False\n",
698
+ "\n",
699
+ "\n",
700
+ "Config.overwrite\n",
701
+ "\n",
702
+ "assets_pds = assets_pdf.iloc[6]\n",
703
+ "assets_pds"
704
+ ]
705
+ },
706
+ {
707
+ "cell_type": "markdown",
708
+ "id": "57196de0",
709
+ "metadata": {},
710
+ "source": [
711
+ "# Download the historical data"
712
+ ]
713
+ },
714
+ {
715
+ "cell_type": "code",
716
+ "execution_count": 23,
717
+ "id": "eae73901",
718
+ "metadata": {},
719
+ "outputs": [
720
+ {
721
+ "name": "stdout",
722
+ "output_type": "stream",
723
+ "text": [
724
+ "----------------------------------------\n",
725
+ "Downloading ^IXIC data...\n",
726
+ "'stock_data/^IXIC' data already exists. So, not downloading.\n",
727
+ "----------------------------------------\n",
728
+ "Downloading ^NDX data...\n",
729
+ "'stock_data/^NDX' data already exists. So, not downloading.\n",
730
+ "----------------------------------------\n",
731
+ "Downloading QQQ data...\n",
732
+ "'stock_data/QQQ' data already exists. So, not downloading.\n",
733
+ "----------------------------------------\n",
734
+ "Downloading ONEQ data...\n",
735
+ "'stock_data/ONEQ' data already exists. So, not downloading.\n",
736
+ "----------------------------------------\n",
737
+ "Downloading QQQM data...\n",
738
+ "'stock_data/QQQM' data already exists. So, not downloading.\n",
739
+ "----------------------------------------\n",
740
+ "Downloading A35.SI data...\n",
741
+ "'stock_data/A35.SI' data already exists. So, not downloading.\n",
742
+ "----------------------------------------\n",
743
+ "Downloading TLT data...\n",
744
+ "'stock_data/TLT' data already exists. So, not downloading.\n",
745
+ "----------------------------------------\n",
746
+ "Downloading ^GSPC data...\n",
747
+ "'stock_data/^GSPC' data already exists. So, not downloading.\n",
748
+ "----------------------------------------\n",
749
+ "Downloading ^DJI data...\n",
750
+ "'stock_data/^DJI' data already exists. So, not downloading.\n",
751
+ "----------------------------------------\n",
752
+ "Downloading MSFT data...\n",
753
+ "'stock_data/MSFT' data already exists. So, not downloading.\n",
754
+ "----------------------------------------\n",
755
+ "Downloading GOOGL data...\n",
756
+ "'stock_data/GOOGL' data already exists. So, not downloading.\n",
757
+ "----------------------------------------\n",
758
+ "Downloading NVDA data...\n",
759
+ "'stock_data/NVDA' data already exists. So, not downloading.\n",
760
+ "----------------------------------------\n",
761
+ "Downloading AAPL data...\n",
762
+ "'stock_data/AAPL' data already exists. So, not downloading.\n",
763
+ "----------------------------------------\n",
764
+ "Downloading AMZN data...\n",
765
+ "'stock_data/AMZN' data already exists. So, not downloading.\n",
766
+ "----------------------------------------\n",
767
+ "Downloading TSLA data...\n",
768
+ "'stock_data/TSLA' data already exists. So, not downloading.\n",
769
+ "----------------------------------------\n",
770
+ "Downloading NFLX data...\n",
771
+ "'stock_data/NFLX' data already exists. So, not downloading.\n",
772
+ "----------------------------------------\n",
773
+ "Downloading META data...\n",
774
+ "'stock_data/META' data already exists. So, not downloading.\n",
775
+ "----------------------------------------\n",
776
+ "Downloading BTC-USD data...\n",
777
+ "'stock_data/BTC-USD' data already exists. So, not downloading.\n",
778
+ "----------------------------------------\n",
779
+ "Downloading ETH-USD data...\n",
780
+ "'stock_data/ETH-USD' data already exists. So, not downloading.\n",
781
+ "----------------------------------------\n",
782
+ "Downloading SOL-USD data...\n",
783
+ "'stock_data/SOL-USD' data already exists. So, not downloading.\n",
784
+ "----------------------------------------\n",
785
+ "Downloading DOGE-USD data...\n",
786
+ "'stock_data/DOGE-USD' data already exists. So, not downloading.\n",
787
+ "----------------------------------------\n",
788
+ "Downloading GLD data...\n",
789
+ "Downloading data from FinanceDataReader...\n",
790
+ "Downloaded 'GLD' data from FinanceDataReader\n",
791
+ "2004-11-18 00:00:00 to 2025-05-09 00:00:00\n",
792
+ "----------------------------------------\n",
793
+ "Downloading IAU data...\n",
794
+ "Downloading data from FinanceDataReader...\n",
795
+ "Downloaded 'IAU' data from FinanceDataReader\n",
796
+ "2005-01-28 00:00:00 to 2025-05-09 00:00:00\n",
797
+ "----------------------------------------\n",
798
+ "Downloading SGOL data...\n",
799
+ "Downloading data from FinanceDataReader...\n",
800
+ "Downloaded 'SGOL' data from FinanceDataReader\n",
801
+ "2009-09-09 00:00:00 to 2025-05-09 00:00:00\n",
802
+ "----------------------------------------\n",
803
+ "Downloading PHYS data...\n",
804
+ "Downloading data from FinanceDataReader...\n",
805
+ "Downloaded 'PHYS' data from FinanceDataReader\n",
806
+ "2010-02-26 00:00:00 to 2025-05-09 00:00:00\n"
807
+ ]
808
+ }
809
+ ],
810
+ "source": [
811
+ "folder = Config.folder\n",
812
+ "# Create the folder if it doesn't exist\n",
813
+ "if not os.path.exists(folder):\n",
814
+ " os.makedirs(folder)\n",
815
+ " print(f\"Created folder: {folder}\")\n",
816
+ " \n",
817
+ "for i in range(len(assets)):\n",
818
+ " print (\"-\"*40)\n",
819
+ " assets_pds = assets_pdf.iloc[i]\n",
820
+ "\n",
821
+ " symbol = assets_pds[\"Symbol\"]\n",
822
+ " print(f\"Downloading {symbol} data...\")\n",
823
+ " data = None\n",
824
+ "\n",
825
+ " file_exists = os.path.exists(f\"{folder}{symbol}.csv\")\n",
826
+ " # If the file exists and overwrite is False, print a message and exit\n",
827
+ " if file_exists and not Config.overwrite:\n",
828
+ " # Print a message indicating that the file already exists\n",
829
+ " # and that the user should set overwrite to True to overwrite it\n",
830
+ " # or delete the existing file\n",
831
+ " print(f\"'{folder}{symbol}' data already exists. So, not downloading.\")\n",
832
+ " else:\n",
833
+ " if assets_pds[\"FinanceDataReader\"]:\n",
834
+ " print(\"Downloading data from FinanceDataReader...\")\n",
835
+ " data = fdr.DataReader(symbol, start=\"1990\")\n",
836
+ " data = data.reset_index().rename(columns={\"index\": \"Date\"})\n",
837
+ " data.drop(columns=[\"Volume\", \"Adj Close\"], inplace=True)\n",
838
+ " data.sort_values(by=\"Date\", ascending=True, inplace=True)\n",
839
+ " if Config.write:\n",
840
+ " data.to_csv(f\"{folder}{symbol}.csv\", index=False)\n",
841
+ " if Config.overwrite:\n",
842
+ " print(f\"Downloaded '{symbol}' data from FinanceDataReader and Overwritten\")\n",
843
+ " else:\n",
844
+ " print(f\"Downloaded '{symbol}' data from FinanceDataReader\")\n",
845
+ " print (f\"{data[\"Date\"].min()} to {data[\"Date\"].max()}\")\n",
846
+ " elif assets_pds[\"stooq.com\"]:\n",
847
+ " print(\"Downloading data from stooq.com...\")\n",
848
+ " url = f\"https://stooq.com/q/d/l/?s={symbol}&i=d\"\n",
849
+ " data = pd.read_csv(url)\n",
850
+ " if len(data) == 0:\n",
851
+ " print(f\"No data found for {symbol} on stooq.com\")\n",
852
+ " else:\n",
853
+ " data.drop(columns=[\"Volume\"], inplace=True)\n",
854
+ " if Config.write:\n",
855
+ " data.to_csv(f\"{folder}{symbol}.csv\", index=False)\n",
856
+ " if Config.overwrite:\n",
857
+ " print(f\"Downloaded '{symbol}' data from stooq.com and Overwritten\")\n",
858
+ " else:\n",
859
+ " print(f\"Downloaded '{symbol}' data from stooq.com\")\n",
860
+ " print (f\"{data[\"Date\"].min()} to {data[\"Date\"].max()}\")\n",
861
+ " else:\n",
862
+ " msg = f\"'{symbol}' data source not specified.\"\n",
863
+ " raise ValueError(msg)"
864
+ ]
865
+ },
866
+ {
867
+ "cell_type": "code",
868
+ "execution_count": 11,
869
+ "id": "9d0b8f59",
870
+ "metadata": {},
871
+ "outputs": [
872
+ {
873
+ "data": {
874
+ "text/html": [
875
+ "<div>\n",
876
+ "<style scoped>\n",
877
+ " .dataframe tbody tr th:only-of-type {\n",
878
+ " vertical-align: middle;\n",
879
+ " }\n",
880
+ "\n",
881
+ " .dataframe tbody tr th {\n",
882
+ " vertical-align: top;\n",
883
+ " }\n",
884
+ "\n",
885
+ " .dataframe thead th {\n",
886
+ " text-align: right;\n",
887
+ " }\n",
888
+ "</style>\n",
889
+ "<table border=\"1\" class=\"dataframe\">\n",
890
+ " <thead>\n",
891
+ " <tr style=\"text-align: right;\">\n",
892
+ " <th></th>\n",
893
+ " <th>Date</th>\n",
894
+ " <th>Open</th>\n",
895
+ " <th>High</th>\n",
896
+ " <th>Low</th>\n",
897
+ " <th>Close</th>\n",
898
+ " </tr>\n",
899
+ " </thead>\n",
900
+ " <tbody>\n",
901
+ " <tr>\n",
902
+ " <th>0</th>\n",
903
+ " <td>1990-01-02</td>\n",
904
+ " <td>0.605903</td>\n",
905
+ " <td>0.616319</td>\n",
906
+ " <td>0.598090</td>\n",
907
+ " <td>0.616319</td>\n",
908
+ " </tr>\n",
909
+ " <tr>\n",
910
+ " <th>1</th>\n",
911
+ " <td>1990-01-03</td>\n",
912
+ " <td>0.621528</td>\n",
913
+ " <td>0.626736</td>\n",
914
+ " <td>0.614583</td>\n",
915
+ " <td>0.619792</td>\n",
916
+ " </tr>\n",
917
+ " </tbody>\n",
918
+ "</table>\n",
919
+ "</div>"
920
+ ],
921
+ "text/plain": [
922
+ " Date Open High Low Close\n",
923
+ "0 1990-01-02 0.605903 0.616319 0.598090 0.616319\n",
924
+ "1 1990-01-03 0.621528 0.626736 0.614583 0.619792"
925
+ ]
926
+ },
927
+ "execution_count": 11,
928
+ "metadata": {},
929
+ "output_type": "execute_result"
930
+ }
931
+ ],
932
+ "source": [
933
+ "def fetch_stock_daily(symbol, start_date, end_date):\n",
934
+ " try:\n",
935
+ " data = pd.read_csv(f\"{folder}{symbol}.csv\", parse_dates=[\"Date\"])\n",
936
+ " # data = data[(data[\"Date\"] >= start_date) & (data[\"Date\"] <= end_date)]\n",
937
+ " # data.set_index(\"Date\", inplace=True)\n",
938
+ " # data = data[\"Close\"]\n",
939
+ " return data\n",
940
+ " except FileNotFoundError:\n",
941
+ " print(f\"File {folder}{symbol}.csv not found.\")\n",
942
+ " return None\n",
943
+ "\n",
944
+ "\n",
945
+ "data = fetch_stock_daily(\"MSFT\", \"2020-01-01\", \"2023-10-01\")\n",
946
+ "data.head(2)"
947
+ ]
948
+ },
949
+ {
950
+ "cell_type": "code",
951
+ "execution_count": 14,
952
+ "id": "5879114d",
953
+ "metadata": {},
954
+ "outputs": [
955
+ {
956
+ "data": {
957
+ "text/plain": [
958
+ "0 False\n",
959
+ "1 False\n",
960
+ "2 False\n",
961
+ "3 False\n",
962
+ "4 False\n",
963
+ " ... \n",
964
+ "8900 False\n",
965
+ "8901 False\n",
966
+ "8902 False\n",
967
+ "8903 False\n",
968
+ "8904 False\n",
969
+ "Name: Date, Length: 8905, dtype: bool"
970
+ ]
971
+ },
972
+ "execution_count": 14,
973
+ "metadata": {},
974
+ "output_type": "execute_result"
975
+ }
976
+ ],
977
+ "source": [
978
+ "(data[\"Date\"] >= \"2020-05-18\") & (data[\"Date\"] <= \"2020-05-20\")"
979
+ ]
980
+ },
981
+ {
982
+ "cell_type": "code",
983
+ "execution_count": 24,
984
+ "id": "306156fb",
985
+ "metadata": {},
986
+ "outputs": [
987
+ {
988
+ "data": {
989
+ "text/plain": [
990
+ "2.8999078128548517"
991
+ ]
992
+ },
993
+ "execution_count": 24,
994
+ "metadata": {},
995
+ "output_type": "execute_result"
996
+ }
997
+ ],
998
+ "source": [
999
+ "# TEMP DELETE\n",
1000
+ "((20435 / 10000) ** (1 / 25) - 1) * 100"
1001
+ ]
1002
+ }
1003
+ ],
1004
+ "metadata": {
1005
+ "kernelspec": {
1006
+ "display_name": "return-on-investment",
1007
+ "language": "python",
1008
+ "name": "python3"
1009
+ },
1010
+ "language_info": {
1011
+ "codemirror_mode": {
1012
+ "name": "ipython",
1013
+ "version": 3
1014
+ },
1015
+ "file_extension": ".py",
1016
+ "mimetype": "text/x-python",
1017
+ "name": "python",
1018
+ "nbconvert_exporter": "python",
1019
+ "pygments_lexer": "ipython3",
1020
+ "version": "3.12.9"
1021
+ }
1022
+ },
1023
+ "nbformat": 4,
1024
+ "nbformat_minor": 5
1025
+ }
notebooks/scratchpad.ipynb CHANGED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/A35.SI.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/AAPL.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/AMZN.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/BTC-USD.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/DOGE-USD.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/ETH-USD.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/GLD.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/GOOGL.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/IAU.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/META.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/MSFT.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/NFLX.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/NVDA.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/ONEQ.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/PHYS.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/QQQ.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/QQQM.csv ADDED
@@ -0,0 +1,1150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Date,Open,High,Low,Close
2
+ 2020-10-13,121.08000183105469,121.97000122070312,120.55999755859375,121.05000305175781
3
+ 2020-10-14,121.33000183105469,121.71900177001953,119.36900329589844,119.97000122070312
4
+ 2020-10-15,118.02999877929688,119.27999877929688,117.78900146484375,119.10700225830078
5
+ 2020-10-16,119.9000015258789,120.41000366210938,118.5,118.5
6
+ 2020-10-19,119.83000183105469,119.83000183105469,116.23500061035156,116.44999694824219
7
+ 2020-10-20,116.91000366210938,118.08599853515625,116.29000091552734,116.88999938964844
8
+ 2020-10-21,116.94999694824219,118.0,116.66999816894531,117.04000091552734
9
+ 2020-10-22,117.11000061035156,117.3489990234375,115.45999908447266,116.72000122070312
10
+ 2020-10-23,116.98999786376953,117.0,115.80999755859375,117.0
11
+ 2020-10-26,116.01000213623047,116.9800033569336,113.8489990234375,115.18000030517578
12
+ 2020-10-27,115.62000274658203,116.44999694824219,115.13999938964844,116.08999633789062
13
+ 2020-10-28,114.27999877929688,114.27999877929688,111.5,111.69000244140625
14
+ 2020-10-29,112.16000366210938,114.66899871826172,112.0009994506836,113.51000213623047
15
+ 2020-10-30,112.69999694824219,113.01000213623047,109.69000244140625,110.86000061035156
16
+ 2020-11-02,111.6500015258789,112.23999786376953,109.69999694824219,110.9000015258789
17
+ 2020-11-03,111.70999908447266,113.62999725341797,111.30999755859375,113.43099975585938
18
+ 2020-11-04,116.44999694824219,118.552001953125,115.97000122070312,117.79000091552734
19
+ 2020-11-05,120.51000213623047,121.29900360107422,120.0199966430664,120.91999816894531
20
+ 2020-11-06,120.62999725341797,121.22000122070312,119.07499694824219,121.0
21
+ 2020-11-09,122.20999908447266,122.70999908447266,118.5,118.5
22
+ 2020-11-10,117.1500015258789,117.68000030517578,115.35099792480469,116.31700134277344
23
+ 2020-11-11,117.47000122070312,119.19999694824219,117.47000122070312,119.11000061035156
24
+ 2020-11-12,119.4800033569336,119.94000244140625,118.0,118.41999816894531
25
+ 2020-11-13,119.19000244140625,119.61799621582031,118.3030014038086,119.55000305175781
26
+ 2020-11-16,119.45999908447266,120.49099731445312,119.02999877929688,120.06999969482422
27
+ 2020-11-17,120.55999755859375,120.62999725341797,119.86000061035156,120.05999755859375
28
+ 2020-11-18,119.86000061035156,120.47000122070312,119.40799713134766,119.5479965209961
29
+ 2020-11-19,118.97000122070312,120.12999725341797,118.80999755859375,120.12999725341797
30
+ 2020-11-20,120.06999969482422,120.29900360107422,119.38999938964844,119.38999938964844
31
+ 2020-11-23,119.7699966430664,120.16999816894531,118.36000061035156,119.30000305175781
32
+ 2020-11-24,119.80000305175781,121.11000061035156,119.07499694824219,121.04000091552734
33
+ 2020-11-25,121.38999938964844,121.9489974975586,121.19200134277344,121.71900177001953
34
+ 2020-11-27,122.55000305175781,123.30000305175781,122.4219970703125,122.75
35
+ 2020-11-30,122.97000122070312,123.16000366210938,121.13999938964844,123.01000213623047
36
+ 2020-12-01,124.06999969482422,125.31999969482422,123.67900085449219,124.72000122070312
37
+ 2020-12-02,124.16000366210938,124.91999816894531,123.44000244140625,124.83999633789062
38
+ 2020-12-03,124.94999694824219,125.61299896240234,124.73999786376953,125.0199966430664
39
+ 2020-12-04,125.05000305175781,125.52999877929688,124.77999877929688,125.44999694824219
40
+ 2020-12-07,125.62000274658203,126.3290023803711,125.4800033569336,125.83000183105469
41
+ 2020-12-08,126.0199966430664,126.72000122070312,125.30899810791016,126.6050033569336
42
+ 2020-12-09,126.58999633789062,126.62000274658203,123.36900329589844,123.8499984741211
43
+ 2020-12-10,122.94999694824219,124.66999816894531,122.44100189208984,124.26000213623047
44
+ 2020-12-11,123.55000305175781,124.0199966430664,122.61000061035156,123.97000122070312
45
+ 2020-12-14,124.54000091552734,125.69999694824219,124.54000091552734,124.88999938964844
46
+ 2020-12-15,125.88999938964844,126.2300033569336,125.0,126.2300033569336
47
+ 2020-12-16,126.44000244140625,127.23999786376953,125.9800033569336,126.91000366210938
48
+ 2020-12-17,127.62000274658203,127.78700256347656,127.0999984741211,127.76000213623047
49
+ 2020-12-18,128.11000061035156,128.11000061035156,126.37000274658203,127.43000030517578
50
+ 2020-12-21,126.12000274658203,127.06999969482422,124.79000091552734,126.88999938964844
51
+ 2020-12-22,127.25,127.66000366210938,126.29000091552734,127.23999786376953
52
+ 2020-12-23,127.5,127.5,126.61000061035156,126.66000366210938
53
+ 2020-12-24,126.95999908447266,127.37000274658203,126.76899719238281,127.19000244140625
54
+ 2020-12-28,128.42999267578125,128.65899658203125,127.56999969482422,128.47999572753906
55
+ 2020-12-29,129.0800018310547,129.2899932861328,128.25399780273438,128.6300048828125
56
+ 2020-12-30,129.36000061035156,129.36000061035156,128.33999633789062,128.52999877929688
57
+ 2020-12-31,128.77999877929688,129.0030059814453,128.19500732421875,128.91000366210938
58
+ 2021-01-04,129.60000610351562,129.60000610351562,125.44999694824219,127.08000183105469
59
+ 2021-01-05,126.76000213623047,128.1699981689453,126.76000213623047,128.09500122070312
60
+ 2021-01-06,126.37000274658203,128.0800018310547,125.76000213623047,126.33000183105469
61
+ 2021-01-07,127.58000183105469,129.73399353027344,127.58000183105469,129.4600067138672
62
+ 2021-01-08,130.52000427246094,131.1999969482422,129.5,131.13999938964844
63
+ 2021-01-11,129.99000549316406,130.30999755859375,128.96200561523438,129.17999267578125
64
+ 2021-01-12,129.2899932861328,129.6300048828125,127.94999694824219,129.13999938964844
65
+ 2021-01-13,129.0,130.14999389648438,128.9199981689453,129.83999633789062
66
+ 2021-01-14,130.27000427246094,130.41600036621094,129.0,129.13999938964844
67
+ 2021-01-15,128.8300018310547,129.5,127.70999908447266,128.10000610351562
68
+ 2021-01-19,129.1999969482422,130.17999267578125,128.7969970703125,130.02999877929688
69
+ 2021-01-20,131.69000244140625,133.41000366210938,131.4499969482422,133.07000732421875
70
+ 2021-01-21,133.6999969482422,134.3719940185547,133.0500030517578,134.14999389648438
71
+ 2021-01-22,133.61000061035156,134.1300048828125,133.49000549316406,133.77999877929688
72
+ 2021-01-25,135.30999755859375,135.67999267578125,132.25,134.6300048828125
73
+ 2021-01-26,135.25999450683594,135.36199951171875,134.47000122070312,135.0399932861328
74
+ 2021-01-27,134.24000549316406,134.24000549316406,130.5,131.4499969482422
75
+ 2021-01-28,131.91000366210938,134.05999755859375,131.6179962158203,132.0800018310547
76
+ 2021-01-29,131.50999450683594,131.64999389648438,128.58999633789062,129.3699951171875
77
+ 2021-02-01,130.91000366210938,132.8800048828125,129.97000122070312,132.5399932861328
78
+ 2021-02-02,133.82000732421875,135.0399932861328,133.75,134.71499633789062
79
+ 2021-02-03,135.6999969482422,135.6999969482422,134.22000122070312,134.22000122070312
80
+ 2021-02-04,134.8699951171875,135.6699981689453,134.1699981689453,135.64999389648438
81
+ 2021-02-05,136.25999450683594,136.5749969482422,135.47999572753906,136.19000244140625
82
+ 2021-02-08,137.0,137.11900329589844,136.1999969482422,137.0399932861328
83
+ 2021-02-09,136.83999633789062,137.55999755859375,136.83999633789062,137.00999450683594
84
+ 2021-02-10,137.64999389648438,137.72000122070312,135.5,136.6699981689453
85
+ 2021-02-11,137.57000732421875,137.63999938964844,136.5,137.43899536132812
86
+ 2021-02-12,137.02999877929688,138.2899932861328,136.75,138.2899932861328
87
+ 2021-02-16,138.74000549316406,138.92999267578125,137.43800354003906,137.91000366210938
88
+ 2021-02-17,136.77000427246094,137.25999450683594,135.6999969482422,137.22999572753906
89
+ 2021-02-18,135.8300018310547,136.89999389648438,134.9969940185547,136.64999389648438
90
+ 2021-02-19,137.33999633789062,137.33999633789062,135.6999969482422,135.9600067138672
91
+ 2021-02-22,134.2899932861328,134.61000061035156,132.47999572753906,132.5500030517578
92
+ 2021-02-23,130.36000061035156,132.75999450683594,127.88500213623047,132.16000366210938
93
+ 2021-02-24,130.91000366210938,133.3000030517578,129.85400390625,133.24000549316406
94
+ 2021-02-25,132.17999267578125,133.08999633789062,127.97000122070312,128.52999877929688
95
+ 2021-02-26,129.81700134277344,130.97999572753906,127.88899993896484,129.72000122070312
96
+ 2021-03-01,131.22999572753906,133.10000610351562,130.77499389648438,132.9600067138672
97
+ 2021-03-02,133.3699951171875,133.3699951171875,130.8000030517578,130.8000030517578
98
+ 2021-03-03,130.32000732421875,130.61000061035156,127.05000305175781,127.05000305175781
99
+ 2021-03-04,127.0199966430664,128.1999969482422,123.36000061035156,124.91000366210938
100
+ 2021-03-05,126.41000366210938,127.1989974975586,122.33000183105469,126.9800033569336
101
+ 2021-03-08,126.76000213623047,127.37999725341797,123.23999786376953,123.25
102
+ 2021-03-09,126.3499984741211,128.88999938964844,126.08000183105469,128.24000549316406
103
+ 2021-03-10,130.00999450683594,130.00999450683594,127.5,127.69999694824219
104
+ 2021-03-11,129.9499969482422,131.3800048828125,129.4980010986328,130.77999877929688
105
+ 2021-03-12,128.94000244140625,129.6699981689453,128.0279998779297,129.6199951171875
106
+ 2021-03-15,129.85000610351562,131.10000610351562,129.29100036621094,131.0399932861328
107
+ 2021-03-16,131.92999267578125,133.19000244140625,131.177001953125,131.72999572753906
108
+ 2021-03-17,130.52000427246094,132.91000366210938,129.77999877929688,132.25999450683594
109
+ 2021-03-18,130.36000061035156,130.6199951171875,128.02999877929688,128.27000427246094
110
+ 2021-03-19,128.27000427246094,129.33999633789062,127.26000213623047,128.77999877929688
111
+ 2021-03-22,129.7100067138672,131.77999877929688,129.5,130.97999572753906
112
+ 2021-03-23,131.4600067138672,131.89999389648438,130.1699981689453,130.3000030517578
113
+ 2021-03-24,131.1199951171875,131.1199951171875,128.1999969482422,128.1999969482422
114
+ 2021-03-25,127.41000366210938,128.44000244140625,126.36000061035156,127.9800033569336
115
+ 2021-03-26,127.91999816894531,129.94000244140625,127.3499984741211,129.94000244140625
116
+ 2021-03-29,129.50999450683594,130.21800231933594,128.45700073242188,129.66000366210938
117
+ 2021-03-30,129.0,129.3249969482422,128.0399932861328,129.2100067138672
118
+ 2021-03-31,130.0,131.71499633789062,129.97000122070312,131.22000122070312
119
+ 2021-04-01,132.64999389648438,133.4199981689453,132.55999755859375,133.38999938964844
120
+ 2021-04-05,134.5500030517578,136.27000427246094,134.41000366210938,136.10000610351562
121
+ 2021-04-06,136.02000427246094,136.72000122070312,135.64999389648438,135.89500427246094
122
+ 2021-04-07,135.8800048828125,136.6199951171875,135.47000122070312,136.27000427246094
123
+ 2021-04-08,137.5500030517578,137.72999572753906,137.17999267578125,137.67999267578125
124
+ 2021-04-09,137.17999267578125,138.5989990234375,136.85000610351562,138.5
125
+ 2021-04-12,138.22000122070312,138.52000427246094,137.6199951171875,138.38999938964844
126
+ 2021-04-13,139.02000427246094,140.08999633789062,139.0,139.97000122070312
127
+ 2021-04-14,140.16000366210938,140.16000366210938,137.9499969482422,138.25999450683594
128
+ 2021-04-15,139.47999572753906,140.5,139.47999572753906,140.33999633789062
129
+ 2021-04-16,140.61000061035156,140.63999938964844,139.8249969482422,140.58999633789062
130
+ 2021-04-19,139.92999267578125,140.32000732421875,138.5,139.32000732421875
131
+ 2021-04-20,139.10000610351562,139.43800354003906,137.4320068359375,138.25
132
+ 2021-04-21,137.72000122070312,139.48500061035156,137.5,139.39999389648438
133
+ 2021-04-22,139.36000061035156,139.63999938964844,137.3000030517578,137.83999633789062
134
+ 2021-04-23,138.17999267578125,140.00999450683594,138.1280059814453,139.5
135
+ 2021-04-26,139.69000244140625,140.47999572753906,139.31500244140625,140.39999389648438
136
+ 2021-04-27,140.58999633789062,140.58999633789062,139.41000366210938,139.69000244140625
137
+ 2021-04-28,139.6699981689453,140.02000427246094,139.10000610351562,139.25
138
+ 2021-04-29,140.7899932861328,140.85000610351562,138.49000549316406,139.7899932861328
139
+ 2021-04-30,138.7899932861328,139.7100067138672,138.5659942626953,138.8300018310547
140
+ 2021-05-03,139.4199981689453,139.7100067138672,137.97000122070312,138.13999938964844
141
+ 2021-05-04,137.07000732421875,137.07000732421875,134.10000610351562,135.80999755859375
142
+ 2021-05-05,136.67999267578125,136.8699951171875,134.86000061035156,135.22999572753906
143
+ 2021-05-06,135.1300048828125,136.27999877929688,134.22999572753906,136.25
144
+ 2021-05-07,137.5500030517578,138.2899932861328,136.97500610351562,137.42999267578125
145
+ 2021-05-10,136.82000732421875,136.82000732421875,133.77999877929688,133.94000244140625
146
+ 2021-05-11,131.44000244140625,134.02000427246094,131.10000610351562,133.75
147
+ 2021-05-12,131.63999938964844,132.47500610351562,129.91000366210938,130.25999450683594
148
+ 2021-05-13,131.44000244140625,132.36000061035156,130.27000427246094,131.22000122070312
149
+ 2021-05-14,132.75999450683594,134.5,132.44000244140625,134.19000244140625
150
+ 2021-05-17,133.47000122070312,133.63999938964844,132.2100067138672,133.3000030517578
151
+ 2021-05-18,133.86000061035156,134.2100067138672,132.36000061035156,132.36000061035156
152
+ 2021-05-19,130.22000122070312,132.64999389648438,130.1649932861328,132.64999389648438
153
+ 2021-05-20,133.2100067138672,135.4709930419922,133.2100067138672,135.1199951171875
154
+ 2021-05-21,135.92999267578125,135.92999267578125,134.25,134.3300018310547
155
+ 2021-05-24,135.3699951171875,137.1300048828125,135.27999877929688,136.6300048828125
156
+ 2021-05-25,137.30999755859375,137.60000610351562,136.39500427246094,136.88999938964844
157
+ 2021-05-26,137.1300048828125,137.5,136.83999633789062,137.33999633789062
158
+ 2021-05-27,137.2100067138672,137.4499969482422,136.78900146484375,136.88999938964844
159
+ 2021-05-28,137.47000122070312,137.90899658203125,137.1199951171875,137.22999572753906
160
+ 2021-06-01,137.85000610351562,137.9600067138672,136.32000732421875,136.80999755859375
161
+ 2021-06-02,136.94000244140625,137.40199279785156,136.3300018310547,137.02999877929688
162
+ 2021-06-03,135.88999938964844,136.29299926757812,135.0,135.58999633789062
163
+ 2021-06-04,136.4199981689453,138.11000061035156,136.4199981689453,137.9499969482422
164
+ 2021-06-07,137.77000427246094,138.36000061035156,137.52000427246094,138.3300018310547
165
+ 2021-06-08,139.0399932861328,139.4149932861328,137.72000122070312,138.35000610351562
166
+ 2021-06-09,139.0,139.2899932861328,138.38600158691406,138.47000122070312
167
+ 2021-06-10,138.6999969482422,139.8800048828125,138.47000122070312,139.875
168
+ 2021-06-11,140.0,140.2239990234375,139.6999969482422,140.22000122070312
169
+ 2021-06-14,140.4499969482422,141.5030059814453,140.05999755859375,141.5030059814453
170
+ 2021-06-15,141.61000061035156,141.61000061035156,140.4499969482422,140.72999572753906
171
+ 2021-06-16,140.9600067138672,141.3000030517578,138.6999969482422,140.1699981689453
172
+ 2021-06-17,139.8300018310547,142.3300018310547,139.8300018310547,141.94000244140625
173
+ 2021-06-18,141.42999267578125,141.61000061035156,140.5800018310547,140.7899932861328
174
+ 2021-06-21,140.8000030517578,141.5800018310547,139.80999755859375,141.50999450683594
175
+ 2021-06-22,141.5500030517578,143.0,141.41000366210938,142.83999633789062
176
+ 2021-06-23,142.94000244140625,143.3699951171875,142.7270050048828,142.83999633789062
177
+ 2021-06-24,143.75999450683594,144.3800048828125,143.47999572753906,143.72000122070312
178
+ 2021-06-25,144.10000610351562,144.10000610351562,143.39999389648438,143.6199951171875
179
+ 2021-06-28,144.22000122070312,145.4040069580078,144.22000122070312,145.3800048828125
180
+ 2021-06-29,145.39999389648438,145.88999938964844,145.0,145.85000610351562
181
+ 2021-06-30,145.88999938964844,145.9499969482422,145.47999572753906,145.72999572753906
182
+ 2021-07-01,145.58999633789062,145.85000610351562,145.0,145.72999572753906
183
+ 2021-07-02,146.55999755859375,147.50999450683594,146.47000122070312,147.3699951171875
184
+ 2021-07-06,147.72999572753906,148.0989990234375,146.52000427246094,147.9600067138672
185
+ 2021-07-07,149.13999938964844,149.13999938964844,147.57000732421875,148.25
186
+ 2021-07-08,146.1300048828125,147.77999877929688,145.69000244140625,147.44000244140625
187
+ 2021-07-09,147.22000122070312,148.52000427246094,146.9550018310547,148.33999633789062
188
+ 2021-07-12,149.00999450683594,149.1199951171875,148.2899932861328,148.9499969482422
189
+ 2021-07-13,148.77999877929688,150.14999389648438,148.68600463867188,148.94000244140625
190
+ 2021-07-14,149.91000366210938,150.17999267578125,148.9499969482422,149.17999267578125
191
+ 2021-07-15,149.14999389648438,149.2100067138672,147.35499572753906,148.13999938964844
192
+ 2021-07-16,148.5,148.9199981689453,146.8300018310547,146.9600067138672
193
+ 2021-07-19,145.52000427246094,145.9199981689453,144.75,145.77999877929688
194
+ 2021-07-20,146.19000244140625,148.05999755859375,145.4600067138672,147.4600067138672
195
+ 2021-07-21,147.3300018310547,148.5500030517578,147.2899932861328,148.52000427246094
196
+ 2021-07-22,148.72000122070312,149.57000732421875,148.72000122070312,149.57000732421875
197
+ 2021-07-23,150.2100067138672,151.4199981689453,149.7100067138672,151.22000122070312
198
+ 2021-07-26,151.02999877929688,151.58999633789062,150.7270050048828,151.42999267578125
199
+ 2021-07-27,151.32000732421875,151.32000732421875,148.0399932861328,149.8000030517578
200
+ 2021-07-28,150.22999572753906,150.97000122070312,149.3300018310547,150.33999633789062
201
+ 2021-07-29,150.2100067138672,151.07000732421875,150.156005859375,150.60000610351562
202
+ 2021-07-30,148.97000122070312,150.05999755859375,148.94000244140625,149.83999633789062
203
+ 2021-08-02,150.57000732421875,150.72999572753906,149.60000610351562,149.8300018310547
204
+ 2021-08-03,150.19000244140625,150.77999877929688,148.8300018310547,150.74000549316406
205
+ 2021-08-04,150.75,151.35000610351562,150.3350067138672,150.97000122070312
206
+ 2021-08-05,151.33999633789062,152.0,151.0500030517578,151.9199981689453
207
+ 2021-08-06,151.4499969482422,151.75999450683594,150.86000061035156,151.25999450683594
208
+ 2021-08-09,151.5,151.75,151.0,151.5399932861328
209
+ 2021-08-10,151.75999450683594,151.86900329589844,150.27000427246094,150.77000427246094
210
+ 2021-08-11,151.2899932861328,151.4499969482422,149.9499969482422,150.5
211
+ 2021-08-12,150.27999877929688,151.17999267578125,149.72999572753906,151.0500030517578
212
+ 2021-08-13,151.2100067138672,151.6999969482422,150.99000549316406,151.57000732421875
213
+ 2021-08-16,151.14999389648438,151.66000366210938,149.4600067138672,151.64999389648438
214
+ 2021-08-17,150.4929962158203,150.88499450683594,149.2899932861328,150.30999755859375
215
+ 2021-08-18,150.00999450683594,150.6320037841797,148.72999572753906,148.8699951171875
216
+ 2021-08-19,148.02999877929688,150.22500610351562,147.94000244140625,149.57000732421875
217
+ 2021-08-20,150.07000732421875,151.2899932861328,149.94000244140625,151.1199951171875
218
+ 2021-08-23,151.57000732421875,153.65499877929688,151.57000732421875,153.36000061035156
219
+ 2021-08-24,153.63999938964844,154.10400390625,153.4499969482422,153.8699951171875
220
+ 2021-08-25,154.00999450683594,154.27000427246094,153.6699981689453,153.9600067138672
221
+ 2021-08-26,153.75,153.9600067138672,152.89999389648438,153.07000732421875
222
+ 2021-08-27,153.3000030517578,154.72999572753906,153.1199951171875,154.52999877929688
223
+ 2021-08-30,154.8800048828125,156.47500610351562,154.8800048828125,156.27999877929688
224
+ 2021-08-31,156.3800048828125,156.3800048828125,155.5,156.1300048828125
225
+ 2021-09-01,156.6300048828125,157.27000427246094,156.33999633789062,156.41000366210938
226
+ 2021-09-02,156.97999572753906,157.1199951171875,155.86000061035156,156.35000610351562
227
+ 2021-09-03,155.92999267578125,156.9499969482422,155.92999267578125,156.82000732421875
228
+ 2021-09-07,156.86000061035156,157.30999755859375,156.3800048828125,157.0399932861328
229
+ 2021-09-08,156.9499969482422,156.9499969482422,155.5500030517578,156.50999450683594
230
+ 2021-09-09,156.5800018310547,157.02999877929688,155.8699951171875,155.9600067138672
231
+ 2021-09-10,156.7100067138672,156.97000122070312,154.64999389648438,154.8000030517578
232
+ 2021-09-13,155.77000427246094,155.92999267578125,153.8000030517578,154.67999267578125
233
+ 2021-09-14,155.30999755859375,155.57000732421875,153.83999633789062,154.24000549316406
234
+ 2021-09-15,154.42999267578125,155.50999450683594,153.5,155.36000061035156
235
+ 2021-09-16,154.8300018310547,155.7100067138672,154.00999450683594,155.47000122070312
236
+ 2021-09-17,155.16000366210938,155.16000366210938,153.22999572753906,153.6699981689453
237
+ 2021-09-20,151.08999633789062,151.89999389648438,148.35000610351562,150.39999389648438
238
+ 2021-09-21,151.25999450683594,151.5500030517578,150.05999755859375,150.4499969482422
239
+ 2021-09-22,150.9499969482422,152.5,150.4499969482422,151.8699951171875
240
+ 2021-09-23,152.39999389648438,153.72000122070312,152.19000244140625,153.25
241
+ 2021-09-24,152.3300018310547,153.60000610351562,152.1999969482422,153.44000244140625
242
+ 2021-09-27,152.11000061035156,152.55999755859375,151.1699981689453,152.22000122070312
243
+ 2021-09-28,150.27000427246094,150.52699279785156,147.75,148.0500030517578
244
+ 2021-09-29,148.42999267578125,149.2899932861328,147.4600067138672,147.6699981689453
245
+ 2021-09-30,148.3800048828125,149.0399932861328,147.0,147.11000061035156
246
+ 2021-10-01,147.39999389648438,148.4600067138672,145.67999267578125,148.02999877929688
247
+ 2021-10-04,147.30999755859375,147.39999389648438,143.97999572753906,145.00999450683594
248
+ 2021-10-05,145.38999938964844,147.8000030517578,145.2899932861328,146.8800048828125
249
+ 2021-10-06,145.49000549316406,147.94000244140625,145.1699981689453,147.8800048828125
250
+ 2021-10-07,149.1699981689453,150.2899932861328,148.89999389648438,149.17999267578125
251
+ 2021-10-08,149.72000122070312,149.72000122070312,148.22999572753906,148.4499969482422
252
+ 2021-10-11,147.7899932861328,149.25999450683594,147.2899932861328,147.32000732421875
253
+ 2021-10-12,147.89999389648438,148.07000732421875,146.5399932861328,146.82000732421875
254
+ 2021-10-13,147.8000030517578,148.1999969482422,146.9199981689453,147.9499969482422
255
+ 2021-10-14,149.49000549316406,150.75,149.22999572753906,150.69000244140625
256
+ 2021-10-15,151.3000030517578,151.69000244140625,150.77000427246094,151.66000366210938
257
+ 2021-10-18,151.1199951171875,153.25,150.91000366210938,153.1699981689453
258
+ 2021-10-19,153.69000244140625,154.33999633789062,153.35000610351562,154.25999450683594
259
+ 2021-10-20,154.52999877929688,154.75,153.5500030517578,154.11000061035156
260
+ 2021-10-21,153.8000030517578,155.14999389648438,153.8000030517578,155.0800018310547
261
+ 2021-10-22,154.5,154.91900634765625,153.14999389648438,153.75999450683594
262
+ 2021-10-25,154.3699951171875,155.6999969482422,153.64999389648438,155.35000610351562
263
+ 2021-10-26,156.30999755859375,157.27000427246094,155.3800048828125,155.77000427246094
264
+ 2021-10-27,156.00999450683594,157.47000122070312,155.91000366210938,156.2100067138672
265
+ 2021-10-28,156.94000244140625,158.00999450683594,156.74000549316406,157.91000366210938
266
+ 2021-10-29,156.5500030517578,158.75999450683594,156.47000122070312,158.75
267
+ 2021-11-01,158.97000122070312,159.28700256347656,158.0399932861328,159.22000122070312
268
+ 2021-11-02,159.0399932861328,160.11000061035156,158.97999572753906,159.88999938964844
269
+ 2021-11-03,160.16000366210938,161.77999877929688,159.7100067138672,161.6300048828125
270
+ 2021-11-04,162.14999389648438,164.05999755859375,161.9600067138672,163.67999267578125
271
+ 2021-11-05,164.39999389648438,164.77999877929688,163.32000732421875,163.8300018310547
272
+ 2021-11-08,163.85000610351562,164.24000549316406,163.35000610351562,163.6199951171875
273
+ 2021-11-09,164.1300048828125,164.22999572753906,161.9199981689453,162.50999450683594
274
+ 2021-11-10,161.3000030517578,162.47999572753906,159.32000732421875,160.1199951171875
275
+ 2021-11-11,161.41000366210938,161.41000366210938,160.39999389648438,160.5500030517578
276
+ 2021-11-12,161.0399932861328,162.43899536132812,160.38999938964844,162.22999572753906
277
+ 2021-11-15,162.74000549316406,162.86000061035156,161.1699981689453,162.1999969482422
278
+ 2021-11-16,161.94000244140625,163.5500030517578,161.9199981689453,163.3800048828125
279
+ 2021-11-17,163.52999877929688,164.27000427246094,163.0800018310547,163.42999267578125
280
+ 2021-11-18,164.33999633789062,165.33999633789062,163.38999938964844,165.11000061035156
281
+ 2021-11-19,165.8699951171875,166.5800018310547,165.5,166.07000732421875
282
+ 2021-11-22,166.82000732421875,167.91000366210938,164.10000610351562,164.17999267578125
283
+ 2021-11-23,163.64999389648438,164.49000549316406,161.52999877929688,163.38999938964844
284
+ 2021-11-24,162.35000610351562,164.02999877929688,161.39999389648438,163.89999389648438
285
+ 2021-11-26,162.85000610351562,163.39999389648438,160.27000427246094,160.8000030517578
286
+ 2021-11-29,162.72999572753906,164.69000244140625,162.4499969482422,164.25999450683594
287
+ 2021-11-30,163.8800048828125,164.83999633789062,161.11000061035156,161.88999938964844
288
+ 2021-12-01,163.77999877929688,164.60000610351562,158.97000122070312,159.22000122070312
289
+ 2021-12-02,158.63999938964844,161.02000427246094,157.99000549316406,160.30999755859375
290
+ 2021-12-03,160.9199981689453,161.24000549316406,155.7899932861328,157.5399932861328
291
+ 2021-12-06,157.60000610351562,159.3000030517578,155.99000549316406,158.75999450683594
292
+ 2021-12-07,161.6300048828125,163.77999877929688,161.59100341796875,163.6199951171875
293
+ 2021-12-08,163.7100067138672,164.35000610351562,162.9199981689453,164.3000030517578
294
+ 2021-12-09,163.8000030517578,164.49600219726562,161.7899932861328,161.9600067138672
295
+ 2021-12-10,163.11000061035156,163.74000549316406,161.72000122070312,163.64999389648438
296
+ 2021-12-13,163.6699981689453,163.7100067138672,161.1199951171875,161.27000427246094
297
+ 2021-12-14,159.22000122070312,160.36000061035156,157.77999877929688,159.6699981689453
298
+ 2021-12-15,159.55999755859375,163.3459930419922,157.85000610351562,163.1199951171875
299
+ 2021-12-16,163.6999969482422,163.82000732421875,158.36000061035156,159.1199951171875
300
+ 2021-12-17,157.5399932861328,159.92999267578125,156.95599365234375,158.25
301
+ 2021-12-20,156.19000244140625,156.80999755859375,155.25999450683594,156.58999633789062
302
+ 2021-12-21,158.02999877929688,160.1699981689453,156.44000244140625,160.0
303
+ 2021-12-22,159.8699951171875,162.0800018310547,159.64999389648438,161.9600067138672
304
+ 2021-12-23,162.1699981689453,163.82000732421875,162.13999938964844,163.25
305
+ 2021-12-27,163.8300018310547,165.9199981689453,163.74000549316406,165.89999389648438
306
+ 2021-12-28,166.3699951171875,166.3800048828125,164.80999755859375,165.19000244140625
307
+ 2021-12-29,165.2899932861328,165.72000122070312,164.16000366210938,165.14999389648438
308
+ 2021-12-30,165.0500030517578,165.89999389648438,164.38999938964844,164.50999450683594
309
+ 2021-12-31,164.4499969482422,164.8699951171875,163.4199981689453,163.5500030517578
310
+ 2022-01-03,164.11000061035156,165.27999877929688,163.25,165.24000549316406
311
+ 2022-01-04,165.39999389648438,165.39999389648438,161.74000549316406,163.07000732421875
312
+ 2022-01-05,162.4499969482422,162.8000030517578,157.94000244140625,158.14999389648438
313
+ 2022-01-06,157.22500610351562,159.27000427246094,156.33999633789062,157.9600067138672
314
+ 2022-01-07,157.85499572753906,158.6199951171875,155.5,156.27000427246094
315
+ 2022-01-10,154.14500427246094,156.52000427246094,151.8800048828125,156.4199981689453
316
+ 2022-01-11,156.0850067138672,158.72000122070312,155.17999267578125,158.61000061035156
317
+ 2022-01-12,159.77999877929688,160.4499969482422,158.36000061035156,159.36000061035156
318
+ 2022-01-13,159.80999755859375,160.11000061035156,154.9199981689453,155.47000122070312
319
+ 2022-01-14,154.33999633789062,156.41000366210938,154.2100067138672,156.27999877929688
320
+ 2022-01-18,153.99000549316406,154.67999267578125,152.07000732421875,152.6199951171875
321
+ 2022-01-19,153.0800018310547,154.02999877929688,150.6199951171875,150.77999877929688
322
+ 2022-01-20,152.02999877929688,153.75999450683594,148.5399932861328,148.80999755859375
323
+ 2022-01-21,147.88999938964844,148.92999267578125,144.52000427246094,144.63999938964844
324
+ 2022-01-24,142.0399932861328,145.55999755859375,137.44000244140625,145.25
325
+ 2022-01-25,142.53500366210938,144.35000610351562,140.5399932861328,141.82000732421875
326
+ 2022-01-26,145.30999755859375,146.6699981689453,140.14999389648438,141.80999755859375
327
+ 2022-01-27,143.72000122070312,144.40499877929688,139.8699951171875,140.36000061035156
328
+ 2022-01-28,141.11000061035156,144.75999450683594,139.0,144.67999267578125
329
+ 2022-01-31,145.27999877929688,149.5399932861328,144.60000610351562,149.30999755859375
330
+ 2022-02-01,149.89999389648438,150.58999633789062,147.7209930419922,150.33999633789062
331
+ 2022-02-02,152.125,152.19000244140625,149.85000610351562,151.55999755859375
332
+ 2022-02-03,147.3800048828125,148.82000732421875,144.9600067138672,145.47999572753906
333
+ 2022-02-04,145.6999969482422,148.6300048828125,144.82400512695312,147.14999389648438
334
+ 2022-02-07,147.52999877929688,148.42999267578125,145.5399932861328,146.10000610351562
335
+ 2022-02-08,145.63999938964844,148.13999938964844,145.11000061035156,147.74000549316406
336
+ 2022-02-09,149.58999633789062,150.83999633789062,148.94000244140625,150.8000030517578
337
+ 2022-02-10,147.9199981689453,150.718994140625,146.66000366210938,147.52000427246094
338
+ 2022-02-11,147.5,148.05999755859375,142.2100067138672,142.80999755859375
339
+ 2022-02-14,142.5,144.32000732421875,141.4600067138672,142.99000549316406
340
+ 2022-02-15,145.1699981689453,146.5500030517578,144.72000122070312,146.44000244140625
341
+ 2022-02-16,145.52000427246094,146.85000610351562,144.25,146.44000244140625
342
+ 2022-02-17,145.11000061035156,145.35000610351562,141.9010009765625,142.11000061035156
343
+ 2022-02-18,142.52000427246094,142.6199951171875,139.50999450683594,140.50999450683594
344
+ 2022-02-22,139.2100067138672,141.47000122070312,137.57000732421875,139.10000610351562
345
+ 2022-02-23,140.41000366210938,140.6699981689453,135.3699951171875,135.47000122070312
346
+ 2022-02-24,131.14999389648438,140.27000427246094,130.8780059814453,139.97000122070312
347
+ 2022-02-25,140.3249969482422,142.3000030517578,138.85000610351562,142.24000549316406
348
+ 2022-02-28,140.8800048828125,143.33999633789062,140.41000366210938,142.7899932861328
349
+ 2022-03-01,142.1999969482422,143.14999389648438,139.44000244140625,140.4199981689453
350
+ 2022-03-02,141.1199951171875,143.2899932861328,139.9600067138672,142.83999633789062
351
+ 2022-03-03,143.9199981689453,143.9199981689453,140.00999450683594,140.82000732421875
352
+ 2022-03-04,139.8000030517578,140.35000610351562,137.8000030517578,138.77999877929688
353
+ 2022-03-07,138.58999633789062,139.1999969482422,133.53700256347656,133.64999389648438
354
+ 2022-03-08,133.3699951171875,137.02000427246094,131.58999633789062,133.0399932861328
355
+ 2022-03-09,136.5500030517578,138.2899932861328,135.3699951171875,137.7100067138672
356
+ 2022-03-10,136.1199951171875,136.72000122070312,134.3800048828125,136.27999877929688
357
+ 2022-03-11,137.5399932861328,137.6199951171875,133.25999450683594,133.47999572753906
358
+ 2022-03-14,132.92999267578125,134.30999755859375,130.60000610351562,130.9199981689453
359
+ 2022-03-15,132.0399932861328,135.27000427246094,131.30999755859375,135.02000427246094
360
+ 2022-03-16,136.8699951171875,140.0,135.11099243164062,139.9199981689453
361
+ 2022-03-17,139.17999267578125,141.64999389648438,138.64999389648438,141.64999389648438
362
+ 2022-03-18,141.0800018310547,144.69200134277344,140.5,144.5800018310547
363
+ 2022-03-21,144.13999938964844,144.91000366210938,142.13999938964844,144.02999877929688
364
+ 2022-03-22,144.27000427246094,147.27999877929688,144.02999877929688,146.82000732421875
365
+ 2022-03-23,145.6699981689453,147.0800018310547,144.6999969482422,144.72999572753906
366
+ 2022-03-24,145.5,147.9199981689453,144.6699981689453,147.8800048828125
367
+ 2022-03-25,147.9199981689453,148.30999755859375,145.97999572753906,147.82000732421875
368
+ 2022-03-28,147.8000030517578,150.11000061035156,147.30999755859375,150.02999877929688
369
+ 2022-03-29,151.83999633789062,152.9199981689453,150.6199951171875,152.6699981689453
370
+ 2022-03-30,151.9600067138672,152.5399932861328,150.3800048828125,151.0500030517578
371
+ 2022-03-31,151.07000732421875,151.1699981689453,148.75999450683594,148.97000122070312
372
+ 2022-04-01,149.22000122070312,149.52000427246094,147.49000549316406,148.83999633789062
373
+ 2022-04-04,149.2100067138672,151.89999389648438,149.07000732421875,151.8699951171875
374
+ 2022-04-05,151.35000610351562,151.5500030517578,148.1300048828125,148.52000427246094
375
+ 2022-04-06,146.36000061035156,146.67999267578125,144.1999969482422,145.24000549316406
376
+ 2022-04-07,144.9499969482422,146.55999755859375,143.41000366210938,145.6199951171875
377
+ 2022-04-08,144.88999938964844,145.2100067138672,143.3800048828125,143.66000366210938
378
+ 2022-04-11,141.77000427246094,142.1649932861328,140.0800018310547,140.33999633789062
379
+ 2022-04-12,142.16000366210938,142.9199981689453,139.0500030517578,139.6300048828125
380
+ 2022-04-13,139.75,142.86000061035156,139.47999572753906,142.47000122070312
381
+ 2022-04-14,142.52999877929688,142.61000061035156,139.11000061035156,139.2100067138672
382
+ 2022-04-18,138.7899932861328,140.25,138.11500549316406,139.38999938964844
383
+ 2022-04-19,139.0399932861328,142.63999938964844,138.69000244140625,142.41000366210938
384
+ 2022-04-20,142.8300018310547,142.9199981689453,139.83999633789062,140.36000061035156
385
+ 2022-04-21,142.07000732421875,143.0500030517578,137.07000732421875,137.50999450683594
386
+ 2022-04-22,137.4600067138672,138.0,133.66000366210938,133.85000610351562
387
+ 2022-04-25,133.17999267578125,135.67999267578125,132.6199951171875,135.60000610351562
388
+ 2022-04-26,134.72999572753906,134.72999572753906,130.35000610351562,130.49000549316406
389
+ 2022-04-27,130.4499969482422,132.74000549316406,129.55999755859375,130.36000061035156
390
+ 2022-04-28,132.38999938964844,135.6699981689453,130.63999938964844,134.9499969482422
391
+ 2022-04-29,133.10000610351562,134.52000427246094,128.60000610351562,128.94000244140625
392
+ 2022-05-02,128.6999969482422,131.07000732421875,127.37999725341797,131.05999755859375
393
+ 2022-05-03,130.9199981689453,132.05999755859375,130.0,131.24000549316406
394
+ 2022-05-04,131.35000610351562,135.8300018310547,129.1300048828125,135.63999938964844
395
+ 2022-05-05,133.69000244140625,133.75,127.37999725341797,128.99000549316406
396
+ 2022-05-06,128.00999450683594,129.5399932861328,125.51000213623047,127.2699966430664
397
+ 2022-05-09,124.80999755859375,125.83999633789062,121.6500015258789,122.37999725341797
398
+ 2022-05-10,125.2699966430664,125.68000030517578,121.98999786376953,123.80999755859375
399
+ 2022-05-11,122.76000213623047,125.04000091552734,119.69000244140625,120.11000061035156
400
+ 2022-05-12,118.26000213623047,121.62000274658203,117.2300033569336,119.83000183105469
401
+ 2022-05-13,121.62000274658203,124.58999633789062,120.98999786376953,124.08999633789062
402
+ 2022-05-16,123.4800033569336,124.30999755859375,122.22000122070312,122.86000061035156
403
+ 2022-05-17,125.22000122070312,126.08000183105469,123.63999938964844,125.98999786376953
404
+ 2022-05-18,124.05999755859375,124.26000213623047,119.2300033569336,119.87999725341797
405
+ 2022-05-19,118.98999786376953,121.06999969482422,118.30000305175781,119.0999984741211
406
+ 2022-05-20,120.55999755859375,120.83999633789062,115.27999877929688,118.77999877929688
407
+ 2022-05-23,119.22000122070312,120.86000061035156,118.19999694824219,120.69000244140625
408
+ 2022-05-24,118.48500061035156,118.7300033569336,116.11000061035156,118.16999816894531
409
+ 2022-05-25,117.58999633789062,120.66000366210938,117.44999694824219,119.80999755859375
410
+ 2022-05-26,119.45999908447266,123.76899719238281,119.41999816894531,123.13999938964844
411
+ 2022-05-27,124.44000244140625,127.19000244140625,124.41000366210938,127.19000244140625
412
+ 2022-05-31,127.0999984741211,128.02999877929688,125.19000244140625,126.94000244140625
413
+ 2022-06-01,127.70999908447266,128.58799743652344,124.95999908447266,125.87000274658203
414
+ 2022-06-02,125.41999816894531,129.36000061035156,124.81999969482422,129.36000061035156
415
+ 2022-06-03,127.12999725341797,127.66000366210938,125.44000244140625,125.91000366210938
416
+ 2022-06-06,127.83000183105469,128.47000122070312,125.73999786376953,126.5
417
+ 2022-06-07,124.9020004272461,127.73999786376953,124.55000305175781,127.47000122070312
418
+ 2022-06-08,127.11000061035156,128.14999389648438,126.19999694824219,126.54000091552734
419
+ 2022-06-09,125.8499984741211,127.12000274658203,123.0999984741211,123.20999908447266
420
+ 2022-06-10,120.80999755859375,121.23999786376953,118.62999725341797,118.80999755859375
421
+ 2022-06-13,115.06999969482422,116.04000091552734,112.91999816894531,113.41999816894531
422
+ 2022-06-14,114.2300033569336,114.58999633789062,112.43000030517578,113.58999633789062
423
+ 2022-06-15,114.93000030517578,117.94999694824219,113.7699966430664,116.4000015258789
424
+ 2022-06-16,113.3499984741211,113.48999786376953,110.77999877929688,111.72000122070312
425
+ 2022-06-17,111.94000244140625,113.98999786376953,111.26000213623047,113.0
426
+ 2022-06-21,114.66000366210938,116.58999633789062,114.62999725341797,115.62000274658203
427
+ 2022-06-22,114.45999908447266,117.2959976196289,114.33000183105469,115.4800033569336
428
+ 2022-06-23,116.51000213623047,117.51499938964844,115.3499984741211,117.16999816894531
429
+ 2022-06-24,118.43000030517578,121.41000366210938,118.30999755859375,121.41000366210938
430
+ 2022-06-27,121.77999877929688,121.94999694824219,119.83000183105469,120.30000305175781
431
+ 2022-06-28,120.55000305175781,121.58000183105469,116.55000305175781,116.66999816894531
432
+ 2022-06-29,116.58999633789062,117.33000183105469,115.5199966430664,116.77999877929688
433
+ 2022-06-30,115.55000305175781,116.72000122070312,113.47000122070312,115.19999694824219
434
+ 2022-07-01,114.69000244140625,116.13999938964844,113.95999908447266,116.05999755859375
435
+ 2022-07-05,114.51000213623047,118.08999633789062,113.86000061035156,118.01000213623047
436
+ 2022-07-06,118.22000122070312,119.66999816894531,117.5,118.76000213623047
437
+ 2022-07-07,119.1500015258789,121.63999938964844,119.1500015258789,121.33000183105469
438
+ 2022-07-08,120.13999938964844,122.06999969482422,119.7760009765625,121.45999908447266
439
+ 2022-07-11,120.45999908447266,120.55000305175781,118.55999755859375,118.87000274658203
440
+ 2022-07-12,119.37999725341797,120.16999816894531,117.08000183105469,117.75
441
+ 2022-07-13,115.44000244140625,118.41999816894531,115.23999786376953,117.55999755859375
442
+ 2022-07-14,116.41000366210938,118.26000213623047,115.12999725341797,117.95999908447266
443
+ 2022-07-15,119.22000122070312,120.08999633789062,118.55000305175781,120.01000213623047
444
+ 2022-07-18,121.19999694824219,121.78199768066406,118.62000274658203,119.04000091552734
445
+ 2022-07-19,120.62000274658203,122.81999969482422,119.9000015258789,122.63999938964844
446
+ 2022-07-20,122.88999938964844,125.13999938964844,122.5999984741211,124.66000366210938
447
+ 2022-07-21,124.8499984741211,126.44999694824219,123.81999969482422,126.44999694824219
448
+ 2022-07-22,126.05999755859375,126.91000366210938,123.47000122070312,124.2699966430664
449
+ 2022-07-25,124.22000122070312,124.37000274658203,122.69999694824219,123.58000183105469
450
+ 2022-07-26,122.80000305175781,122.87000274658203,120.7699966430664,121.13999938964844
451
+ 2022-07-27,123.08000183105469,126.91000366210938,122.81999969482422,126.25
452
+ 2022-07-28,126.12999725341797,127.66799926757812,124.58499908447266,127.47000122070312
453
+ 2022-07-29,128.07000732421875,130.11000061035156,127.51000213623047,129.7899932861328
454
+ 2022-08-01,129.05999755859375,131.13999938964844,128.58599853515625,129.72999572753906
455
+ 2022-08-02,128.72999572753906,131.02999877929688,128.3300018310547,129.2899932861328
456
+ 2022-08-03,130.1199951171875,133.16000366210938,130.0,132.72999572753906
457
+ 2022-08-04,132.8699951171875,133.55999755859375,131.99000549316406,133.5
458
+ 2022-08-05,131.30999755859375,133.19000244140625,130.99000549316406,132.39999389648438
459
+ 2022-08-08,132.57000732421875,134.27999877929688,131.33999633789062,131.9499969482422
460
+ 2022-08-09,131.08999633789062,131.22999572753906,129.8000030517578,130.4499969482422
461
+ 2022-08-10,133.52000427246094,134.1999969482422,132.50999450683594,134.02999877929688
462
+ 2022-08-11,135.05999755859375,135.89999389648438,133.0500030517578,133.3800048828125
463
+ 2022-08-12,134.27000427246094,136.0,133.77999877929688,135.9600067138672
464
+ 2022-08-15,135.5800018310547,137.22000122070312,135.57000732421875,137.02000427246094
465
+ 2022-08-16,136.72999572753906,137.5500030517578,135.4499969482422,136.77999877929688
466
+ 2022-08-17,135.38999938964844,136.33999633789062,134.3000030517578,135.16000366210938
467
+ 2022-08-18,135.10000610351562,135.94000244140625,134.4600067138672,135.47000122070312
468
+ 2022-08-19,134.1300048828125,134.4199981689453,132.50999450683594,132.82000732421875
469
+ 2022-08-22,131.02000427246094,131.11000061035156,128.99000549316406,129.3800048828125
470
+ 2022-08-23,129.19000244140625,130.41000366210938,128.94000244140625,129.25
471
+ 2022-08-24,129.00999450683594,130.33999633789062,128.77999877929688,129.5500030517578
472
+ 2022-08-25,130.33999633789062,131.89999389648438,129.90199279785156,131.89999389648438
473
+ 2022-08-26,131.77000427246094,132.24000549316406,126.45999908447266,126.52999877929688
474
+ 2022-08-29,125.31999969482422,126.3499984741211,124.83999633789062,125.2300033569336
475
+ 2022-08-30,125.94999694824219,126.12999725341797,122.80999755859375,123.8499984741211
476
+ 2022-08-31,125.05000305175781,125.37999725341797,123.0999984741211,123.22000122070312
477
+ 2022-09-01,122.02999877929688,123.33000183105469,120.55000305175781,123.16999816894531
478
+ 2022-09-02,124.41000366210938,124.94999694824219,120.76399993896484,121.51000213623047
479
+ 2022-09-06,121.62999725341797,121.98999786376953,119.67500305175781,120.61000061035156
480
+ 2022-09-07,120.73999786376953,123.37999725341797,120.66000366210938,123.01000213623047
481
+ 2022-09-08,122.02999877929688,124.13999938964844,121.55000305175781,123.62000274658203
482
+ 2022-09-09,124.58999633789062,126.52999877929688,124.58999633789062,126.25
483
+ 2022-09-12,126.94999694824219,127.95999908447266,126.80000305175781,127.80999755859375
484
+ 2022-09-13,124.16999816894531,124.66000366210938,120.46600341796875,120.83999633789062
485
+ 2022-09-14,121.33999633789062,122.1500015258789,120.58999633789062,121.81999969482422
486
+ 2022-09-15,120.91999816894531,121.98999786376953,119.11000061035156,119.75
487
+ 2022-09-16,118.33000183105469,119.19000244140625,117.5199966430664,118.93000030517578
488
+ 2022-09-19,117.69999694824219,119.73999786376953,117.66999816894531,119.7300033569336
489
+ 2022-09-20,118.66000366210938,119.70999908447266,117.80000305175781,118.76000213623047
490
+ 2022-09-21,119.19000244140625,120.87999725341797,116.58000183105469,116.62999725341797
491
+ 2022-09-22,115.9800033569336,116.38999938964844,114.68000030517578,115.19999694824219
492
+ 2022-09-23,114.18000030517578,114.2300033569336,111.88999938964844,113.4000015258789
493
+ 2022-09-26,113.12000274658203,114.93000030517578,112.54000091552734,112.72000122070312
494
+ 2022-09-27,114.29000091552734,115.2300033569336,111.9800033569336,112.91999816894531
495
+ 2022-09-28,112.87000274658203,115.66999816894531,112.27999877929688,115.20999908447266
496
+ 2022-09-29,113.44999694824219,113.61000061035156,110.58000183105469,111.94000244140625
497
+ 2022-09-30,111.44000244140625,113.18000030517578,109.86000061035156,109.94999694824219
498
+ 2022-10-03,110.7699966430664,113.16999816894531,110.06999969482422,112.52999877929688
499
+ 2022-10-04,114.7699966430664,116.3280029296875,114.7699966430664,116.08999633789062
500
+ 2022-10-05,114.44000244140625,116.7300033569336,113.33000183105469,115.95999908447266
501
+ 2022-10-06,115.55999755859375,116.87000274658203,114.94999694824219,115.12000274658203
502
+ 2022-10-07,113.08999633789062,113.13999938964844,110.16000366210938,110.66999816894531
503
+ 2022-10-10,110.77999877929688,110.86000061035156,108.45999908447266,109.54000091552734
504
+ 2022-10-11,108.88999938964844,110.05999755859375,107.37999725341797,108.16000366210938
505
+ 2022-10-12,108.43000030517578,109.12000274658203,107.77999877929688,108.11000061035156
506
+ 2022-10-13,104.95999908447266,111.12000274658203,104.62000274658203,110.55999755859375
507
+ 2022-10-14,111.55999755859375,111.76000213623047,107.01000213623047,107.27999877929688
508
+ 2022-10-17,109.72000122070312,111.12999725341797,109.70999908447266,110.73999786376953
509
+ 2022-10-18,113.73999786376953,114.0,110.55000305175781,111.72000122070312
510
+ 2022-10-19,111.02999877929688,112.55000305175781,110.2699966430664,111.30000305175781
511
+ 2022-10-20,110.88999938964844,113.04000091552734,110.22000122070312,110.66999816894531
512
+ 2022-10-21,110.22000122070312,113.5,109.81999969482422,113.33000183105469
513
+ 2022-10-24,113.47000122070312,114.91999816894531,111.88999938964844,114.56999969482422
514
+ 2022-10-25,114.97000122070312,117.05000305175781,114.97000122070312,116.87999725341797
515
+ 2022-10-26,114.5199966430664,116.7699966430664,114.12999725341797,114.30000305175781
516
+ 2022-10-27,113.86000061035156,114.43000030517578,112.02999877929688,112.20999908447266
517
+ 2022-10-28,111.93000030517578,115.86000061035156,111.91999816894531,115.68000030517578
518
+ 2022-10-31,114.73999786376953,114.9800033569336,113.55000305175781,114.3499984741211
519
+ 2022-11-01,115.87000274658203,116.0199966430664,113.01599884033203,113.16999816894531
520
+ 2022-11-02,113.1500015258789,114.41000366210938,109.26200103759766,109.33999633789062
521
+ 2022-11-03,108.0999984741211,108.75,107.0,107.20999908447266
522
+ 2022-11-04,109.29000091552734,109.6500015258789,106.56999969482422,108.83999633789062
523
+ 2022-11-07,109.33000183105469,110.2699966430664,108.43000030517578,110.05999755859375
524
+ 2022-11-08,110.73999786376953,112.22000122070312,109.2249984741211,110.87999725341797
525
+ 2022-11-09,110.06999969482422,110.44999694824219,108.19999694824219,108.33999633789062
526
+ 2022-11-10,113.51000213623047,116.41999816894531,112.66999816894531,116.23999786376953
527
+ 2022-11-11,116.27999877929688,118.72000122070312,115.69000244140625,118.45999908447266
528
+ 2022-11-14,117.58999633789062,118.94999694824219,117.0199966430664,117.41999816894531
529
+ 2022-11-15,120.30000305175781,120.62000274658203,117.66000366210938,119.05000305175781
530
+ 2022-11-16,118.1500015258789,118.30000305175781,117.08999633789062,117.4000015258789
531
+ 2022-11-17,115.55000305175781,117.75,115.4800033569336,117.16999816894531
532
+ 2022-11-18,118.44000244140625,118.45999908447266,116.1500015258789,117.29000091552734
533
+ 2022-11-21,116.58000183105469,117.04000091552734,115.60800170898438,115.9800033569336
534
+ 2022-11-22,116.2699966430664,117.68000030517578,115.37000274658203,117.58999633789062
535
+ 2022-11-23,117.63999938964844,119.04000091552734,117.55999755859375,118.9000015258789
536
+ 2022-11-25,118.13999938964844,118.4000015258789,117.8499984741211,118.04000091552734
537
+ 2022-11-28,117.19999694824219,118.02999877929688,115.91000366210938,116.27999877929688
538
+ 2022-11-29,116.3499984741211,116.51000213623047,114.83000183105469,115.45999908447266
539
+ 2022-11-30,115.54000091552734,120.73999786376953,115.20999908447266,120.73999786376953
540
+ 2022-12-01,120.81999969482422,121.68000030517578,119.63999938964844,120.86000061035156
541
+ 2022-12-02,118.76000213623047,120.68000030517578,118.6500015258789,120.3499984741211
542
+ 2022-12-05,119.41999816894531,119.98999786376953,117.77999877929688,118.38999938964844
543
+ 2022-12-06,118.26000213623047,118.30999755859375,115.29000091552734,116.02999877929688
544
+ 2022-12-07,115.30999755859375,116.2300033569336,114.70999908447266,115.38999938964844
545
+ 2022-12-08,115.9800033569336,117.16000366210938,115.12999725341797,116.73999786376953
546
+ 2022-12-09,116.37000274658203,117.48500061035156,115.87000274658203,116.06999969482422
547
+ 2022-12-12,116.08999633789062,117.4800033569336,115.69000244140625,117.47000122070312
548
+ 2022-12-13,122.05999755859375,122.0999984741211,117.62000274658203,118.77999877929688
549
+ 2022-12-14,118.52999877929688,119.87999725341797,116.54000091552734,117.7699966430664
550
+ 2022-12-15,116.1500015258789,116.39099884033203,113.4000015258789,114.0
551
+ 2022-12-16,113.61000061035156,114.20999908447266,112.16000366210938,112.86000061035156
552
+ 2022-12-19,112.66000366210938,112.66000366210938,110.44999694824219,111.01000213623047
553
+ 2022-12-20,110.45999908447266,111.58000183105469,109.81999969482422,110.88999938964844
554
+ 2022-12-21,111.30999755859375,113.0199966430664,110.97000122070312,112.5
555
+ 2022-12-22,111.20999908447266,111.20999908447266,107.97000122070312,109.79000091552734
556
+ 2022-12-23,109.19999694824219,110.20999908447266,108.41999816894531,110.02999877929688
557
+ 2022-12-27,109.76000213623047,109.76000213623047,108.2300033569336,108.38999938964844
558
+ 2022-12-28,108.25,109.12999725341797,106.87999725341797,107.0
559
+ 2022-12-29,108.19999694824219,109.9800033569336,107.87999725341797,109.6500015258789
560
+ 2022-12-30,108.44999694824219,109.58000183105469,107.9000015258789,109.52999877929688
561
+ 2023-01-03,110.5,111.11000061035156,107.8499984741211,108.75
562
+ 2023-01-04,109.68000030517578,110.01000213623047,108.0,109.30999755859375
563
+ 2023-01-05,108.56999969482422,108.66000366210938,107.4800033569336,107.69999694824219
564
+ 2023-01-06,108.36000061035156,111.01000213623047,107.13999938964844,110.54000091552734
565
+ 2023-01-09,111.48999786376953,113.23999786376953,111.04499816894531,111.33999633789062
566
+ 2023-01-10,110.9000015258789,112.27999877929688,110.69999694824219,112.2699966430664
567
+ 2023-01-11,112.80000305175781,114.23999786376953,112.36000061035156,114.23999786376953
568
+ 2023-01-12,114.55000305175781,115.19999694824219,112.66000366210938,114.80999755859375
569
+ 2023-01-13,113.76000213623047,115.67500305175781,113.69999694824219,115.5999984741211
570
+ 2023-01-17,115.55000305175781,116.33999633789062,115.05699920654297,115.83999633789062
571
+ 2023-01-18,116.55999755859375,117.11000061035156,114.2300033569336,114.31999969482422
572
+ 2023-01-19,113.56999969482422,114.08999633789062,112.69000244140625,113.19999694824219
573
+ 2023-01-20,113.86000061035156,116.43000030517578,113.44000244140625,116.30999755859375
574
+ 2023-01-23,116.6500015258789,119.38899993896484,116.3499984741211,118.86000061035156
575
+ 2023-01-24,118.2300033569336,119.06999969482422,118.0,118.63999938964844
576
+ 2023-01-25,116.69999694824219,118.62000274658203,115.66999816894531,118.38999938964844
577
+ 2023-01-26,119.82499694824219,120.75,118.70999908447266,120.69000244140625
578
+ 2023-01-27,120.1500015258789,122.69999694824219,120.08000183105469,121.87000274658203
579
+ 2023-01-30,120.4800033569336,121.06999969482422,119.27999877929688,119.38999938964844
580
+ 2023-01-31,119.5,121.23999786376953,119.44000244140625,121.22000122070312
581
+ 2023-02-01,121.12000274658203,124.81999969482422,120.26000213623047,123.81999969482422
582
+ 2023-02-02,126.55999755859375,129.0500030517578,126.22000122070312,128.1999969482422
583
+ 2023-02-03,125.36000061035156,128.50999450683594,125.30999755859375,125.98999786376953
584
+ 2023-02-06,124.87000274658203,125.83999633789062,124.37999725341797,124.87000274658203
585
+ 2023-02-07,124.83999633789062,127.9489974975586,124.41999816894531,127.48999786376953
586
+ 2023-02-08,126.93000030517578,127.27999877929688,124.94999694824219,125.22000122070312
587
+ 2023-02-09,127.13999938964844,127.13999938964844,123.5,124.12999725341797
588
+ 2023-02-10,123.19000244140625,124.01000213623047,122.30999755859375,123.31999969482422
589
+ 2023-02-13,123.87000274658203,125.51000213623047,123.38999938964844,125.30999755859375
590
+ 2023-02-14,124.6500015258789,126.58999633789062,123.9000015258789,126.20999908447266
591
+ 2023-02-15,125.44999694824219,127.2300033569336,125.22000122070312,127.18000030517578
592
+ 2023-02-16,125.2300033569336,126.86000061035156,124.72000122070312,124.79000091552734
593
+ 2023-02-17,123.83000183105469,124.19000244140625,122.6500015258789,123.9000015258789
594
+ 2023-02-21,122.26000213623047,122.86000061035156,120.9000015258789,121.01000213623047
595
+ 2023-02-22,121.22000122070312,121.9000015258789,120.4000015258789,121.0199966430664
596
+ 2023-02-23,122.58000183105469,122.63999938964844,120.36000061035156,122.08000183105469
597
+ 2023-02-24,119.9800033569336,120.48999786376953,119.33000183105469,120.05000305175781
598
+ 2023-02-27,121.41000366210938,121.95999908447266,120.69000244140625,120.93000030517578
599
+ 2023-02-28,120.66999816894531,121.80000305175781,120.56999969482422,120.79000091552734
600
+ 2023-03-01,120.62000274658203,120.90599822998047,119.4000015258789,119.77999877929688
601
+ 2023-03-02,118.73999786376953,121.125,118.6500015258789,120.87000274658203
602
+ 2023-03-03,121.54000091552734,123.37999725341797,121.31999969482422,123.30000305175781
603
+ 2023-03-06,123.87000274658203,125.05899810791016,123.36000061035156,123.44999694824219
604
+ 2023-03-07,123.45999908447266,123.80500030517578,121.60900115966797,121.93000030517578
605
+ 2023-03-08,122.11000061035156,122.75,121.3499984741211,122.52999877929688
606
+ 2023-03-09,122.72000122070312,123.80000305175781,120.06999969482422,120.37000274658203
607
+ 2023-03-10,120.44999694824219,121.06800079345703,118.26000213623047,118.73999786376953
608
+ 2023-03-13,117.91000366210938,121.11000061035156,117.3499984741211,119.55000305175781
609
+ 2023-03-14,121.12000274658203,122.55000305175781,120.75,122.2699966430664
610
+ 2023-03-15,121.20999908447266,123.11000061035156,120.66999816894531,122.94000244140625
611
+ 2023-03-16,122.58999633789062,126.37000274658203,122.27999877929688,126.19999694824219
612
+ 2023-03-17,126.12999725341797,127.19999694824219,124.81999969482422,125.62999725341797
613
+ 2023-03-20,125.12000274658203,125.94000244140625,124.22000122070312,125.77999877929688
614
+ 2023-03-21,126.63999938964844,127.80999755859375,126.01000213623047,127.61000061035156
615
+ 2023-03-22,127.62999725341797,129.6300048828125,125.83000183105469,125.8499984741211
616
+ 2023-03-23,127.47000122070312,129.1999969482422,126.27999877929688,127.41000366210938
617
+ 2023-03-24,127.19999694824219,127.87999725341797,126.25,127.86000061035156
618
+ 2023-03-27,128.16000366210938,128.55999755859375,126.63999938964844,127.0
619
+ 2023-03-28,126.70999908447266,126.73999786376953,125.33999633789062,126.31999969482422
620
+ 2023-03-29,127.86000061035156,128.86000061035156,127.5199966430664,128.63999938964844
621
+ 2023-03-30,129.6300048828125,130.07000732421875,129.11000061035156,129.83999633789062
622
+ 2023-03-31,129.92999267578125,132.07000732421875,129.80999755859375,132.00999450683594
623
+ 2023-04-03,131.05999755859375,131.77000427246094,130.5399932861328,131.66000366210938
624
+ 2023-04-04,131.8800048828125,132.22000122070312,130.7100067138672,131.22999572753906
625
+ 2023-04-05,130.7899932861328,130.89999389648438,129.1699981689453,129.8800048828125
626
+ 2023-04-06,129.25,131.0,128.6820068359375,130.80999755859375
627
+ 2023-04-10,129.55999755859375,130.74000549316406,128.8699951171875,130.72000122070312
628
+ 2023-04-11,130.7100067138672,130.7100067138672,129.67999267578125,129.8699951171875
629
+ 2023-04-12,130.72999572753906,130.9499969482422,128.5449981689453,128.7100067138672
630
+ 2023-04-13,129.47999572753906,131.42999267578125,129.42999267578125,131.3000030517578
631
+ 2023-04-14,130.6199951171875,131.7100067138672,129.8300018310547,131.0399932861328
632
+ 2023-04-17,130.85000610351562,131.2779998779297,130.00999450683594,131.13999938964844
633
+ 2023-04-18,132.02000427246094,132.19000244140625,130.6510009765625,131.11000061035156
634
+ 2023-04-19,130.13999938964844,131.50999450683594,130.11000061035156,131.11000061035156
635
+ 2023-04-20,129.83999633789062,131.3000030517578,129.5399932861328,130.07000732421875
636
+ 2023-04-21,129.92999267578125,130.52000427246094,129.19000244140625,130.19000244140625
637
+ 2023-04-24,130.1199951171875,130.6699981689453,129.0399932861328,129.9499969482422
638
+ 2023-04-25,129.30999755859375,129.50999450683594,127.47000122070312,127.4800033569336
639
+ 2023-04-26,128.83999633789062,129.50999450683594,128.0500030517578,128.22999572753906
640
+ 2023-04-27,129.83999633789062,131.9510040283203,129.60000610351562,131.74000549316406
641
+ 2023-04-28,131.64999389648438,132.67999267578125,131.24000549316406,132.67999267578125
642
+ 2023-05-01,132.4600067138672,133.02499389648438,132.05999755859375,132.47999572753906
643
+ 2023-05-02,132.5,132.5800018310547,130.6300048828125,131.30999755859375
644
+ 2023-05-03,131.50999450683594,132.58999633789062,130.4499969482422,130.5
645
+ 2023-05-04,130.38999938964844,130.8300018310547,129.60000610351562,130.10000610351562
646
+ 2023-05-05,130.88999938964844,133.14999389648438,130.83999633789062,132.8300018310547
647
+ 2023-05-08,132.64999389648438,133.26499938964844,132.1699981689453,133.17999267578125
648
+ 2023-05-09,132.4600067138672,132.77000427246094,132.14999389648438,132.32000732421875
649
+ 2023-05-10,133.32000732421875,134.0800018310547,132.2899932861328,133.72000122070312
650
+ 2023-05-11,133.97999572753906,134.3800048828125,133.30999755859375,134.17999267578125
651
+ 2023-05-12,134.4199981689453,134.56900024414062,132.83999633789062,133.64999389648438
652
+ 2023-05-15,133.8699951171875,134.5,133.25,134.42999267578125
653
+ 2023-05-16,134.16000366210938,135.27999877929688,134.1300048828125,134.55999755859375
654
+ 2023-05-17,135.00999450683594,136.42100524902344,134.5500030517578,136.14999389648438
655
+ 2023-05-18,136.3800048828125,138.8000030517578,136.33099365234375,138.7100067138672
656
+ 2023-05-19,138.82000732421875,139.10000610351562,137.97000122070312,138.3800048828125
657
+ 2023-05-22,138.36000061035156,139.27000427246094,138.30999755859375,138.94000244140625
658
+ 2023-05-23,138.19000244140625,138.6199951171875,136.97999572753906,137.10000610351562
659
+ 2023-05-24,136.2899932861328,136.9199981689453,135.55999755859375,136.42999267578125
660
+ 2023-05-25,139.52000427246094,140.22999572753906,138.5,139.72000122070312
661
+ 2023-05-26,140.19000244140625,143.64999389648438,140.13999938964844,143.30999755859375
662
+ 2023-05-30,145.14999389648438,145.55999755859375,143.3800048828125,143.92999267578125
663
+ 2023-05-31,143.30999755859375,144.07000732421875,142.5399932861328,143.08999633789062
664
+ 2023-06-01,143.05999755859375,145.30999755859375,142.60000610351562,144.7899932861328
665
+ 2023-06-02,145.50999450683594,146.36000061035156,144.81500244140625,145.91000366210938
666
+ 2023-06-05,145.83999633789062,147.0500030517578,145.5800018310547,145.9600067138672
667
+ 2023-06-06,145.72000122070312,146.36000061035156,145.2100067138672,145.9600067138672
668
+ 2023-06-07,146.13999938964844,146.88699340820312,143.2239990234375,143.49000549316406
669
+ 2023-06-08,143.6199951171875,145.45899963378906,143.55999755859375,145.17999267578125
670
+ 2023-06-09,145.92999267578125,147.08999633789062,145.26400756835938,145.77999877929688
671
+ 2023-06-12,146.52999877929688,148.3000030517578,146.13099670410156,148.27000427246094
672
+ 2023-06-13,149.4600067138672,149.75,148.1300048828125,149.4499969482422
673
+ 2023-06-14,149.47000122070312,150.62100219726562,148.27999877929688,150.52999877929688
674
+ 2023-06-15,150.0,152.92999267578125,149.75999450683594,152.2899932861328
675
+ 2023-06-16,153.3300018310547,153.36000061035156,151.19000244140625,151.32000732421875
676
+ 2023-06-20,150.5500030517578,151.4600067138672,149.71800231933594,150.9499969482422
677
+ 2023-06-21,150.4499969482422,150.58999633789062,148.49000549316406,148.9600067138672
678
+ 2023-06-22,148.3800048828125,150.67999267578125,148.22000122070312,150.63999938964844
679
+ 2023-06-23,148.99000549316406,150.08999633789062,148.45899963378906,149.1199951171875
680
+ 2023-06-26,148.9600067138672,150.0800018310547,147.10000610351562,147.1999969482422
681
+ 2023-06-27,147.7899932861328,149.97000122070312,147.47999572753906,149.69000244140625
682
+ 2023-06-28,148.92999267578125,150.75,148.89999389648438,149.99000549316406
683
+ 2023-06-29,149.83999633789062,150.07000732421875,148.97500610351562,149.67999267578125
684
+ 2023-06-30,151.1999969482422,152.35000610351562,151.05999755859375,151.97999572753906
685
+ 2023-07-03,152.22000122070312,152.57400512695312,151.7949981689453,152.36000061035156
686
+ 2023-07-05,151.67999267578125,153.0399932861328,151.64999389648438,152.30999755859375
687
+ 2023-07-06,150.77999877929688,151.3300018310547,149.94200134277344,151.13999938964844
688
+ 2023-07-07,151.08999633789062,152.3800048828125,150.5800018310547,150.7100067138672
689
+ 2023-07-10,150.52999877929688,150.9550018310547,149.50999450683594,150.74000549316406
690
+ 2023-07-11,150.89999389648438,151.6300048828125,150.0,151.42999267578125
691
+ 2023-07-12,153.22000122070312,153.9199981689453,152.35000610351562,153.36000061035156
692
+ 2023-07-13,154.72000122070312,156.30499267578125,154.47500610351562,155.94000244140625
693
+ 2023-07-14,156.1999969482422,157.47999572753906,155.60000610351562,155.97000122070312
694
+ 2023-07-17,156.25999450683594,157.75,156.05099487304688,157.33999633789062
695
+ 2023-07-18,157.14999389648438,159.22999572753906,156.36000061035156,158.6999969482422
696
+ 2023-07-19,159.13999938964844,159.57000732421875,158.10000610351562,158.52999877929688
697
+ 2023-07-20,157.39999389648438,157.98399353027344,154.5800018310547,154.99000549316406
698
+ 2023-07-21,155.99000549316406,156.25999450683594,154.3780059814453,154.5399932861328
699
+ 2023-07-24,154.8800048828125,155.32000732421875,154.0,154.7899932861328
700
+ 2023-07-25,155.11000061035156,156.51499938964844,155.08999633789062,155.8800048828125
701
+ 2023-07-26,155.39999389648438,156.00999450683594,154.38999938964844,155.2899932861328
702
+ 2023-07-27,157.58999633789062,158.25,154.40699768066406,154.92999267578125
703
+ 2023-07-28,156.66000366210938,158.17999267578125,156.47000122070312,157.72999572753906
704
+ 2023-07-31,157.9199981689453,158.30999755859375,157.32000732421875,157.92999267578125
705
+ 2023-08-01,157.27999877929688,157.77999877929688,156.63999938964844,157.49000549316406
706
+ 2023-08-02,156.0399932861328,156.0399932861328,153.50999450683594,154.02999877929688
707
+ 2023-08-03,153.02999877929688,154.64999389648438,152.9600067138672,153.74000549316406
708
+ 2023-08-04,154.5800018310547,155.53500366210938,152.8699951171875,153.05999755859375
709
+ 2023-08-07,153.82000732421875,154.38999938964844,152.8509979248047,154.32000732421875
710
+ 2023-08-08,153.32000732421875,153.32000732421875,151.72999572753906,153.00999450683594
711
+ 2023-08-09,153.1300048828125,153.16000366210938,151.0500030517578,151.30999755859375
712
+ 2023-08-10,152.60000610351562,153.99000549316406,150.99099731445312,151.66000366210938
713
+ 2023-08-11,150.5399932861328,151.3699951171875,150.02999877929688,150.6699981689453
714
+ 2023-08-14,150.3800048828125,152.39999389648438,150.09500122070312,152.39999389648438
715
+ 2023-08-15,151.9600067138672,152.24000549316406,150.47000122070312,150.77999877929688
716
+ 2023-08-16,150.5399932861328,151.08999633789062,149.11000061035156,149.1300048828125
717
+ 2023-08-17,149.74000549316406,149.85000610351562,147.3419952392578,147.50999450683594
718
+ 2023-08-18,146.10000610351562,147.83999633789062,145.91000366210938,147.30999755859375
719
+ 2023-08-21,147.92999267578125,150.0,147.77000427246094,149.75
720
+ 2023-08-22,150.8000030517578,150.8000030517578,149.22999572753906,149.5
721
+ 2023-08-23,149.97000122070312,152.2989959716797,149.89999389648438,151.89999389648438
722
+ 2023-08-24,153.32000732421875,153.35000610351562,148.5399932861328,148.5800018310547
723
+ 2023-08-25,148.9600067138672,150.44000244140625,147.5399932861328,149.80999755859375
724
+ 2023-08-28,151.02999877929688,151.25599670410156,149.8699951171875,150.9499969482422
725
+ 2023-08-29,150.7899932861328,154.32899475097656,150.6999969482422,154.14999389648438
726
+ 2023-08-30,154.25,155.2899932861328,153.8300018310547,155.0800018310547
727
+ 2023-08-31,155.05999755859375,156.2100067138672,155.05999755859375,155.42999267578125
728
+ 2023-09-01,156.50999450683594,156.6699981689453,154.72999572753906,155.3699951171875
729
+ 2023-09-05,155.0,156.0489959716797,154.64999389648438,155.5500030517578
730
+ 2023-09-06,155.2100067138672,155.33999633789062,153.33999633789062,154.22999572753906
731
+ 2023-09-07,152.30999755859375,153.38999938964844,151.8800048828125,153.05999755859375
732
+ 2023-09-08,153.0500030517578,154.22000122070312,152.88999938964844,153.27999877929688
733
+ 2023-09-11,154.55999755859375,155.30799865722656,153.75,155.11000061035156
734
+ 2023-09-12,154.39999389648438,154.9600067138672,153.25,153.38999938964844
735
+ 2023-09-13,153.4600067138672,154.61099243164062,153.0,153.99000549316406
736
+ 2023-09-14,154.69000244140625,155.61000061035156,153.83999633789062,155.22999572753906
737
+ 2023-09-15,154.6699981689453,154.77999877929688,152.19000244140625,152.5
738
+ 2023-09-18,151.9199981689453,152.92999267578125,151.81199645996094,152.49000549316406
739
+ 2023-09-19,151.91000366210938,152.4499969482422,150.89999389648438,152.17999267578125
740
+ 2023-09-20,152.60000610351562,152.72999572753906,149.9499969482422,149.99000549316406
741
+ 2023-09-21,148.42999267578125,148.7010040283203,147.14999389648438,147.16000366210938
742
+ 2023-09-22,147.97999572753906,148.82000732421875,147.11500549316406,147.25
743
+ 2023-09-25,146.82000732421875,147.9499969482422,146.4239959716797,147.9499969482422
744
+ 2023-09-26,146.92999267578125,147.0590057373047,145.3000030517578,145.69000244140625
745
+ 2023-09-27,146.17999267578125,146.8350067138672,144.52999877929688,146.05999755859375
746
+ 2023-09-28,145.66000366210938,148.1300048828125,145.3300018310547,147.22999572753906
747
+ 2023-09-29,148.72000122070312,149.2899932861328,146.8800048828125,147.41000366210938
748
+ 2023-10-02,147.47999572753906,149.1699981689453,147.25,148.64999389648438
749
+ 2023-10-03,147.58999633789062,148.4499969482422,145.3300018310547,145.99000549316406
750
+ 2023-10-04,146.4199981689453,148.33999633789062,146.19000244140625,148.00999450683594
751
+ 2023-10-05,147.99000549316406,148.11000061035156,146.10000610351562,147.52999877929688
752
+ 2023-10-06,146.3300018310547,150.50999450683594,145.97999572753906,149.99000549316406
753
+ 2023-10-09,148.99000549316406,151.02000427246094,148.4600067138672,150.7899932861328
754
+ 2023-10-10,150.9499969482422,152.74000549316406,150.74000549316406,151.61000061035156
755
+ 2023-10-11,152.17999267578125,152.7899932861328,151.47999572753906,152.7100067138672
756
+ 2023-10-12,152.9600067138672,153.6699981689453,151.1999969482422,152.16000366210938
757
+ 2023-10-13,152.4499969482422,152.6300048828125,149.6999969482422,150.27000427246094
758
+ 2023-10-16,150.80999755859375,152.39100646972656,150.75,152.00999450683594
759
+ 2023-10-17,150.47000122070312,152.16000366210938,149.6300048828125,151.5
760
+ 2023-10-18,150.4199981689453,151.35000610351562,148.93299865722656,149.49000549316406
761
+ 2023-10-19,150.05999755859375,150.55799865722656,147.75999450683594,148.07000732421875
762
+ 2023-10-20,147.89999389648438,148.08999633789062,145.7899932861328,145.88999938964844
763
+ 2023-10-23,145.2899932861328,147.77999877929688,144.47000122070312,146.32000732421875
764
+ 2023-10-24,147.0800018310547,148.0500030517578,146.38999938964844,147.72999572753906
765
+ 2023-10-25,146.72999572753906,146.77999877929688,143.88999938964844,144.1300048828125
766
+ 2023-10-26,143.6300048828125,143.97999572753906,140.83999633789062,141.25999450683594
767
+ 2023-10-27,142.52999877929688,143.49000549316406,141.55999755859375,142.08999633789062
768
+ 2023-10-30,143.08999633789062,144.17300415039062,142.5500030517578,143.6699981689453
769
+ 2023-10-31,143.66000366210938,144.49000549316406,142.6199951171875,144.3300018310547
770
+ 2023-11-01,144.69000244140625,147.08999633789062,144.66000366210938,146.92999267578125
771
+ 2023-11-02,148.72999572753906,149.6300048828125,148.25,149.50999450683594
772
+ 2023-11-03,150.05999755859375,151.80999755859375,149.9600067138672,151.3000030517578
773
+ 2023-11-06,151.61000061035156,152.1199951171875,150.9499969482422,151.8699951171875
774
+ 2023-11-07,152.3300018310547,153.69000244140625,151.85000610351562,153.3300018310547
775
+ 2023-11-08,153.49000549316406,153.77000427246094,152.47999572753906,153.4499969482422
776
+ 2023-11-09,153.72000122070312,154.19000244140625,152.0500030517578,152.2899932861328
777
+ 2023-11-10,152.97000122070312,155.72000122070312,152.7899932861328,155.63999938964844
778
+ 2023-11-13,155.0500030517578,155.61000061035156,154.41000366210938,155.22000122070312
779
+ 2023-11-14,157.8699951171875,158.91400146484375,157.64999389648438,158.52999877929688
780
+ 2023-11-15,159.35000610351562,159.50999450683594,158.08999633789062,158.66000366210938
781
+ 2023-11-16,158.32000732421875,158.8699951171875,157.8000030517578,158.8000030517578
782
+ 2023-11-17,158.49000549316406,159.24000549316406,158.11000061035156,158.83999633789062
783
+ 2023-11-20,158.82000732421875,161.0399932861328,158.82000732421875,160.75999450683594
784
+ 2023-11-21,160.05999755859375,160.11000061035156,159.1199951171875,159.8300018310547
785
+ 2023-11-22,160.7100067138672,161.7100067138672,160.10000610351562,160.49000549316406
786
+ 2023-11-24,160.35000610351562,160.5399932861328,159.83999633789062,160.25999450683594
787
+ 2023-11-27,160.0500030517578,160.91700744628906,159.7550048828125,160.10000610351562
788
+ 2023-11-28,159.80999755859375,160.76499938964844,159.66000366210938,160.52000427246094
789
+ 2023-11-29,161.5500030517578,162.14999389648438,160.24000549316406,160.39999389648438
790
+ 2023-11-30,160.47000122070312,160.6300048828125,158.75,159.9499969482422
791
+ 2023-12-01,159.52000427246094,160.67999267578125,158.85000610351562,160.42999267578125
792
+ 2023-12-04,158.8699951171875,159.0500030517578,157.44000244140625,158.92999267578125
793
+ 2023-12-05,158.1300048828125,159.8300018310547,158.10000610351562,159.35000610351562
794
+ 2023-12-06,160.57000732421875,160.61000061035156,158.27999877929688,158.39999389648438
795
+ 2023-12-07,159.66000366210938,160.97999572753906,159.22000122070312,160.69000244140625
796
+ 2023-12-08,159.9199981689453,161.54600524902344,159.89999389648438,161.3699951171875
797
+ 2023-12-11,161.22999572753906,162.85000610351562,161.1300048828125,162.75
798
+ 2023-12-12,162.77000427246094,164.0800018310547,162.29800415039062,164.0800018310547
799
+ 2023-12-13,164.4199981689453,166.3800048828125,164.1199951171875,166.1199951171875
800
+ 2023-12-14,166.66000366210938,167.1699981689453,164.72999572753906,165.97000122070312
801
+ 2023-12-15,166.35000610351562,167.27000427246094,166.07000732421875,166.6300048828125
802
+ 2023-12-18,166.5800018310547,167.82000732421875,166.4499969482422,167.47999572753906
803
+ 2023-12-19,167.67999267578125,168.36000061035156,167.5800018310547,168.2899932861328
804
+ 2023-12-20,168.0,168.83999633789062,165.7550048828125,165.80999755859375
805
+ 2023-12-21,167.44000244140625,167.88999938964844,166.41000366210938,167.75
806
+ 2023-12-22,168.27000427246094,168.63999938964844,167.22000122070312,168.02000427246094
807
+ 2023-12-26,168.36000061035156,169.30499267578125,168.31199645996094,169.02999877929688
808
+ 2023-12-27,169.17999267578125,169.47999572753906,168.7899932861328,169.35000610351562
809
+ 2023-12-28,169.83999633789062,169.94000244140625,169.14999389648438,169.27999877929688
810
+ 2023-12-29,169.3000030517578,169.42999267578125,167.7899932861328,168.5399932861328
811
+ 2024-01-02,167.02999877929688,167.13999938964844,164.75,165.6999969482422
812
+ 2024-01-03,164.6199951171875,165.03900146484375,163.77999877929688,163.9199981689453
813
+ 2024-01-04,163.17999267578125,164.4600067138672,163.02999877929688,163.11000061035156
814
+ 2024-01-05,163.17999267578125,164.43099975585938,162.74000549316406,163.32000732421875
815
+ 2024-01-08,163.8300018310547,166.80499267578125,163.77999877929688,166.6999969482422
816
+ 2024-01-09,165.4199981689453,167.38999938964844,165.3699951171875,167.02000427246094
817
+ 2024-01-10,167.14999389648438,168.55999755859375,166.8000030517578,168.16000366210938
818
+ 2024-01-11,168.6999969482422,169.22000122070312,166.41000366210938,168.5399932861328
819
+ 2024-01-12,168.9199981689453,169.27000427246094,168.00999450683594,168.60000610351562
820
+ 2024-01-16,168.07000732421875,169.2100067138672,167.5,168.57000732421875
821
+ 2024-01-17,167.1999969482422,167.77000427246094,165.86000061035156,167.6199951171875
822
+ 2024-01-18,169.0800018310547,170.24000549316406,168.4600067138672,170.08999633789062
823
+ 2024-01-19,170.92999267578125,173.42999267578125,170.6790008544922,173.38999938964844
824
+ 2024-01-22,174.27999877929688,174.80999755859375,173.35000610351562,173.60000610351562
825
+ 2024-01-23,173.8800048828125,174.38999938964844,173.15499877929688,174.3699951171875
826
+ 2024-01-24,175.92999267578125,176.94000244140625,175.08999633789062,175.2899932861328
827
+ 2024-01-25,176.33999633789062,176.6020050048828,174.55999755859375,175.49000549316406
828
+ 2024-01-26,174.69000244140625,175.42999267578125,174.1999969482422,174.47000122070312
829
+ 2024-01-29,174.64999389648438,176.30999755859375,174.3800048828125,176.25
830
+ 2024-01-30,175.83999633789062,176.01499938964844,174.6999969482422,175.0500030517578
831
+ 2024-01-31,173.24000549316406,174.06500244140625,171.5800018310547,171.61000061035156
832
+ 2024-02-01,172.3800048828125,173.86000061035156,172.0,173.72000122070312
833
+ 2024-02-02,174.47000122070312,177.11000061035156,174.10000610351562,176.6699981689453
834
+ 2024-02-05,176.61000061035156,176.83999633789062,174.9600067138672,176.3800048828125
835
+ 2024-02-06,176.82000732421875,177.08999633789062,175.0399932861328,176.0399932861328
836
+ 2024-02-07,177.16000366210938,178.1649932861328,176.6649932861328,177.82000732421875
837
+ 2024-02-08,177.94000244140625,178.47000122070312,177.59500122070312,178.1699981689453
838
+ 2024-02-09,178.6199951171875,180.22000122070312,178.30999755859375,179.89999389648438
839
+ 2024-02-12,179.8699951171875,180.77000427246094,178.92999267578125,179.1999969482422
840
+ 2024-02-13,175.88999938964844,177.5189971923828,175.0919952392578,176.39999389648438
841
+ 2024-02-14,177.55999755859375,178.50999450683594,176.55999755859375,178.35000610351562
842
+ 2024-02-15,178.64999389648438,179.06700134277344,177.58999633789062,178.8800048828125
843
+ 2024-02-16,179.0399932861328,179.0500030517578,176.97000122070312,177.25
844
+ 2024-02-20,176.4499969482422,177.02000427246094,174.33999633789062,175.91000366210938
845
+ 2024-02-21,174.77000427246094,175.22999572753906,173.57000732421875,175.17999267578125
846
+ 2024-02-22,178.8699951171875,180.77999877929688,178.5500030517578,180.36000061035156
847
+ 2024-02-23,181.0,181.3800048828125,179.42999267578125,179.80999755859375
848
+ 2024-02-26,180.16000366210938,180.56100463867188,179.64999389648438,179.74000549316406
849
+ 2024-02-27,180.17999267578125,180.3000030517578,179.11000061035156,180.16000366210938
850
+ 2024-02-28,179.25999450683594,179.75999450683594,178.8000030517578,179.19000244140625
851
+ 2024-02-29,180.39999389648438,181.1699981689453,179.10000610351562,180.69000244140625
852
+ 2024-03-01,181.08999633789062,183.83999633789062,181.08999633789062,183.47999572753906
853
+ 2024-03-04,183.47000122070312,183.6300048828125,182.7100067138672,182.75999450683594
854
+ 2024-03-05,181.4499969482422,181.47999572753906,178.5399932861328,179.50999450683594
855
+ 2024-03-06,181.33999633789062,181.9499969482422,179.86000061035156,180.6699981689453
856
+ 2024-03-07,182.14999389648438,183.88999938964844,181.50399780273438,183.38999938964844
857
+ 2024-03-08,183.50999450683594,184.65499877929688,180.47999572753906,180.74000549316406
858
+ 2024-03-11,180.0500030517578,180.55999755859375,179.27000427246094,180.0800018310547
859
+ 2024-03-12,181.0500030517578,182.80999755859375,179.72999572753906,182.6300048828125
860
+ 2024-03-13,182.24000549316406,182.24000549316406,180.8000030517578,181.24000549316406
861
+ 2024-03-14,181.77999877929688,181.97000122070312,179.66000366210938,180.80999755859375
862
+ 2024-03-15,179.5,179.8000030517578,178.16000366210938,178.63999938964844
863
+ 2024-03-18,180.49000549316406,181.44000244140625,179.91000366210938,179.99000549316406
864
+ 2024-03-19,179.17999267578125,180.60000610351562,178.3000030517578,180.42999267578125
865
+ 2024-03-20,180.94500732421875,182.72999572753906,180.25,182.58999633789062
866
+ 2024-03-21,184.67999267578125,184.87899780273438,183.35000610351562,183.4199981689453
867
+ 2024-03-22,183.25,184.11000061035156,182.89999389648438,183.58999633789062
868
+ 2024-03-25,182.4199981689453,183.61000061035156,182.10000610351562,183.0
869
+ 2024-03-26,183.61000061035156,184.00599670410156,182.32000732421875,182.39999389648438
870
+ 2024-03-27,183.69000244140625,183.74000549316406,181.83999633789062,183.07000732421875
871
+ 2024-03-28,183.0399932861328,183.36000061035156,182.5500030517578,182.69000244140625
872
+ 2024-04-01,183.0800018310547,184.1300048828125,182.2899932861328,183.11000061035156
873
+ 2024-04-02,181.0800018310547,181.6199951171875,180.24000549316406,181.5
874
+ 2024-04-03,180.66000366210938,182.6699981689453,180.6199951171875,181.91000366210938
875
+ 2024-04-04,183.6699981689453,183.88999938964844,179.02000427246094,179.1199951171875
876
+ 2024-04-05,179.75,182.32000732421875,179.4199981689453,181.24000549316406
877
+ 2024-04-08,181.64999389648438,182.0800018310547,180.72999572753906,181.30999755859375
878
+ 2024-04-09,182.27000427246094,182.3800048828125,180.0,181.9499969482422
879
+ 2024-04-10,179.77000427246094,180.72999572753906,179.52000427246094,180.3800048828125
880
+ 2024-04-11,181.13999938964844,183.63999938964844,180.2100067138672,183.2899932861328
881
+ 2024-04-12,181.47999572753906,181.9499969482422,179.75999450683594,180.3300018310547
882
+ 2024-04-15,181.88999938964844,181.89300537109375,177.02000427246094,177.36000061035156
883
+ 2024-04-16,177.27999877929688,178.47000122070312,176.8300018310547,177.3699951171875
884
+ 2024-04-17,178.22999572753906,178.22999572753906,174.83999633789062,175.22999572753906
885
+ 2024-04-18,175.49000549316406,176.13999938964844,173.97999572753906,174.25999450683594
886
+ 2024-04-19,173.72999572753906,173.92999267578125,169.9600067138672,170.6300048828125
887
+ 2024-04-22,171.72000122070312,173.3000030517578,170.35000610351562,172.35000610351562
888
+ 2024-04-23,173.16000366210938,175.39999389648438,172.97999572753906,174.89999389648438
889
+ 2024-04-24,176.22000122070312,176.80499267578125,174.5800018310547,175.49000549316406
890
+ 2024-04-25,172.5,175.00999450683594,172.05999755859375,174.64999389648438
891
+ 2024-04-26,175.99000549316406,177.9600067138672,175.69500732421875,177.35000610351562
892
+ 2024-04-29,178.24000549316406,178.4499969482422,176.9250030517578,178.05999755859375
893
+ 2024-04-30,177.38999938964844,177.97000122070312,174.6699981689453,174.67999267578125
894
+ 2024-05-01,174.0800018310547,176.92999267578125,173.10000610351562,173.4499969482422
895
+ 2024-05-02,175.02000427246094,176.02999877929688,173.0800018310547,175.64999389648438
896
+ 2024-05-03,178.77999877929688,179.5800018310547,178.1199951171875,179.1999969482422
897
+ 2024-05-06,179.97000122070312,181.1999969482422,179.6300048828125,181.19000244140625
898
+ 2024-05-07,181.35000610351562,181.86000061035156,180.88999938964844,181.19000244140625
899
+ 2024-05-08,180.10000610351562,181.63999938964844,180.0500030517578,181.0800018310547
900
+ 2024-05-09,181.16000366210938,181.6999969482422,180.47000122070312,181.47999572753906
901
+ 2024-05-10,182.11000061035156,182.80999755859375,181.27999877929688,181.89999389648438
902
+ 2024-05-13,182.69000244140625,182.72999572753906,181.77000427246094,182.33999633789062
903
+ 2024-05-14,182.14999389648438,183.71499633789062,182.0800018310547,183.5
904
+ 2024-05-15,184.5399932861328,186.4499969482422,183.88999938964844,186.35000610351562
905
+ 2024-05-16,186.3000030517578,187.11000061035156,185.9199981689453,185.99000549316406
906
+ 2024-05-17,186.0500030517578,186.2899932861328,184.9709930419922,185.91000366210938
907
+ 2024-05-20,186.0,187.4600067138672,185.91000366210938,187.1999969482422
908
+ 2024-05-21,186.4499969482422,187.63999938964844,186.33999633789062,187.57000732421875
909
+ 2024-05-22,187.67999267578125,187.97999572753906,186.4600067138672,187.52000427246094
910
+ 2024-05-23,189.52000427246094,189.55999755859375,185.9499969482422,186.6999969482422
911
+ 2024-05-24,187.38999938964844,188.9600067138672,187.06900024414062,188.47999572753906
912
+ 2024-05-28,188.94000244140625,189.19000244140625,187.94000244140625,189.17999267578125
913
+ 2024-05-29,187.41000366210938,188.5500030517578,187.38999938964844,187.8800048828125
914
+ 2024-05-30,187.42999267578125,187.47500610351562,185.27000427246094,185.85000610351562
915
+ 2024-05-31,185.88999938964844,186.1699981689453,182.35000610351562,185.8699951171875
916
+ 2024-06-03,187.1199951171875,187.47000122070312,184.33999633789062,186.49000549316406
917
+ 2024-06-04,186.35000610351562,187.47999572753906,185.64999389648438,186.97000122070312
918
+ 2024-06-05,188.4600067138672,190.77000427246094,188.0,190.72999572753906
919
+ 2024-06-06,191.0399932861328,191.14999389648438,190.1999969482422,190.6999969482422
920
+ 2024-06-07,190.4199981689453,191.6199951171875,190.07000732421875,190.52999877929688
921
+ 2024-06-10,190.07000732421875,191.39999389648438,189.92999267578125,191.27999877929688
922
+ 2024-06-11,190.74000549316406,192.63999938964844,190.15499877929688,192.60000610351562
923
+ 2024-06-12,194.22000122070312,196.07000732421875,193.9499969482422,195.08999633789062
924
+ 2024-06-13,196.58999633789062,196.83999633789062,195.25,196.17999267578125
925
+ 2024-06-14,196.08999633789062,197.22000122070312,195.89999389648438,197.19000244140625
926
+ 2024-06-17,197.2899932861328,200.32000732421875,196.75999450683594,199.61000061035156
927
+ 2024-06-18,199.61000061035156,199.9499969482422,198.94000244140625,199.6699981689453
928
+ 2024-06-20,200.1699981689453,200.32000732421875,197.41000366210938,198.1199951171875
929
+ 2024-06-21,198.00999450683594,198.55999755859375,197.0,197.5399932861328
930
+ 2024-06-24,196.8000030517578,197.47000122070312,194.98500061035156,195.0500030517578
931
+ 2024-06-25,195.89999389648438,197.3800048828125,195.5399932861328,197.27000427246094
932
+ 2024-06-26,196.9199981689453,197.89999389648438,196.85000610351562,197.6999969482422
933
+ 2024-06-27,197.5800018310547,198.7899932861328,197.22999572753906,198.19000244140625
934
+ 2024-06-28,198.5,200.47000122070312,196.9199981689453,197.11000061035156
935
+ 2024-07-01,197.5500030517578,198.5399932861328,196.0,198.3300018310547
936
+ 2024-07-02,197.7100067138672,200.41000366210938,197.6699981689453,200.39999389648438
937
+ 2024-07-03,200.10000610351562,202.1300048828125,200.08999633789062,202.05999755859375
938
+ 2024-07-05,202.47999572753906,204.35499572753906,202.30499267578125,204.19000244140625
939
+ 2024-07-08,204.35000610351562,204.88999938964844,203.91099548339844,204.6999969482422
940
+ 2024-07-09,205.30999755859375,205.75,204.2100067138672,204.85000610351562
941
+ 2024-07-10,205.63999938964844,207.24000549316406,205.11000061035156,207.0
942
+ 2024-07-11,207.02000427246094,207.1199951171875,201.9499969482422,202.44000244140625
943
+ 2024-07-12,202.69000244140625,205.58999633789062,202.49000549316406,203.6699981689453
944
+ 2024-07-15,204.36000061035156,206.16000366210938,203.33999633789062,204.1999969482422
945
+ 2024-07-16,204.77000427246094,205.05999755859375,202.9499969482422,204.25999450683594
946
+ 2024-07-17,200.92999267578125,201.13800048828125,198.24000549316406,198.3000030517578
947
+ 2024-07-18,199.8800048828125,199.91000366210938,196.0,197.3000030517578
948
+ 2024-07-19,197.17999267578125,198.1999969482422,195.05999755859375,195.55999755859375
949
+ 2024-07-22,198.0,198.89500427246094,196.6199951171875,198.49000549316406
950
+ 2024-07-23,198.11000061035156,199.35000610351562,197.61000061035156,197.77999877929688
951
+ 2024-07-24,195.00999450683594,195.1199951171875,190.30999755859375,190.72000122070312
952
+ 2024-07-25,190.83999633789062,192.5449981689453,187.50999450683594,188.5500030517578
953
+ 2024-07-26,190.39999389648438,191.72500610351562,189.22000122070312,190.5500030517578
954
+ 2024-07-29,191.64999389648438,192.52000427246094,189.97999572753906,190.91000366210938
955
+ 2024-07-30,191.72000122070312,191.95399475097656,186.9199981689453,188.2899932861328
956
+ 2024-07-31,192.6300048828125,194.5500030517578,191.99000549316406,193.75999450683594
957
+ 2024-08-01,194.1699981689453,195.69000244140625,187.63999938964844,189.19000244140625
958
+ 2024-08-02,185.5500030517578,186.625,182.97000122070312,184.6699981689453
959
+ 2024-08-05,174.6999969482422,182.0,174.22999572753906,179.36000061035156
960
+ 2024-08-06,179.94000244140625,183.97999572753906,178.8699951171875,180.9199981689453
961
+ 2024-08-07,183.75999450683594,184.75,178.75999450683594,178.94000244140625
962
+ 2024-08-08,181.52999877929688,184.75,179.9499969482422,184.3699951171875
963
+ 2024-08-09,183.8699951171875,186.00999450683594,183.39999389648438,185.33999633789062
964
+ 2024-08-12,185.74000549316406,186.99000549316406,184.61000061035156,185.80999755859375
965
+ 2024-08-13,187.5800018310547,190.4600067138672,187.55999755859375,190.3800048828125
966
+ 2024-08-14,190.74000549316406,191.39999389648438,188.66000366210938,190.4499969482422
967
+ 2024-08-15,192.9600067138672,195.41000366210938,192.7779998779297,195.27000427246094
968
+ 2024-08-16,194.5800018310547,196.02999877929688,194.13800048828125,195.5
969
+ 2024-08-19,195.5399932861328,198.07000732421875,194.85000610351562,198.07000732421875
970
+ 2024-08-20,197.6999969482422,198.7429962158203,196.9510040283203,197.63999938964844
971
+ 2024-08-21,197.97000122070312,199.32000732421875,197.25999450683594,198.60000610351562
972
+ 2024-08-22,199.52000427246094,199.80999755859375,195.00999450683594,195.42999267578125
973
+ 2024-08-23,197.24000549316406,198.6699981689453,195.60000610351562,197.52999877929688
974
+ 2024-08-26,197.33999633789062,197.6699981689453,194.7989959716797,195.6300048828125
975
+ 2024-08-27,194.97000122070312,196.6300048828125,194.14999389648438,196.24000549316406
976
+ 2024-08-28,196.02000427246094,196.3000030517578,192.55999755859375,194.02999877929688
977
+ 2024-08-29,194.7899932861328,196.67999267578125,193.1699981689453,193.7100067138672
978
+ 2024-08-30,195.4499969482422,196.22000122070312,193.64999389648438,196.0800018310547
979
+ 2024-09-03,194.74000549316406,194.77999877929688,189.11000061035156,190.0800018310547
980
+ 2024-09-04,188.8000030517578,191.125,188.3800048828125,189.5500030517578
981
+ 2024-09-05,188.88999938964844,191.5,188.47000122070312,189.77999877929688
982
+ 2024-09-06,189.44000244140625,189.77999877929688,184.47999572753906,184.6999969482422
983
+ 2024-09-09,186.4600067138672,187.44000244140625,185.14500427246094,187.0399932861328
984
+ 2024-09-10,187.77000427246094,188.97000122070312,186.13999938964844,188.72999572753906
985
+ 2024-09-11,189.25999450683594,193.17999267578125,185.75999450683594,192.8000030517578
986
+ 2024-09-12,192.88999938964844,195.10000610351562,192.18499755859375,194.77000427246094
987
+ 2024-09-13,194.4499969482422,196.1199951171875,194.4199981689453,195.6300048828125
988
+ 2024-09-16,194.75999450683594,195.02000427246094,193.4499969482422,194.7899932861328
989
+ 2024-09-17,196.0500030517578,196.51300048828125,193.85000610351562,194.89999389648438
990
+ 2024-09-18,195.32000732421875,197.0,193.77999877929688,194.02999877929688
991
+ 2024-09-19,198.66000366210938,200.1199951171875,197.7740020751953,198.94000244140625
992
+ 2024-09-20,198.57000732421875,199.0800018310547,196.8699951171875,198.58999633789062
993
+ 2024-09-23,198.77000427246094,199.22000122070312,198.22000122070312,198.8000030517578
994
+ 2024-09-24,199.3800048828125,200.13999938964844,197.66000366210938,199.74000549316406
995
+ 2024-09-25,199.5800018310547,200.7100067138672,199.41000366210938,199.97999572753906
996
+ 2024-09-26,203.02999877929688,203.16000366210938,199.9600067138672,201.44000244140625
997
+ 2024-09-27,201.91000366210938,201.91000366210938,199.92999267578125,200.32000732421875
998
+ 2024-09-30,199.9199981689453,200.99000549316406,198.76499938964844,200.85000610351562
999
+ 2024-10-01,200.77000427246094,200.8300018310547,196.49000549316406,198.05999755859375
1000
+ 2024-10-02,197.6999969482422,199.12899780273438,196.6199951171875,198.36000061035156
1001
+ 2024-10-03,197.4499969482422,199.40499877929688,197.16000366210938,198.1999969482422
1002
+ 2024-10-04,200.6199951171875,200.77000427246094,198.5500030517578,200.55999755859375
1003
+ 2024-10-07,199.8000030517578,200.1999969482422,197.9199981689453,198.41000366210938
1004
+ 2024-10-08,199.42999267578125,201.66000366210938,199.16000366210938,201.3800048828125
1005
+ 2024-10-09,201.25999450683594,203.1999969482422,200.8300018310547,202.97000122070312
1006
+ 2024-10-10,202.02000427246094,203.4810028076172,201.47999572753906,202.77000427246094
1007
+ 2024-10-11,201.97000122070312,203.4600067138672,201.75999450683594,203.02999877929688
1008
+ 2024-10-14,204.07000732421875,205.3000030517578,203.83999633789062,204.75
1009
+ 2024-10-15,204.88999938964844,205.13999938964844,201.1199951171875,202.02000427246094
1010
+ 2024-10-16,202.1300048828125,202.33999633789062,200.67999267578125,202.02000427246094
1011
+ 2024-10-17,204.3000030517578,204.31500244140625,202.16000366210938,202.1999969482422
1012
+ 2024-10-18,203.3300018310547,203.94900512695312,203.0399932861328,203.52000427246094
1013
+ 2024-10-21,203.02000427246094,204.22999572753906,202.24000549316406,203.88999938964844
1014
+ 2024-10-22,202.7899932861328,204.72000122070312,202.47999572753906,204.11000061035156
1015
+ 2024-10-23,203.13999938964844,203.38999938964844,199.6300048828125,201.02000427246094
1016
+ 2024-10-24,202.50999450683594,202.8470001220703,201.47000122070312,202.6199951171875
1017
+ 2024-10-25,203.77999877929688,205.88499450683594,203.5,203.85000610351562
1018
+ 2024-10-28,205.14999389648438,205.14999389648438,203.77999877929688,203.91000366210938
1019
+ 2024-10-29,204.02000427246094,206.3300018310547,203.25999450683594,205.80999755859375
1020
+ 2024-10-30,205.55999755859375,205.89999389648438,204.1300048828125,204.30999755859375
1021
+ 2024-10-31,202.66000366210938,202.6699981689453,199.1300048828125,199.1300048828125
1022
+ 2024-11-01,199.8000030517578,201.97999572753906,199.6999969482422,200.60000610351562
1023
+ 2024-11-04,200.3699951171875,201.39999389648438,199.32000732421875,200.02000427246094
1024
+ 2024-11-05,200.7100067138672,202.85499572753906,200.6699981689453,202.5800018310547
1025
+ 2024-11-06,206.10000610351562,208.4149932861328,205.6230010986328,208.07000732421875
1026
+ 2024-11-07,209.27000427246094,211.6750030517578,209.22999572753906,211.35000610351562
1027
+ 2024-11-08,211.17999267578125,211.9199981689453,210.89999389648438,211.6199951171875
1028
+ 2024-11-11,212.1199951171875,212.19000244140625,210.27000427246094,211.5
1029
+ 2024-11-12,211.44000244140625,211.80999755859375,209.8699951171875,211.1300048828125
1030
+ 2024-11-13,210.88999938964844,211.9199981689453,209.9199981689453,210.8300018310547
1031
+ 2024-11-14,210.6999969482422,211.02999877929688,209.0,209.33999633789062
1032
+ 2024-11-15,207.00999450683594,207.14999389648438,203.5399932861328,204.35000610351562
1033
+ 2024-11-18,204.99000549316406,206.66000366210938,204.4499969482422,205.8000030517578
1034
+ 2024-11-19,204.7100067138672,207.41000366210938,204.6300048828125,207.2100067138672
1035
+ 2024-11-20,207.08999633789062,207.22500610351562,204.3800048828125,207.11000061035156
1036
+ 2024-11-21,208.36000061035156,208.64999389648438,204.8000030517578,207.8800048828125
1037
+ 2024-11-22,207.6300048828125,208.47000122070312,206.9499969482422,208.17999267578125
1038
+ 2024-11-25,209.88999938964844,210.5,207.59500122070312,208.50999450683594
1039
+ 2024-11-26,209.1199951171875,209.9499969482422,208.77999877929688,209.6300048828125
1040
+ 2024-11-27,209.14999389648438,209.17999267578125,206.61000061035156,208.0
1041
+ 2024-11-29,208.24000549316406,210.02999877929688,207.97999572753906,209.8000030517578
1042
+ 2024-12-02,210.3300018310547,212.49000549316406,210.24000549316406,212.10000610351562
1043
+ 2024-12-03,211.52999877929688,212.85000610351562,211.3249969482422,212.75
1044
+ 2024-12-04,214.1699981689453,215.47000122070312,213.88999938964844,215.3699951171875
1045
+ 2024-12-05,215.4600067138672,215.68099975585938,214.64999389648438,214.8000030517578
1046
+ 2024-12-06,215.08999633789062,216.7989959716797,215.02999877929688,216.72000122070312
1047
+ 2024-12-09,216.30999755859375,216.656005859375,214.54100036621094,215.0399932861328
1048
+ 2024-12-10,215.5,216.24000549316406,213.72000122070312,214.27999877929688
1049
+ 2024-12-11,216.08999633789062,218.39999389648438,215.9550018310547,218.1300048828125
1050
+ 2024-12-12,217.22000122070312,217.7100067138672,216.52999877929688,216.72999572753906
1051
+ 2024-12-13,218.35000610351562,219.42999267578125,217.0500030517578,218.41000366210938
1052
+ 2024-12-16,219.44000244140625,221.9199981689453,219.41000366210938,221.50999450683594
1053
+ 2024-12-17,220.77000427246094,221.24000549316406,219.85000610351562,220.5800018310547
1054
+ 2024-12-18,220.25,220.9739990234375,212.0,212.63999938964844
1055
+ 2024-12-19,214.52999877929688,214.74000549316406,211.5030059814453,211.6199951171875
1056
+ 2024-12-20,210.1199951171875,216.02000427246094,209.6999969482422,213.5399932861328
1057
+ 2024-12-23,213.86000061035156,215.39999389648438,212.49000549316406,215.27999877929688
1058
+ 2024-12-24,216.07000732421875,218.22000122070312,215.85000610351562,218.2100067138672
1059
+ 2024-12-26,217.5,218.6999969482422,216.72999572753906,218.0399932861328
1060
+ 2024-12-27,216.5500030517578,216.72999572753906,213.1999969482422,215.14999389648438
1061
+ 2024-12-30,212.22000122070312,213.77000427246094,210.75999450683594,212.25999450683594
1062
+ 2024-12-31,212.8000030517578,213.10000610351562,210.0800018310547,210.4499969482422
1063
+ 2025-01-02,211.75,212.6750030517578,208.1999969482422,210.0500030517578
1064
+ 2025-01-03,211.35000610351562,213.92799377441406,211.0,213.4600067138672
1065
+ 2025-01-06,215.72000122070312,217.322998046875,214.9199981689453,215.92999267578125
1066
+ 2025-01-07,216.47999572753906,216.5,211.32000732421875,212.08999633789062
1067
+ 2025-01-08,212.0500030517578,212.77699279785156,210.25999450683594,212.1699981689453
1068
+ 2025-01-10,210.5800018310547,210.58999633789062,207.5,208.85000610351562
1069
+ 2025-01-13,206.33999633789062,208.30999755859375,205.73800659179688,208.13999938964844
1070
+ 2025-01-14,209.5500030517578,210.0,206.52000427246094,207.9499969482422
1071
+ 2025-01-15,211.1999969482422,213.19000244140625,210.66000366210938,212.66000366210938
1072
+ 2025-01-16,213.67999267578125,213.6999969482422,211.1999969482422,211.22000122070312
1073
+ 2025-01-17,215.2100067138672,215.49000549316406,213.63999938964844,214.77999877929688
1074
+ 2025-01-21,215.97000122070312,216.53900146484375,214.125,216.10000610351562
1075
+ 2025-01-22,218.00999450683594,219.75999450683594,217.89999389648438,218.8300018310547
1076
+ 2025-01-23,217.77999877929688,219.32000732421875,217.5800018310547,219.30999755859375
1077
+ 2025-01-24,219.42999267578125,219.77000427246094,217.4499969482422,218.0500030517578
1078
+ 2025-01-27,210.39999389648438,213.25,210.0399932861328,211.7100067138672
1079
+ 2025-01-28,212.17999267578125,215.32000732421875,210.6999969482422,214.80999755859375
1080
+ 2025-01-29,215.1199951171875,215.1300048828125,212.8000030517578,214.44000244140625
1081
+ 2025-01-30,215.63499450683594,216.5800018310547,213.3800048828125,215.33999633789062
1082
+ 2025-01-31,216.9199981689453,218.82000732421875,214.58999633789062,214.99000549316406
1083
+ 2025-02-03,211.4199981689453,214.4149932861328,210.4199981689453,213.30999755859375
1084
+ 2025-02-04,213.52000427246094,216.19500732421875,213.36000061035156,215.9499969482422
1085
+ 2025-02-05,214.83999633789062,216.96499633789062,214.39500427246094,216.89999389648438
1086
+ 2025-02-06,217.07000732421875,218.1300048828125,216.47000122070312,218.0399932861328
1087
+ 2025-02-07,218.27000427246094,219.0749969482422,214.9949951171875,215.35000610351562
1088
+ 2025-02-10,217.05999755859375,218.32000732421875,216.8699951171875,217.86000061035156
1089
+ 2025-02-11,216.5500030517578,218.1199951171875,216.5,217.39999389648438
1090
+ 2025-02-12,215.0500030517578,217.875,214.89999389648438,217.5399932861328
1091
+ 2025-02-13,218.22000122070312,220.75,217.88999938964844,220.61000061035156
1092
+ 2025-02-14,220.7100067138672,221.8300018310547,220.5500030517578,221.55999755859375
1093
+ 2025-02-18,222.22000122070312,222.27999877929688,220.6999969482422,222.08999633789062
1094
+ 2025-02-19,221.75999450683594,222.63999938964844,220.8800048828125,222.10000610351562
1095
+ 2025-02-20,221.7899932861328,221.92999267578125,219.2449951171875,221.17999267578125
1096
+ 2025-02-21,221.6300048828125,221.6300048828125,216.4499969482422,216.61000061035156
1097
+ 2025-02-24,217.3300018310547,217.7899932861328,213.88999938964844,214.0399932861328
1098
+ 2025-02-25,213.76499938964844,213.80999755859375,209.7830047607422,211.3699951171875
1099
+ 2025-02-26,212.25999450683594,213.94000244140625,210.5800018310547,211.8800048828125
1100
+ 2025-02-27,213.3000030517578,213.6999969482422,205.89999389648438,206.0500030517578
1101
+ 2025-02-28,205.91000366210938,209.44000244140625,204.5800018310547,209.25999450683594
1102
+ 2025-03-03,210.60000610351562,211.1999969482422,203.20199584960938,204.75
1103
+ 2025-03-04,203.47000122070312,207.36000061035156,200.77000427246094,204.02000427246094
1104
+ 2025-03-05,204.25999450683594,207.32000732421875,202.27000427246094,206.63999938964844
1105
+ 2025-03-06,203.27000427246094,205.25,200.17999267578125,201.05999755859375
1106
+ 2025-03-07,200.55999755859375,203.07000732421875,197.89999389648438,202.5
1107
+ 2025-03-10,199.02999877929688,199.25,192.9499969482422,194.8699951171875
1108
+ 2025-03-11,194.39999389648438,197.10000610351562,192.3000030517578,194.1300048828125
1109
+ 2025-03-12,197.27999877929688,198.03900146484375,194.25,196.3800048828125
1110
+ 2025-03-13,196.0800018310547,196.0800018310547,192.02999877929688,192.82000732421875
1111
+ 2025-03-14,195.02000427246094,197.82000732421875,194.80999755859375,197.47999572753906
1112
+ 2025-03-17,197.4600067138672,200.02000427246094,196.74000549316406,198.75999450683594
1113
+ 2025-03-18,197.3699951171875,197.3800048828125,194.49000549316406,195.47999572753906
1114
+ 2025-03-19,196.3000030517578,199.78500366210938,195.52000427246094,197.99000549316406
1115
+ 2025-03-20,196.35000610351562,199.47500610351562,196.093994140625,197.3000030517578
1116
+ 2025-03-21,195.13999938964844,198.25999450683594,194.77000427246094,198.00999450683594
1117
+ 2025-03-24,200.82000732421875,202.32000732421875,200.5260009765625,201.8800048828125
1118
+ 2025-03-25,202.30999755859375,203.19000244140625,201.89999389648438,203.1300048828125
1119
+ 2025-03-26,202.69000244140625,202.99000549316406,198.80799865722656,199.4199981689453
1120
+ 2025-03-27,198.58999633789062,200.27999877929688,197.7100067138672,198.24000549316406
1121
+ 2025-03-28,197.52999877929688,197.8000030517578,192.72000122070312,193.0800018310547
1122
+ 2025-03-31,190.19000244140625,193.42999267578125,188.2899932861328,193.02000427246094
1123
+ 2025-04-01,192.36000061035156,194.9550018310547,191.22000122070312,194.60000610351562
1124
+ 2025-04-02,191.92999267578125,197.4149932861328,191.89999389648438,196.0
1125
+ 2025-04-03,187.89999389648438,189.3800048828125,185.35000610351562,185.6300048828125
1126
+ 2025-04-04,180.30999755859375,181.3000030517578,174.24000549316406,174.27999877929688
1127
+ 2025-04-07,168.1300048828125,182.41000366210938,165.72000122070312,174.50999450683594
1128
+ 2025-04-08,180.44000244140625,182.4199981689453,168.81500244140625,171.39999389648438
1129
+ 2025-04-09,171.1199951171875,192.58999633789062,171.0500030517578,191.52000427246094
1130
+ 2025-04-10,186.75999450683594,187.50999450683594,178.13999938964844,183.75
1131
+ 2025-04-11,183.19000244140625,187.61000061035156,181.7100067138672,187.02000427246094
1132
+ 2025-04-14,191.3000030517578,191.42999267578125,186.36000061035156,188.4199981689453
1133
+ 2025-04-15,188.75999450683594,190.32000732421875,187.88999938964844,188.5800018310547
1134
+ 2025-04-16,184.86000061035156,186.33999633789062,180.25,182.89999389648438
1135
+ 2025-04-17,184.07000732421875,184.35000610351562,181.74000549316406,182.86000061035156
1136
+ 2025-04-21,180.44000244140625,180.77999877929688,176.19000244140625,178.39999389648438
1137
+ 2025-04-22,180.6999969482422,184.27000427246094,180.17999267578125,183.0
1138
+ 2025-04-23,188.63999938964844,190.7689971923828,186.4600067138672,187.07000732421875
1139
+ 2025-04-24,187.94000244140625,192.5500030517578,187.6999969482422,192.3800048828125
1140
+ 2025-04-25,192.25999450683594,194.77000427246094,191.63800048828125,194.55999755859375
1141
+ 2025-04-28,194.74000549316406,195.49000549316406,191.91000366210938,194.50999450683594
1142
+ 2025-04-29,193.67999267578125,196.16900634765625,193.35000610351562,195.80999755859375
1143
+ 2025-04-30,192.3699951171875,196.44000244140625,190.42999267578125,195.85000610351562
1144
+ 2025-05-01,199.02000427246094,200.56500244140625,197.94000244140625,198.14999389648438
1145
+ 2025-05-02,200.32000732421875,202.1199951171875,199.6300048828125,201.24000549316406
1146
+ 2025-05-05,199.53500366210938,201.3699951171875,199.36000061035156,200.1199951171875
1147
+ 2025-05-06,197.4600067138672,199.67999267578125,196.89999389648438,198.2100067138672
1148
+ 2025-05-07,198.49000549316406,200.0,196.36000061035156,199.02000427246094
1149
+ 2025-05-08,201.11000061035156,202.83999633789062,199.36000061035156,201.02999877929688
1150
+ 2025-05-09,201.8800048828125,202.35499572753906,200.1699981689453,200.9600067138672
notebooks/stock_data/SGOL.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/SOL-USD.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/TLT.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/TSLA.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/^DJI.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/^GSPC.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/^IXIC.csv ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/stock_data/^NDX.csv ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt CHANGED
@@ -5,4 +5,5 @@ plotly==5.19.0
5
  python-dotenv==1.0.1
6
  numpy==1.26.4
7
  requests==2.31.0
8
- beautifulsoup4==4.12.3
 
 
5
  python-dotenv==1.0.1
6
  numpy==1.26.4
7
  requests==2.31.0
8
+ beautifulsoup4==4.12.3
9
+ finance-datareader==0.9.96