Mar-10-2024, 06:09 PM
(This post was last modified: Mar-11-2024, 09:20 PM by deanhystad.)
I have been coding this bad boy for a long fucking time, started python recently more finance related stuff but i cannot get this MF to work like i spent so much time and i just do not even know anymore
the file is attached but imma write it here anyway, first time doingthis also i dunno just to be safe :
it runs fine until the plotting part where it says:
KeyError Traceback (most recent call last)
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3653, in Index.get_loc(self, key)
3652 try:
-> 3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:
File ~\anaconda3\Lib\site-packages\pandas\_libs\index.pyx:147, in pandas._libs.index.IndexEngine.get_loc()
File ~\anaconda3\Lib\site-packages\pandas\_libs\index.pyx:155, in pandas._libs.index.IndexEngine.get_loc()
File pandas\_libs\index_class_helper.pxi:70, in pandas._libs.index.Int64Engine._check_type()
KeyError: 'Volatility'
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
Cell In[44], line 2
1 portfolios = pd.DataFrame(pfolio_returns, pfolio_volatility)
----> 2 portfolios.plot(x="Volatility", y="Returns", kind="scatter", figsize=(10,6))
File ~\anaconda3\Lib\site-packages\pandas\plotting\_core.py:920, in PlotAccessor.__call__(self, *args, **kwargs)
918 if kind in self._dataframe_kinds:
919 if isinstance(data, ABCDataFrame):
--> 920 return plot_backend.plot(data, x=x, y=y, kind=kind, **kwargs)
921 else:
922 raise ValueError(f"plot kind {kind} can only be used for data frames")
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\__init__.py:71, in plot(data, kind, **kwargs)
69 kwargs["ax"] = getattr(ax, "left_ax", ax)
70 plot_obj = PLOT_CLASSES[kind](data, **kwargs)
---> 71 plot_obj.generate()
72 plot_obj.draw()
73 return plot_obj.result
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\core.py:448, in MPLPlot.generate(self)
446 self._compute_plot_data()
447 self._setup_subplots()
--> 448 self._make_plot()
449 self._add_table()
450 self._make_legend()
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\core.py:1259, in ScatterPlot._make_plot(self)
1256 else:
1257 label = None
1258 scatter = ax.scatter(
-> 1259 data[x].values,
1260 data[y].values,
1261 c=c_values,
1262 label=label,
1263 cmap=cmap,
1264 norm=norm,
1265 **self.kwds,
1266 )
1267 if cb:
1268 cbar_label = c if c_is_column else ""
File ~\anaconda3\Lib\site-packages\pandas\core\frame.py:3761, in DataFrame.__getitem__(self, key)
3759 if self.columns.nlevels > 1:
3760 return self._getitem_multilevel(key)
-> 3761 indexer = self.columns.get_loc(key)
3762 if is_integer(indexer):
3763 indexer = [indexer]
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3655, in Index.get_loc(self, key)
3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:
-> 3655 raise KeyError(key) from err
3656 except TypeError:
3657 # If we have a listlike key, _check_indexing_error will raise
3658 # InvalidIndexError. Otherwise we fall through and re-raise
3659 # the TypeError.
3660 self._check_indexing_error(key)
KeyError: 'Volatility'
the file is attached but imma write it here anyway, first time doingthis also i dunno just to be safe :
it runs fine until the plotting part where it says:
KeyError Traceback (most recent call last)
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3653, in Index.get_loc(self, key)
3652 try:
-> 3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:
File ~\anaconda3\Lib\site-packages\pandas\_libs\index.pyx:147, in pandas._libs.index.IndexEngine.get_loc()
File ~\anaconda3\Lib\site-packages\pandas\_libs\index.pyx:155, in pandas._libs.index.IndexEngine.get_loc()
File pandas\_libs\index_class_helper.pxi:70, in pandas._libs.index.Int64Engine._check_type()
KeyError: 'Volatility'
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
Cell In[44], line 2
1 portfolios = pd.DataFrame(pfolio_returns, pfolio_volatility)
----> 2 portfolios.plot(x="Volatility", y="Returns", kind="scatter", figsize=(10,6))
File ~\anaconda3\Lib\site-packages\pandas\plotting\_core.py:920, in PlotAccessor.__call__(self, *args, **kwargs)
918 if kind in self._dataframe_kinds:
919 if isinstance(data, ABCDataFrame):
--> 920 return plot_backend.plot(data, x=x, y=y, kind=kind, **kwargs)
921 else:
922 raise ValueError(f"plot kind {kind} can only be used for data frames")
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\__init__.py:71, in plot(data, kind, **kwargs)
69 kwargs["ax"] = getattr(ax, "left_ax", ax)
70 plot_obj = PLOT_CLASSES[kind](data, **kwargs)
---> 71 plot_obj.generate()
72 plot_obj.draw()
73 return plot_obj.result
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\core.py:448, in MPLPlot.generate(self)
446 self._compute_plot_data()
447 self._setup_subplots()
--> 448 self._make_plot()
449 self._add_table()
450 self._make_legend()
File ~\anaconda3\Lib\site-packages\pandas\plotting\_matplotlib\core.py:1259, in ScatterPlot._make_plot(self)
1256 else:
1257 label = None
1258 scatter = ax.scatter(
-> 1259 data[x].values,
1260 data[y].values,
1261 c=c_values,
1262 label=label,
1263 cmap=cmap,
1264 norm=norm,
1265 **self.kwds,
1266 )
1267 if cb:
1268 cbar_label = c if c_is_column else ""
File ~\anaconda3\Lib\site-packages\pandas\core\frame.py:3761, in DataFrame.__getitem__(self, key)
3759 if self.columns.nlevels > 1:
3760 return self._getitem_multilevel(key)
-> 3761 indexer = self.columns.get_loc(key)
3762 if is_integer(indexer):
3763 indexer = [indexer]
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3655, in Index.get_loc(self, key)
3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:
-> 3655 raise KeyError(key) from err
3656 except TypeError:
3657 # If we have a listlike key, _check_indexing_error will raise
3658 # InvalidIndexError. Otherwise we fall through and re-raise
3659 # the TypeError.
3660 self._check_indexing_error(key)
KeyError: 'Volatility'
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import yfinance as yf
import matplotlib.pyplot as plt
yf.pdr_override()
# Download and calculate market data
Market_data = wb.get_data_yahoo("ITOT", start="2012-1-1")["Adj Close"]
Market_return = np.log(Market_data / Market_data.shift(1))
Market_var = Market_return.var() * 250
# Define asset lists
ESIT = ["ESIT.L", "ITOT"]
BRK_B = ["BRK-B", "ITOT"]
CIBR = ["CIBR", "ITOT"]
NEER = ["NEE", "ITOT"]
COLOP = ["CBHD.F", "ITOT"]
# Download asset data in separate DataFrames
data_ESIT = pd.DataFrame()
for a in ESIT:
data_ESIT[a] = wb.get_data_yahoo(a, start="2012-1-1")["Adj Close"]
data_BRK_B = pd.DataFrame()
for t in BRK_B:
data_BRK_B[t] = wb.get_data_yahoo(t, start="2012-1-1")["Adj Close"]
data_CIBR = pd.DataFrame()
for t in CIBR:
data_CIBR[t] = wb.get_data_yahoo(t, start="2012-1-1")["Adj Close"]
data_NEER = pd.DataFrame()
for t in NEER:
data_NEER[t] = wb.get_data_yahoo(t, start="2012-1-1")["Adj Close"]
data_COLOP = pd.DataFrame()
for t in COLOP:
data_COLOP[t] = wb.get_data_yahoo(t, start="2012-1-1")["Adj Close"]
# Calculate past returns for each asset
ESIT_past_returns = np.log(data_ESIT / data_ESIT.shift(1))
BRK_B_past_returns = np.log(data_BRK_B / data_BRK_B.shift(1))
CIBR_past_returns = np.log(data_CIBR / data_CIBR.shift(1))
NEER_past_returns = np.log(data_NEER / data_NEER.shift(1))
COLOP_past_returns = np.log(data_COLOP / data_COLOP.shift(1))
# Calculate covariance matrices and betas
ESIT_cov_matrix_a = ESIT_past_returns.cov() * 250
ESIT_cov_with_market = ESIT_cov_matrix_a.iloc[0, 1]
ESIT_BETA = ESIT_cov_with_market / Market_var
BRK_B_cov_matrix_a = BRK_B_past_returns.cov() * 250
BRK_B_cov_with_market = BRK_B_cov_matrix_a.iloc[0, 1]
BRK_B_BETA = BRK_B_cov_with_market / Market_var
CIBR_cov_matrix_a = CIBR_past_returns.cov() * 250
CIBR_cov_with_market = CIBR_cov_matrix_a.iloc[0, 1]
CIBR_BETA = CIBR_cov_with_market / Market_var
NEER_cov_matrix_a = NEER_past_returns.cov() * 250
NEER_cov_with_market = NEER_cov_matrix_a.iloc[0, 1]
NEER_BETA = NEER_cov_with_market / Market_var
COLOP_cov_matrix_a = COLOP_past_returns.cov() * 250
COLOP_cov_with_market = COLOP_cov_matrix_a.iloc[0, 1]
COLOP_BETA = COLOP_cov_with_market / Market_var
# Calculate CAPMs
ESIT_CAPM = 0.0426 + ESIT_BETA * (0.0129)
BRK_B_CAPM = 0.0426 + BRK_B_BETA * (0.0460)
CIBR_CAPM = 0.0426 + CIBR_BETA * (0.0460)
NEER_CAPM = 0.0426 + NEER_BETA * (0.0460)
COLOP_CAPM = 0.0426 + COLOP_BETA * (0.0129)
# List CAPMs and Assets
CAPMs = [ESIT_CAPM, BRK_B_CAPM, CIBR_CAPM, NEER_CAPM, COLOP_CAPM]
Assets = ["ESIT.L", "BRK-B", "CIBR", "NEE", "CBHD.F"]
Assets_Returns = CAPMs
# Download data for correlation matrix
data_for_corr = pd.DataFrame()
for t in Assets:
data_for_corr[t] = wb.get_data_yahoo(t, start="2012-1-1")["Adj Close"]
log_returns = np.log(data_for_corr / data_for_corr.shift(1))
print(log_returns.corr()) # Calculate and display correlation matrix
# Simulate efficient frontier portfolios
pfolio_returns = []
pfolio_volatility = []
for x in range(1000):
weights = np.random.random(5)
weights /= np.sum(weights)
pfolio_returns.append(np.sum(weights * Assets_Returns))
pfolio_volatility.append(np.sqrt(np.dot(weights.T, np.dot(weights * Assets_Returns, weights))))
pfolio_returns = np.array(pfolio_returns)
pfolio_volatility = np.array(pfolio_volatility)
# Create DataFrame and plot
portfolios = pd.DataFrame({"Returns": pfolio_returns, "Volatility": pfolio_volatility})
portfolios.plot(x="Volatility", y="Returns", kind="scatter", figsize=(10,6))
plt.show() # Add plt.show() to display the plot
Attached Files
