本文介绍了试图解决凸极小化/二进制规划问题时的CVXPY错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试解决我提交给QSE的一个问题,https://quant.stackexchange.com/questions/65680/find-k-of-n-assets-that-minimize-the-correlation-matrix/,但我在使用cvxpy库时遇到了一个问题。也就是说,我认为这是一个凸二进制规划问题,cvxpy的意思是;不遵循DCP规则。 我试图解决的问题是:从给定的10种风险资产中,找出相关性最小的5种资产。我目前解决这个问题的方法是
- 抓取每项资产的收益
- 查找这些回报的相关矩阵
C
- 将凸优化问题表示为
x
是二进制向量x
的条目总和为5C' = transpose(C * x) * x
是一个矩阵,当i
的第i
项为0(否则不为零)时,i
的第i
行和第i
列为零。注:我想知道这是否就是我的问题所在。这是我能想到的从关联矩阵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
我还尝试了一些不起作用的方法,包括
- 使用cvxp变量矩阵
X
,该矩阵具有布尔和对称cvxpy属性。如果它是对称的,并且每行总和为5,那么我就有一个矩阵,我可以对其进行逐个元素的乘法,以求出C'
。这不起作用,因为一个变量只允许有一个属性(奇怪的cvxpy限制)。 - 使用cvxp可变二进制矩阵
X
和cvxp可变对称矩阵Y
,并包括X == Y
的约束(以绕过两个属性的限制)。我不记得为什么这个不起作用了。
使用cvxp可变二进制矩阵 - 我还尝试使用非二进制cvxpy变量向量
x
,并尝试将x
的i
值约束为0或1,但约束x[i] == 0 || x[i] == 1
因||
而无效--我也找不到cvxpy逻辑或条件。
X
,并限制每行的和为5且第1行等于第1列。我在这方面遇到了麻烦,因为测试X[i] == X[:i]
会产生一个布尔数组,而我不知道如何用cvxpy来减少它。
- 确定这是否是cvxpy可以解决的问题。如果不是,我如何才能将其更改为从根本上解决我想要的问题?如果是cvxpy可以解决的问题
- 如何处理当前代码以更正其问题?
感谢您抽出时间。
推荐答案
我认为C‘不是矩阵,而是标量:
transpose(C * x) * x = (Cx)'x=x'C'x=x'Cx
(我在这里用‘转置’),所以平方和没有多大意义?
您的问题是否只是基数约束的投资组合问题?
或精简:
min x'Cx
sum(x) = k
x ∈ {0,1}
与x中的选定资产对应的C的行和列是您要查找的子矩阵。
这篇关于试图解决凸极小化/二进制规划问题时的CVXPY错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!