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

时间:2014-05-23 15:38:34

标签: 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)

4 个答案:

答案 0 :(得分:5)

您正在使用cvxopt软件包的二次规划求解器,请查看documentation

从公式可以看出,Gx <= h是不等式约束,Ax = b是等式约束。 GA是矩阵,而hb是向量。

假设您想要将第一项资产限制为2%到5%之间的权重,您可以按照以下方式制定:

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

h = matrix([[-0.02],
            [0.05]])

请注意,第一行是通过乘以-1将不等式条件转换为Gx >= h

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

您使用的公式已解释为here:您的mu在维基百科文章中为q,因此也是一个风险承受能力参数。如果将它附加到目标函数的协方差或返回部分,这并不重要。这只是意味着您要么从右上角走到左下角,要么为mu的每个值走另一条路。所以它只是一个能够从非常小到非常大的风险承受能力的功能。我认为有一个错误,因为系列从0.1开始,但应该从0开始。

答案 1 :(得分:1)

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

约束部分不能那样工作;

在这种情况下,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])

答案 2 :(得分:0)

主要是组织你的ineq和eq约束,例如,如果你想允许卖空2个资产然后-1&lt; = x(i)&lt; = 1并且sum(x(i))= 1。因此解决ineq,一个有4个ineq,所以G必须是4x2而h是4x1。检查... G = [I / -I]其中I是1,即G = [[1,0],[0,1],[ - 1,0],[0,-1]] xs [x1 ,x2]和h = [1,1,1,1]如果你使用Gx&lt; = h你得到x1&lt; = 1,x2&lt; = 1 x1&gt; = - 1并且x2&gt; = - 1 /。平等时间是Ax = b,b = 1和A = [1,1] .. aagin检查它,x1 + x2 = 1匹配约束。 P和Q你已经有了。你现在准备解决了。

答案 3 :(得分:0)

我认为标记为正确的回复实际上给出了错误的示例.covxopt矩阵是列专业化的。因此样本G和h需要转置。