Portfolio optimization

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:

For calculation of variance you define another time=i,expected return must same time parameter,I tried in the same for loop,but did not successfull

Yesterday I thought that the problem was due to not showing the same times, sigma and expected returns.
I defined mu as follows,same time with sigma

n_slices = 3
slices = np.array_split(data[stocks], n_slices)
muu_ =
for i, slice_df in enumerate(slices):
for_mu=expected_returns.mean_historical_return(slice_df[stocks]).to_frame()
for_mu.reset_index(inplace=True)
for_mu.columns = [‘Asset’,“Return”]
for_mu[“Time”] = i # Add new column with the index of the slice
muu_.append(for_mu)
mu=pd.concat(muu_)
mu.set_index([“Time”, “Return”], inplace=True)
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;
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()

ampl.get_data("w").to_pandas().plot.barh()

Then I got still

Here I changed the sigma and your slicing is equal to my case,new_df=slices,but I got error,why?
tau=11#window size
out_of_sample_results_list =
from pypfopt import expected_returns, risk_models
cv = TimeSeriesSplit(max_train_size=11, test_size=1)
for train_index, test_index in cv.split(data):
#in_sample_data = data[‘^GSPC’][t - tau : t]
#print(in_sample_data)
#out_of_sample_data =data[‘^GSPC’][t : t + 1]
#risk_aversion=ml(final_data)
# Specify the number of asse
# Specify the number of assets, their expected return, and their covariance matrix.
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].iloc[train_index]
#stocks_out_sample=data[stocks][t : t + 1]
#mu_out=calculate_returns(stocks_out_sample)

mu = calculate_returns(stocks_in_sample)

#n_slices = 3#3 tane 11 li data
slices_ = data[stocks].iloc[train_index]#5train
slices_test=data[stocks].iloc[test_index]
#print(slices)

mu=slices_.diff()[1:] / slices_.shift(1)[1:]#weekly return,time as date

Assuming df is your DataFrame

column_names = slices_.columns.tolist()  # Get column names as a list

Convert DataFrame to NumPy array

data_array = slices_.to_numpy()

Now, you can create a new DataFrame with the NumPy array and set the column names

new_df = pd.DataFrame(data_array, columns=column_names, index=slices_.index.copy())

#print(new_df)
dfs = []
for i, slice_df in enumerate(new_df):#her I can t add stock names
    df = risk_models.risk_matrix(new_df[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)
print(sigma)
risk_aversion=ml(final_data)

print(risk_aversion)#gives 5 time array

ampl = AMPL()
ampl.eval(
    r"""
   set Time;
   set A;
   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(11)
ampl.param["Sigma"] = sigma
#ampl.param["u"] = {t: 0 for t in stocks} # just a placeholder, u needs to be calculated
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]"))

my sigma = I have 5 sigma,


your sigma was:

many rows,why?