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

如何在CVXPY中设置条件约束?以凸投资组合优化问题为例

在CVXPY中设置条件约束的方法

当然可以在CVXPY里设置条件约束啦!不过要敲黑板提醒一下:CVXPY是专门做凸优化的工具,所以你添加的约束必须是凸约束才行——要是是非凸的(比如某些非线性的奇怪条件),它可处理不来,这时候要么调整问题形式,要么换个工具试试。

结合你给出的投资组合优化代码,我先把代码补全,再给你举几个实用的条件约束例子,都是适配你的场景的:

先把你的基础代码补全

你之前的代码没写完,我先把框架完善好,方便后续加约束:

from cvxpy import *
import numpy as np

np.random.seed(1)
n = 10
# 构造正定协方差矩阵(模拟资产风险)
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)
# 定义权重变量
w = Variable(n)
# 模拟资产预期收益
mu = np.abs(np.random.randn(n, 1))
# 组合预期收益和风险
ret = mu.T @ w
risk = quad_form(w, Sigma)
# 你给出的初始权重参考
orig_w = [0.15,0.2,0.2,0.2,0.2,0.05,0.0,0.0,0.0,0.0]

# 定义风险收益权衡的参数(补全你没写完的部分)
lambda_ret = Parameter(sign='positive', value=5)  # 收益的权重
lambda_risk = Parameter(sign='positive', value=1) # 风险的权重

# 目标函数:最大化 收益加权值 - 风险加权值(经典的风险收益权衡)
objective = Maximize(lambda_ret * ret - lambda_risk * risk)

实用的条件约束示例

下面是几种适合投资组合场景的约束,都是CVXPY支持的凸约束:

1. 权重上下限约束

比如你想参考orig_w,要求前几个资产的权重不能低于初始值,或者限制某个资产的权重上限:

# 先初始化约束列表
constraints = []
# 约束1:所有权重非负(不允许卖空)
constraints.append(w >= 0)
# 约束2:前5个资产的权重不低于orig_w里的对应值
constraints += [w[i] >= orig_w[i] for i in range(5)]
# 约束3:第6个资产的权重不能超过0.1
constraints.append(w[5] <= 0.1)

2. 预算约束(权重和为1)

这是投资组合的基础约束,毕竟你不能把超过100%的资金投进去:

constraints.append(sum(w) == 1)

3. 风险上限约束

如果你想控制组合的最大风险(方差),可以加这个:

# 要求组合方差不超过0.5
constraints.append(risk <= 0.5)

4. 收益下限约束

要是你有最低收益要求,直接给预期收益设个下限就行:

# 组合预期收益至少要达到0.8
constraints.append(ret >= 0.8)

5. 稀疏性约束(模仿orig_w的零权重)

如果你想让后几个资产尽量保持零权重(也就是只投部分资产),可以用L1范数约束来诱导稀疏性:

# 权重的L1范数不超过1.2(结合非负约束,会让部分权重趋近于0)
constraints.append(norm(w, 1) <= 1.2)

求解并查看结果

加完约束后,就可以构建问题并求解了:

prob = Problem(objective, constraints)
prob.solve()

# 打印结果,保留4位小数
print("最优权重:", [round(val, 4) for val in w.value])
print("最优组合收益:", round(ret.value.item(), 4))
print("最优组合风险(方差):", round(risk.value.item(), 4))

小提醒

  • 一定要确保约束是凸的!比如像w[i] * w[j] <= 0这种非凸约束,CVXPY会直接报错,这种情况得想办法转化或者放弃。
  • 如果实在要处理非凸约束,可能得用近似方法,或者换用非凸优化工具。

内容的提问来源于stack exchange,提问作者ThatQuantDude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:17:42