Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	
		prasanth.thangavel
		
	commited on
		
		
					Commit 
							
							Β·
						
						2d9f266
	
1
								Parent(s):
							
							9a14443
								
Minor updates
Browse files- README.md +3 -0
- app.py +598 -293
- app_archived_v1.py +329 -0
- notebooks/download-stock-tickers.ipynb +1025 -0
- notebooks/scratchpad.ipynb +0 -0
- notebooks/stock_data/A35.SI.csv +0 -0
- notebooks/stock_data/AAPL.csv +0 -0
- notebooks/stock_data/AMZN.csv +0 -0
- notebooks/stock_data/BTC-USD.csv +0 -0
- notebooks/stock_data/DOGE-USD.csv +0 -0
- notebooks/stock_data/ETH-USD.csv +0 -0
- notebooks/stock_data/GLD.csv +0 -0
- notebooks/stock_data/GOOGL.csv +0 -0
- notebooks/stock_data/IAU.csv +0 -0
- notebooks/stock_data/META.csv +0 -0
- notebooks/stock_data/MSFT.csv +0 -0
- notebooks/stock_data/NFLX.csv +0 -0
- notebooks/stock_data/NVDA.csv +0 -0
- notebooks/stock_data/ONEQ.csv +0 -0
- notebooks/stock_data/PHYS.csv +0 -0
- notebooks/stock_data/QQQ.csv +0 -0
- notebooks/stock_data/QQQM.csv +1150 -0
- notebooks/stock_data/SGOL.csv +0 -0
- notebooks/stock_data/SOL-USD.csv +0 -0
- notebooks/stock_data/TLT.csv +0 -0
- notebooks/stock_data/TSLA.csv +0 -0
- notebooks/stock_data/^DJI.csv +0 -0
- notebooks/stock_data/^GSPC.csv +0 -0
- notebooks/stock_data/^IXIC.csv +0 -0
- notebooks/stock_data/^NDX.csv +0 -0
- requirements.txt +2 -1
    	
        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( | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 25 |  | 
| 26 | 
             
            # Title and description
         | 
| 27 | 
             
            st.title("Asset Class Performance Comparison")
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            #  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
            #  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                " | 
| 49 | 
            -
                 | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
                 | 
| 73 | 
            -
                 | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 81 | 
             
                    ]
         | 
| 82 | 
            -
            )
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 83 |  | 
| 84 | 
            -
            #  | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
            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 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
            for  | 
| 136 | 
            -
                 | 
| 137 | 
            -
                 | 
| 138 | 
            -
                 | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
                     | 
| 142 | 
            -
                     | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
             | 
| 147 | 
            -
                    hdb_values = calculate_hdb_returns(asset_start, asset_end, initial_investment)
         | 
| 148 | 
            -
                    if hdb_values is not None:
         | 
| 149 | 
             
                        if currency == "SGD":
         | 
| 150 | 
            -
                             | 
| 151 | 
            -
                        asset_series[asset] =  | 
| 152 | 
             
                        actual_start_dates[asset] = asset_start
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 153 | 
             
                    else:
         | 
| 154 | 
            -
                         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 155 | 
             
                else:
         | 
| 156 | 
            -
                     | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 168 | 
             
                    else:
         | 
| 169 | 
            -
                         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 170 |  | 
| 171 | 
            -
            #  | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 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 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
            st. | 
| 215 | 
            -
             | 
| 216 | 
            -
             | 
| 217 | 
            -
                 | 
| 218 | 
            -
                 | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 223 |  | 
| 224 | 
            -
                     | 
| 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 | 
            -
                     | 
| 232 | 
            -
             | 
| 233 | 
            -
             | 
| 234 | 
            -
             | 
| 235 | 
            -
             | 
| 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 | 
            -
                     | 
| 311 | 
            -
                     | 
|  | |
| 312 |  | 
| 313 | 
            -
                     | 
| 314 | 
            -
                     | 
| 315 | 
            -
                     | 
| 316 | 
            -
                     | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 317 |  | 
| 318 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 319 | 
             
                else:
         | 
| 320 | 
            -
                    st. | 
| 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&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
         |