试图解决凸极小化/二进制规划问题时的CVXPY错误

CVXPY error when trying to solve a convex minimization / binary programming problem(试图解决凸极小化/二进制规划问题时的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是一个矩阵,当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可变二进制矩阵X,并限制每行的和为5且第1行等于第1列。我在这方面遇到了麻烦,因为测试X[i] == X[:i]会产生一个布尔数组,而我不知道如何用cvxpy来减少它。
  • 我还尝试使用二进制cvxpy变量向量x,并尝试将xi值约束为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的行和列是您要查找的子矩阵。

这篇关于试图解决凸极小化/二进制规划问题时的CVXPY错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:试图解决凸极小化/二进制规划问题时的CVXPY错误

基础教程推荐