我正试图解决我提交给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
是一个矩阵,其中{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
我还尝试用一些不起作用的方式重新表述这个问题,包括
X
。如果它是对称的,并且每行和为5,那么我有一个矩阵,我可以对它进行元素乘法,以找到C'
。这不起作用,因为一个变量只允许有一个属性(奇怪的cvxpy限制)李>X
和cvxp变量对称矩阵Y
,并包括X == Y
的约束(以绕过2属性限制)。我不记得为什么这不起作用了李>X
,并约束每i
行的和为5,并且第i
行等于第j
列。我在这方面遇到了麻烦,因为测试X[i] == X[:i]
会产生一个布尔数组,我不知道如何使用cvxpy减少它李>x
,并试图将x
的第i
个值约束为0或1,但约束x[i] == 0 || x[i] == 1
无效,因为||
--我也找不到cvxpy逻辑或条件李>所以我试着用几种不同的方式来重新表述,但每种策略都会遇到问题。我想知道是否有人能帮我
谢谢你抽出时间
我认为C'不是矩阵,而是标量:
(我在这里使用“转置”)所以这个的平方和没有多大意义
您的问题可能只是基数约束的投资组合问题吗
或简化:
与x中所选资产对应的C行和列是您要查找的子矩阵
相关问题 更多 >
编程相关推荐