You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:15:09