多因子模型之组合构建与优化器(下)

1.不等式约束

前面咱们讨论了等式约束下的状况,那么若是有不等式约束呢?好比,咱们不能作空股票,那么就要求每个股票的权重都要大于1,或者对于特定的股票咱们给予特殊的权重的设定等等。
这里,咱们就假设咱们设置两个不等式约束:
不能作空
股票s2的权重要要大于等于0.1.
这个时候,咱们的约束条件就是:
html

subjectto.Axb

其中,
A=1u11001u20101u3001

b=10.1500.10

固然,这个时候就没有解析解了,咱们须要用到python的一个凸优化的包来解决这个问题。

2.cvxopt optmizer

你们能够查看一下cvxopt这个包的官网,http://cvxopt.org/install/index.html
按照官网的方法按照cvxopt彷佛是不能够的,咱们能够在下面的网站下载wheel,而后安装。
http://www.lfd.uci.edu/~gohlke/pythonlibs/#cvxopt
对于cvxopt这个包而言,他的优化通式是这样的:
python

min12xTPx+qTx

s.t.Gxh

Ax=b

言下之意,就是咱们要构建这几个矩阵:P,q,G,h,A,b

from cvxopt import matrix
from cvxopt import solvers

cvxopt 中自带matrix数据结构,要注意,这个和咱们前面对矩阵的表达不同,这里一个list表明的是一个列,而不是行。web

P = matrix([[0.100162,0.045864,0.005712],[0.045864,0.210773,0.028283],[0.005712,0.028283,0.066884]])
q = matrix([0.0,0.0,0.0])
A = matrix([[1.0,1.0,1.0], [0.100162,0.164244,0.182082]]).T
b = matrix([1.0, 0.15])
sol = solvers.qp(P,q,A=A,b=b)
print sol['x']

结果以下:
[ 3.83e-01]
[ 3.97e-02]
[ 5.77e-01]
咱们发现,优化器优化出来的结构和咱们前面的用拉格朗日乘子法算出来的是同样的。而后,咱们来算不等式约束吧。数据结构

3.不等式优化

咱们根据一开始的情景来进行不等式优化。app

P = matrix([[0.100162,0.045864,0.005712],[0.045864,0.210773,0.028283],[0.005712,0.028283,0.066884]])
q = matrix([0.0,0.0,0.0])
G = matrix([[0.0,-1.0,0.0], [-1.0,0.0,0.0],[0.0,0.0,-1.0]])
h = matrix([-0.1,0.0,0.0])
A = matrix([[1.0,1.0,1.0], [0.100162,0.164244,0.182082]]).T
b = matrix([1.0, 0.15])
sol = solvers.qp(P,q,G=G, h=h, A=A,b=b)
print sol['x']

[ 3.70e-01]
[ 1.00e-01]
[ 5.30e-01]
结果如上,这就是咱们不等式条件下的优化结果。
既然如此,仍是老样子,画有效前沿吧。svg

return_list = list()
risk_list = list()
P = matrix([[0.100162,0.045864,0.005712],[0.045864,0.210773,0.028283],[0.005712,0.028283,0.066884]])
q = matrix([0.0,0.0,0.0])
G = matrix([[0.0,-1.0,0.0], [-1.0,0.0,0.0],[0.0,0.0,-1.0]])
h = matrix([-0.1,0.0,0.0])
A = matrix([[1.0,1.0,1.0], [0.100162,0.164244,0.182082]]).T
for i in range(1, 100):
    up = i/1000.0
    b = matrix([1.0, up])
    sol = solvers.qp(P,q,G=G, h=h, A=A,b=b)
    w = np.matrix([sol['x'][0], sol['x'][1], sol['x'][2]]).T
    return_list.append((A_matrix * w)[1,0])
    risk_list.append((w.T * cov_matrix * w)[0,0])
plot_df = pd.DataFrame()
plot_df['return'] = return_list
plot_df['risk'] = risk_list
plot_df.plot.scatter(x='risk', y='return')

结果以下:
不等式约束有效前沿
咱们之因此要先讲述组合构建和优化器,是由于,接下来咱们将进行最最具备艺术的两个部分,就是咱们前面提到的收益率预测模型和股票直接协方差矩阵,也就是风险模型。优化

本文同步分享在 博客“钱塘小甲子”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。网站

相关文章
相关标签/搜索