Я пытаюсь оптимизировать вектор двоичного портфеля, чтобы он был лучше, чем эталон, используя 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.
Спасибо!