I'm trying to optimize a binary portfolio vector to be greater than a benchmark using 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()
I get this error using CVXPY version 1.1.0a0 (downloaded directly from github):
DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP, even though each sub-expression is.
You are trying to maximize a function that is convex.
From what I've read maximizing a convex function is very difficult, but I got this equation from a paper that solves the same equation using Gurobi's BQP solver. I figure I must be doing something wrong as I'm new to quadratic programming and CVXPY.