微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试解决凸最小化/二进制规划问题时出现 CVXPY 错误

如何解决尝试解决凸最小化/二进制规划问题时出现 CVXPY 错误

我正在尝试解决我提交给 QSE https://quant.stackexchange.com/questions/65680/find-k-of-n-assets-that-minimize-the-correlation-matrix/ 的问题,但是我在使用 cvxpy 库时遇到了问题。也就是说,我认为这是一个凸二进制编程问题,cvxpy 说的是“不遵循 DCP 规则”。

我要解决的问题是:“从给定的 10 种风险资产中,找出相关性最低的 5 种”。我目前解决这个问题的方法

  1. 获取每项资产的回报
  2. 找出这些回报的相关矩阵 C
  3. 将凸优化问题公式化为
    • x一个二元向量
    • x 的条目总和为 5
    • C' = transpose(C * x) * x一个矩阵,其中 ii 行和 C 列在第 i 个条目时“归零” x 的值为 0(否则不为零)。注意:我想知道这是否是我的问题出现的地方。这是我从相关矩阵 C删除与“被拒绝”资产对应的条目的最佳方法
    • 最后,我想最小化 C' 的平方和。这将为我提供类似于相关性最低的 5 个资产的投资组合。

以下是我目前的非工作代码

import pandas as pd
import pandas_datareader as web
import datetime as dt
import cvxpy as cvx

stocks = ['SHW','GOOG','AMZN','WMT','XOM','JNJ','UPS','AMT','AAPL','NEE']
start = dt.datetime(2015,1,1)
end = dt.datetime(2020,1)
d = web.DataReader(stocks,'yahoo',start,end)['Adj Close']
corr = d.corr().to_numpy()

x = cvx.Variable(len(stocks),boolean=True)
cost = cvx.sum_squares((corr @ x).T @ x)
prob = cvx.Problem(cvx.Minimize(cost),[cvx.sum(x) == 5])
prob.solve(solver='ECOS_BB')

以及它产生的错误

DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP. Its following subexpressions are not:

# The corr array

我还尝试以多种无效的方式重新表述这一点,包括

  • 使用具有布尔和对称 cvxpy 属性的 cvxp 变量矩阵 X。如果它是对称的并且每行总和为 5,那么我有一个矩阵,我可以对其进行元素乘法以找到 C'。这不起作用,因为一个变量只允许一个属性(奇怪的 cvxpy 限制)。
  • 使用 cvxp 可变二元矩阵 X 和 cvxp 可变对称矩阵 Y包括 X == Y 约束(绕过 2 属性限制)。我不记得为什么这不起作用。
  • 使用 cvxp 变量二进制矩阵 X 和约束条件,即每 i 行的总和为 5 并且第 i 行等于 j柱子。我遇到了这个问题,因为测试 X[i] == X[:i]生成一个布尔数组,我不知道如何使用 cvxpy 减少它。
  • 我还尝试使用 non-binary cvxpy 变量向量 x 并尝试将 ixth 值限制为 0 或1 但约束 x[i] == 0 || x[i] == 1 由于 || 而无效--我也找不到 cvxpy 逻辑或条件。

所以我尝试以几种不同的方式重新制定这一点,但我一直遇到每种策略的问题。我想知道是否有人可以帮助我

  1. 确定这是否真的是 cvxpy 可以解决的问题。如果不是,我怎样才能改变它来解决我想要的问题?如果是cvxpy可以解决的问题
  2. 我可以用我当前的代码做些什么来纠正它的问题?

感谢您的时间。

解决方法

我认为 C' 不是矩阵而是标量:

transpose(C * x) * x = (Cx)'x=x'C'x=x'Cx

(我在这里使用 ' 进行转置)所以这个平方和没有多大意义?

您的问题可能只是基数约束的投资组合问题吗?

或精简:

  min x'Cx
  sum(x) = k
  x ∈ {0,1}

x中选中资产对应的C行和列就是你要找的子矩阵。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。