我写了一个小代码来使用 CVXOPT 做一个简单的最小方差优化,你可以在下面看到整个代码
通过在 CVXOPT 中使用solvers.qp(P, q, G, h, A, b),代码运行良好并且找到了解决方案
solvers.qp(P, q, G, h, A, b)
我也想尝试不同的求解器,因此我使用 MOSEK 通过以下参数解决相同的问题
solvers.qp(P, q, G, h, A, b, solver='mosek')
使用solver='mosek'时,代码无法运行,它给了我以下错误
MOSEK 错误 1295:目标中的二次系数矩阵不是正半定的,正如最小化问题所期望的那样
谁能解释我为什么会出现这个错误(我是否以错误的方式编码?)以及是否有解决方法来解决我在 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'])