前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多因子模型之组合构建与优化器(下)

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

作者头像
钱塘小甲子
发布2019-01-28 10:37:29
1K0
发布2019-01-28 10:37:29
举报

1.不等式约束

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

subjectto.Axb

subject to. A^{'}x \leq b 其中,

A=⎛⎝⎜⎜⎜⎜⎜⎜1u1−1001u20−101u300−1⎞⎠⎟⎟⎟⎟⎟⎟

A = \left( \begin{array}{ccc} 1 & 1 & 1 \\ u_1 & u_2 & u_3\\ -1 &0&0\\ 0&-1&0\\ 0&0&-1\end{array} \right)

b=⎛⎝⎜⎜⎜⎜⎜⎜10.150−0.10⎞⎠⎟⎟⎟⎟⎟⎟

b = \left( \begin{array}{ccc} 1\\ 0.15\\ 0\\ -0.1\\ 0\end{array} \right) 当然,这个时候就没有解析解了,我们需要用到python的一个凸优化的包来解决这个问题。

2.cvxopt optmizer

大家可以查看一下cvxopt这个包的官网,http://cvxopt.org/install/index.html 按照官网的方法按照cvxopt似乎是不可以的,我们可以在下面的网站下载wheel,然后安装。 http://www.lfd.uci.edu/~gohlke/pythonlibs/#cvxopt 对于cvxopt这个包而言,他的优化通式是这样的:

min12xTPx+qTx

min \quad \frac{1}{2}x^TPx+q^Tx

s.t.Gxh

s.t. \quad Gx\leq h

Ax=b

\qquad Ax=b 言下之意,就是我们要构建这几个矩阵:P,q,G,h,A,b

代码语言:javascript
复制
from cvxopt import matrix
from cvxopt import solvers

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

代码语言:javascript
复制
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.不等式优化

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

代码语言:javascript
复制
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] 结果如上,这就是我们不等式条件下的优化结果。 既然如此,还是老样子,画有效前沿吧。

代码语言:javascript
复制
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')

结果如下:

不等式约束有效前沿
不等式约束有效前沿

我们之所以要先讲述组合构建和优化器,是因为,接下来我们将进行最最具有艺术的两个部分,就是我们前面提到的收益率预测模型和股票直接协方差矩阵,也就是风险模型。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.不等式约束
  • 2.cvxopt optmizer
  • 3.不等式优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档