我正在尝试使用 scipy.optimize.minimize 最小化资产组合的风险度量。这是通过改变每项资产的权重来最小化风险度量(在本例中称为 ES)来实现的。我已经成功尝试了 scipy.optimize 几次,但是当我运行优化器时,它会将我的权重向量变成一个数字,我不知道为什么......
我设置了任意权重,当我在要最小化的函数中打印权重时,它显示为单个数字
代码:
def ES_calc_sum(pi_bad, weights, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha):
print(weights)
sum = np.sum(risk_contribution(pi_bad, weights, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha))
return sum
weights = np.array([0.5,0.25,0.25])
def RC_minimizer(target_vol, weights, pi_bad, mu_good_vector,
mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha):
bnds = Bounds(0, 1)
cont = ({"type": "eq", "fun": lambda x: np.sum(x) - 1},
{"type": "eq", "fun": lambda x: ((1 - pi_bad) * np.sqrt(x @ cov_good_matrix @ x) + pi_bad * np.sqrt(x @ cov_bad_matrix @ x) - target_vol})
res = minimize(ES_calc_sum, x0 = weights, args = (pi_bad, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha), method="SLSQP", bounds=bnds, constraints=cont, tol=0.0001)
w_opt = res.x
return w_opt
错误:
ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
帮助将不胜感激,因为此代码将用于我的硕士论文
尝试在不断变化的权重下最小化度量。