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

2024-10-04 01:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图解决我提交给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是一个矩阵,其中{}的第{}行和第{}列在x的第i项为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, 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减少它
  • 我还尝试使用一个-二进制cvxpy变量向量x,并试图将x的第i个值约束为0或1,但约束x[i] == 0 || x[i] == 1无效,因为||--我也找不到cvxpy逻辑或条件

所以我试着用几种不同的方式来重新表述,但每种策略都会遇到问题。我想知道是否有人能帮我

  1. 确定这是否是cvxpy可以解决的问题。如果不是,我如何改变它来解决我想要的问题?如果这是cvxpy可以解决的问题
  2. 如何使用当前代码纠正其问题

谢谢你抽出时间


Tags: importdatetime属性asdt二进制not矩阵
1条回答
网友
1楼 · 发布于 2024-10-04 01:26:39

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

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

(我在这里使用“转置”)所以这个的平方和没有多大意义

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

或简化:

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

与x中所选资产对应的C行和列是您要查找的子矩阵

相关问题 更多 >