Python 如何使用cvxopt进行带约束的均值-方差优化?

Python 如何使用cvxopt进行带约束的均值-方差优化?,python,math,mathematical-optimization,cvxopt,Python,Math,Mathematical Optimization,Cvxopt,我能够使用cvxopt计算有效边界,根据文档: 但是,我不知道如何添加约束,以便特定资产的最大允许权重有一个上限。使用cvxopt是否可能 这是迄今为止我的代码,它生成了一个没有约束的有效边界,除了我相信b,它将权重的最大和设置为1。我不确定G、h、A和mus是做什么的,文档也没有真正解释。mus公式中的10**(5.0*t/N-1.0)从何而来 from math import sqrt from cvxopt import matrix from cvxopt.blas import do

我能够使用cvxopt计算有效边界,根据文档:

但是,我不知道如何添加约束,以便特定资产的最大允许权重有一个上限。使用cvxopt是否可能

这是迄今为止我的代码,它生成了一个没有约束的有效边界,除了我相信b,它将权重的最大和设置为1。我不确定G、h、A和mus是做什么的,文档也没有真正解释。mus公式中的10**(5.0*t/N-1.0)从何而来

from math import sqrt
from cvxopt import matrix
from cvxopt.blas import dot 
from cvxopt.solvers import qp, options 

# Number of assets
n = 4
# Convariance matrix
S = matrix( [[ 4e-2,  6e-3, -4e-3,   0.0 ], 
             [ 6e-3,  1e-2,  0.0,    0.0 ],
             [-4e-3,  0.0,   2.5e-3, 0.0 ],
             [ 0.0,   0.0,   0.0,    0.0 ]] )
# Expected return
pbar = matrix([.12, .10, .07, .03])

# nxn matrix of 0s
G = matrix(0.0, (n,n))
# Convert G to negative identity matrix
G[::n+1] = -1.0
# nx1 matrix of 0s
h = matrix(0.0, (n,1))
# 1xn matrix of 1s
A = matrix(1.0, (1,n))
# scalar of 1.0
b = matrix(1.0)

N = 100
mus = [ 10**(5.0*t/N-1.0) for t in range(N) ]
options['show_progress'] = False
xs = [ qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus ]
returns = [ dot(pbar,x) for x in xs ]
risks = [ sqrt(dot(x, S*x)) for x in xs ]

#Efficient frontier
plt.plot(risks, returns)

您正在使用cvxopt包的二次规划解算器,请查看

从公式中可以看出,
Gx=h
乘以-1

上述条件将所有资产设置为介于0%和100%之间的边界,这是常见的无卖空条件


您使用的公式如下:您的
mu
在维基百科文章中是
q
,因此是一个风险容忍度参数。将其附加到协方差或返回目标函数的一部分实际上并不重要。这只意味着,对于
mu
的每个值,您要么从右上角走到左下角,要么从另一个方向走。所以这只是一个函数,它能让你承受从很小到很大的风险。我认为这是一个错误,因为该系列从0.1开始,但实际上应该从0开始。

主要是组织你的ineq和eq约束,例如,如果你想允许卖空2项资产,那么-1我认为标记为正确的回答实际上给出了一个不正确的示例。covxopt矩阵是以列为主的。所以样本G和h需要进行转置

我知道这很古老,但在任何地方都很难找到一个好的约束均值-方差示例

约束部分不是这样工作的

在这种情况下,G Mat应为4 X 4,h应为1 X 4,如下所示 如果需要最小阈值,可以在“h”矩阵中输入,如下例所示(20%)。然而,我无法添加最大约束

G = matrix([[-1.0, 0.0, 0.0, 0.0],
       [0.0, -1.0, 0.0, 0.0],
       [0.0, 0.0, -1.0, 0.0],
       [0.0, 0.0, 0.0, -1.0]])


 h = matrix([-0.2, 0.0, 0.0, 0.0])

您能否更直观地说明如何选择矩阵
G
h
?如何为前两个资产添加单独的约束?如何为资产1+资产2的权重之和添加约束?欢迎使用stackoverflow。请注意,您的答案更像是对先前答案的评论,而不是针对原始问题。请参阅。感谢您提供的信息,但我无法对之前的答案发表评论,因为我的声誉不足50%。
G = matrix([[-1.0, 0.0, 0.0, 0.0],
       [0.0, -1.0, 0.0, 0.0],
       [0.0, 0.0, -1.0, 0.0],
       [0.0, 0.0, 0.0, -1.0]])


 h = matrix([-0.2, 0.0, 0.0, 0.0])