如何在scipy.optimize.minimize中添加最低收益约束优化资产组合
资产组合最小方差优化:添加预期收益约束
要实现第三个约束(组合预期收益至少6%),只需通过LinearConstraint新增一个线性约束,指定组合预期收益的下限即可。以下是修改后的完整代码:
import numpy as np from scipy.optimize import minimize from scipy.optimize import LinearConstraint from scipy.optimize import Bounds # 预期收益数组(4种资产) e = np.array([0.06, 0.053, 0.07, 0.08]) # 协方差矩阵 V = np.array([[0.0224, 0.0184, 0.025, 0.0288], [0.0184, 0.0223, 0.0275, 0.0299], [0.025, 0.0275, 0.0403, 0.0438], [0.0288, 0.0299, 0.0438, 0.0515]]) # 初始权重 w = np.array([0.25, 0.25, 0.25, 0.25]) # 目标函数:最小化组合方差 def portfolio_variance(w, V): return w.T @ V @ w # 约束1:权重总和等于1 sum_weights = LinearConstraint([1, 1, 1, 1], [1], [1]) # 约束2:单个资产权重非负(0 ≤ w_i ≤ 1) bounds = Bounds([0, 0, 0, 0], [1, 1, 1, 1]) # 约束3:组合预期收益至少为6%(w.T @ e ≥ 0.06) return_constraint = LinearConstraint(e, [0.06], [np.inf]) # 执行优化:加入所有约束 res = minimize(portfolio_variance, w, args=V, method='trust-constr', constraints=[sum_weights, return_constraint], bounds=bounds) # 输出结果 print("最优权重:", res.x) print("最小方差:", round(res.fun * 100, 3), "%") print("标准差:", round(np.sqrt(res.fun) * 100, 2), "%")
关键修改说明
新增的return_constraint约束通过LinearConstraint实现:
- 第一个参数
e是预期收益数组,对应线性表达式w.T @ e - 第二个参数
[0.06]是约束的下限(组合收益≥6%) - 第三个参数
[np.inf]是约束的上限(不限制收益上限)
运行代码后,输出结果会和你Excel建模的预期值一致:方差约2.217%,标准差约14.89%。
内容的提问来源于stack exchange,提问作者bgsbnny
相关产品推荐
相关产品推荐

