Я написал небольшой код для простой оптимизации минимальной дисперсии с помощью CVXOPT, вы можете увидеть весь код ниже
Используя solvers.qp (P, q, G, h, A, b) в CVXOPT код работает нормально, и он находит решение
solvers.qp(P, q, G, h, A, b)
Я тоже хотел попробовать другой решатель, поэтому я использовал MOSEK, решая ту же проблему со следующими параметрами
solvers.qp(P, q, G, h, A, b, solver='mosek')
При использовании solver = 'mosek' код не может быть запущен и выдает следующую ошибку
Ошибка MOSEK 1295: квадратичная матрица коэффициентов c в задаче не является положительной полуопределенной, как и ожидалось для задачи минимизации
Может кто-нибудь объяснить, почему я получил эту ошибку (я что-то неправильно кодировал?) И есть ли обходной путь для решения проблемы, с которой я сталкиваюсь с MOSEK
import numpy as np
import cvxopt as opt
import mosek
from cvxopt import matrix, solvers
def optimize_portfolio(n, Var_Cov):
P = opt.matrix (Var_Cov)
q = opt.matrix(np.matrix(np.zeros((n, 1))))
G = opt.matrix(np.array(-np.identity(n)))
h = opt.matrix(np.zeros((n,1)))
A = opt.matrix(1.0, (1,n))
b = opt.matrix(1.0)
# Finding a solution
sol = solvers.qp(P, q, G, h, A, b, solver='mosek')
return sol
### Parameters setup
Var_Cov = np.loadtxt('C:\VAR_COV.txt')
n = len (Var_Cov)
### solve
solution = optimize_portfolio(n, Var_Cov)
# Save Results
Port_Opt = np.matrix(solution['x'])