我能够使用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)
答案 0 :(得分:5)
您正在使用cvxopt软件包的二次规划求解器,请查看documentation。
从公式可以看出,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]])
请注意,第一行是通过乘以-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需要转置。