问题描述
我正在尝试解决我提交给 QSE https://quant.stackexchange.com/questions/65680/find-k-of-n-assets-that-minimize-the-correlation-matrix/ 的问题,但是我在使用 cvxpy 库时遇到了问题。也就是说,我认为这是一个凸二进制编程问题,cvxpy 说的是“不遵循 DCP 规则”。
我要解决的问题是:“从给定的 10 种风险资产中,找出相关性最低的 5 种”。我目前解决这个问题的方法是
- 获取每项资产的回报
- 找出这些回报的相关矩阵
C
- 将凸优化问题公式化为
以下是我目前的非工作代码。
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
并尝试将i
的x
th 值限制为 0 或1 但约束x[i] == 0 || x[i] == 1
由于||
而无效--我也找不到 cvxpy 逻辑或条件。
所以我尝试以几种不同的方式重新制定这一点,但我一直遇到每种策略的问题。我想知道是否有人可以帮助我
感谢您的时间。
解决方法
我认为 C' 不是矩阵而是标量:
transpose(C * x) * x = (Cx)'x=x'C'x=x'Cx
(我在这里使用 ' 进行转置)所以这个平方和没有多大意义?
您的问题可能只是基数约束的投资组合问题吗?
或精简:
min x'Cx
sum(x) = k
x ∈ {0,1}
x中选中资产对应的C行和列就是你要找的子矩阵。