如何在最小化支出与最大化收益间找最优解?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
相关产品推荐
相关产品推荐

