0

我写了一个小代码来使用 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'])
4

0 回答 0