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

bob*_*645 5 python math mathematical-optimization cvxopt

我可以使用cvxopt来计算一个有效的边界,根据文档:

http://cvxopt.org/examples/book/portfolio.html

但是,我无法弄清楚如何添加约束,以便特定资产的最大允许权重存在上限.使用cvxopt可以吗?

这是我的代码到目前为止生成一个没有约束的有效边界,除了我相信b,它将权重的最大总和设置为1.我不确定G,h,A和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)
Run Code Online (Sandbox Code Playgroud)

Fel*_*ein 5

您正在使用cvxopt软件包的二次编程求解器,请查看文档.

从公式中可以看出,Gx <= h不等式约束和Ax = b等式约束.G并且A是矩阵,h而且是b和矢量.

假设您想要将第一个资产限制为2%到5%之间的权重,您可以按如下方式进行表述:

G = matrix([[-1, 0, 0, 0],
            [ 1, 0, 0, 0]])

h = matrix([[-0.02],
            [0.05]])
Run Code Online (Sandbox Code Playgroud)

请注意,第一行是将不等式条件Gx >= h乘以-1.

您上面的条件将所有资产设置为0%到100%之间的界限,这是常见的无卖空条件.

您使用的公式解释在这里:你muq维基百科的文章,因此风险容忍参数英寸 如果将其附加到目标函数的协方差或返回部分,则无关紧要.它只是意味着你要么从右上角走到左下角,要么反过来为每个值mu.因此,它只是一个功能,可以为您提供从非常小到非常大的风险承受能力.我认为有一个错误,因为该系列从0.1开始,但应该从0开始.