I could not find a solution for adding for i, slice_df in enumerate(stocks_in_sample.values). I take as a sample 33 data row ,I adjust slices=3 for getting 11 data each,I need mu=expected returns with time parameter right now so mu is one dimension,I can use pct_change return instead of,I changed mu,but still I got error.
I define:
Create a function to calculate returns
def calculate_returns(assets):
assets[“Date”] = assets.index.format()
assets.set_index(“Date”, inplace=True)
return assets.pct_change().dropna()*100
Then my code as follows:
tau=11#window size
out_of_sample_results_list =
from pypfopt import expected_returns, risk_models
for t in range(tau, len(data)):
in_sample_data = data[‘^GSPC’][t - tau : t]
#print(in_sample_data)
out_of_sample_data =data[‘^GSPC’][t : t + 1]
#print(out_of_sample_data)
stocks = [
‘HD’, ‘MCD’, ‘NKE’, ‘KO’, ‘PG’, ‘SYY’, ‘WMT’, # Consumer Staples
‘CVX’, ‘XOM’, # Energy
‘AXP’, ‘JPM’, # Financials
‘JNJ’, ‘MRK’, ‘PFE’, ‘WBA’, # Health Care
‘BA’, ‘CAT’, ‘MMM’, # Industrials
‘IRX’,# Information Technology#t-bill
]
stocks_in_sample = data[stocks][t - tau : t]
stocks_out_sample=data[stocks][t : t + 1]
mu_out=calculate_returns(stocks_out_sample)
mu = calculate_returns(stocks_in_sample)
n_slices = 3#It gives 3 times 11 data in each
slices = np.array_split(data[stocks], n_slices)
dfs = []
for i, slice_df in enumerate(slices):
df = risk_models.risk_matrix(slice_df, method="sample_cov").stack().to_frame()
df.reset_index(inplace=True) # Turn the index into regular data columns
df.columns = ["Stock1", "Stock2", "S"] # Adjust column names
df["Time"] = i # Add new column with the index of the slice
dfs.append(df)
sigma = pd.concat(dfs) # Concatenate all dataframes
sigma.set_index(["Time", "Stock1", "Stock2"], inplace=True) # Set the index to be (Time, Stock1, Stock2)
ampl = AMPL()
ampl.eval(
r"""
set Time;
set A ordered;
param Sigma{t in Time, A, A};
param mu{Time,A};
param lb default 0;
param ub default 1;
var w{Time,A} >= lb <= ub;
minimize average_portfolio_variance:
(sum {t in Time} sum {i in A, j in A} w[t,i] * Sigma[t, i, j] * w[t,j]);
s.t. portfolio_weights:
sum {t in Time} sum{i in A} w[t,i] = 1;
"""
)
ampl.set["A"] = stocks
ampl.set["Time"]=range(n_slices)
ampl.param["Sigma"] = sigma
ampl.param["mu"]=mu
ampl.option["solver"] = "gurobi"
ampl.solve()
print("optimal variance:", ampl.get_value("portfolio_variance"))
Var_min=ampl.get_value("sum {t in Time}sum {i in A, j in A} w[t,i] * Sigma[t,i, j] * w[t,j]")
R_min = ampl.get_value("sum {t in Time}sum {i in A} mu[t,i] * w[t,i]")
print("min variance:", ampl.get_value("sum {t in Time}sum {i in A, j in A} w[t,i] * Sigma[t,i, j] * w[t,j]")
print("min return:", ampl.get_value("sum {t in Time}sum {i in A} mu[t,i] * w[t,i]")
ampl.get_data("w").to_pandas().plot.barh()
Error: