【发布时间】:2020-02-24 04:46:49
【问题描述】:
我正在尝试使用 CVXPY 优化二元投资组合向量,使其大于基准。
import cvxpy as cp
import numpy as np
# Generate a random non-trivial quadratic program.
n = 10 # number of options
np.random.seed(1)
mu = np.random.randn(n) # expected means
var_covar = np.random.randn(n,n) # variance-covariance matrix
var_covar = var_covar.T.dot(var_covar) # cont'd
bench_cov = np.random.randn(n) # n-length vector of cov(benchmark, returns)
lamd = 0.01 # risk tolerance
# Define and solve the CVXPY problem.
x = cp.Variable(n, boolean=True)
prob = cp.Problem(cp.Maximize(mu.T@x + lamd * (cp.quad_form(x, var_covar) - (2 * bench_cov.T@x))), [cp.sum(x) == 4])
prob.solve()
我使用 CVXPY 版本 1.1.0a0(直接从 github 下载)收到此错误:
DCPError:问题不符合 DCP 规则。具体来说:
目标不是 DCP,尽管每个子表达式都是。
你试图最大化一个凸函数。
根据我的阅读,最大化凸函数非常困难,但我从一篇论文中得到了这个方程。我想我一定是做错了,因为我是二次规划和 CVXPY 的新手。
谢谢!
【问题讨论】:
-
最大化凸函数是一个非-凸问题。 CVXPY 中的非凸问题很难解决。
-
@RodrigodeAzevedo 你知道我可能会看一个不同的库吗?或者也许是一种使这个问题变得凸出的方法?
-
不应该在 SO 上问数学问题。试试scicomp.stackexchange.com(有一个CVXPY标签)。
-
非凸 QP 很困难,需要全局求解器(例如 Baron、Couenne、Antigone、Cplex)。还有一个有趣的重新表述为 MIP 问题(基本上形成了 KKT 条件)。
标签: python cvxpy quadratic-programming