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

如何在最小化支出与最大化收益间找最优解?CVXPY维度错误排查

解决CVXPY中quad_form参数维度无效错误的方案

错误原因

quad_form(x, C)对参数维度有严格要求:

  • x必须是列向量
  • C必须是和x维度匹配的对称正定方阵(比如x是2维列向量,C就得是2×2的矩阵)
    常见踩坑点:
  • 变量x默认定义成行向量(比如cvxpy.Variable(2)是1行2列)
  • 协方差矩阵C的维度和x不匹配(比如只算了单资产的方差,得到1×1矩阵)
  • 计算协方差时没处理好,导致C不是对称矩阵

解决步骤

1. 修正变量x的定义

直接指定x为列向量,针对体育场和赌场两个资产的场景:

x = cvxpy.Variable((2, 1))

2. 确保协方差矩阵C的维度正确

假设你的DataFrame包含Stadium和Casino两列月度收支数据,正确计算协方差矩阵:

# df是你的收支数据DataFrame
C = df.cov().values
# 检查形状,应该输出(2, 2)
print(C.shape)

如果形状不对,说明数据处理有误(比如只提取了一列数据),重新检查数据导入和筛选步骤。

3. 重新调用quad_form

确保x是列向量、C是对应维度的方阵后,再执行risk = cvxpy.quad_form(x, C)就不会触发维度错误。

完整可运行示例

import pandas as pd
import cvxpy as cp

# 替换成你的真实月度收支数据
data = {
    "Stadium": [12000, 15000, 11000, 13000, 14500],
    "Casino": [8000, 9500, 7800, 8500, 9200]
}
df = pd.DataFrame(data)

# 定义2个资产的权重变量(列向量)
x = cp.Variable((2, 1))

# 计算2×2的协方差矩阵
C = df.cov().values

# 定义风险项
risk = cp.quad_form(x, C)

# 计算预期收益
expected_return = df.mean().values @ x

# 设置约束:权重和为1,不能做空(权重非负)
constraints = [cp.sum(x) == 1, x >= 0]

# 目标:最小化风险,同时保证收益不低于设定阈值
target_return = 12000
prob = cp.Problem(cp.Minimize(risk), [expected_return >= target_return] + constraints)

# 求解优化问题
prob.solve()

# 输出结果
print("最优分配权重:", x.value.flatten())
print("最小风险值:", risk.value)
print("实际预期收益:", expected_return.value[0])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12