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)
您正在使用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]])
请注意,第一行是将不等式条件Gx >= h乘以-1.
您上面的条件将所有资产设置为0%到100%之间的界限,这是常见的无卖空条件.
您使用的公式解释在这里:你mu是q维基百科的文章,因此风险容忍参数英寸 如果将其附加到目标函数的协方差或返回部分,则无关紧要.它只是意味着你要么从右上角走到左下角,要么反过来为每个值mu.因此,它只是一个功能,可以为您提供从非常小到非常大的风险承受能力.我认为有一个错误,因为该系列从0.1开始,但应该从0开始.