JoinQuant量化课堂 发布于2016-05-21
回复 35
浏览 22924
85
**导语**银行股量化选股即通过对盈利性指标、资本约束及稳健指标、以及资本回拨系数来对一个公司进行评判得出一个综合打分之后根据分数进行证券买卖和仓位管理。本文借鉴了雪球大V云蒙的策略已经作者授权。
$ $
```
规范源码已更新请大家克隆研究。
本文由JoinQuant量化课堂推出 。难度标签为进阶上理解深度标签level-0
作者 Haozun
编辑 宏观经济算命师
```
$ $
相信大家已经对怎么构建量化策略有了一个初步的了解。我们已经学习了基本的技术面择时策略以及基本面多因子选股还学习了怎么样利用JoinQuant平台去构建海龟这样的成熟交易系统。但是大家肯定会问我们平时想不到什么好策略怎么办啊解决办法之一就是看大V
什么意思呢就是说有很多金融论坛的大V都在专栏中发表了自己的投资策略那我们就可以在看懂这些公开出来的成熟策略后自己在JoinQuant的平台实现该策略进行回测检验。简单来说就是下面的三步
![1.png][1]
这篇文章中我们借鉴了雪球大V云蒙的策略:[银行股量化指标选股][2]。雪球大V神采飞扬以善于投资银行股著称搬砖运动的倡导者和发扬者。我们先来看一下云蒙在她的文章里提出的思路
1、盈利性指标2011-2015年加权平均净资产收益率分别为21.75%、24.17%、24.78%、23.12%、19.28%和17.09%按照1:2:3:4:5:6的权重加起来除于21得到一个6年加权净资产收益率这个值为20.75%。考虑银行同质化相对严重以80分为标杆40分给予线性对比40分给予同质化这个盈利性指标就是ROE*200+40这个值为81.51。
2、资本约束及稳健指标考虑杠杆风险用核心资本充足率来衡量由于目前银行整体系统性风险还是较小每相对8.5%多一个点给予2%的溢价。招商银行年报核心资本充足率为10.83%10.83%-8.5%*2+1=1.0466。
3、资本回拨系数严格保守一点80%的不良贷款损失掉40%的关注类贷款损失掉80%的逾期超90天损失掉40%的逾期90天内损失掉考虑逾期和这个关注不良是重复的除于2就能得到拨备还剩余多少或亏欠多少。然后再扣掉25%的税收比上股东权益就可以统一得到一个资本回拨系数也就是拨备盈亏情况也就是拨备总额-0.580%不良贷款+40%关注贷款+80%超90天逾期+40天内逾期*0.75/普通股股东权益+1。招商银行拨备总额为848亿关注贷款738亿不良贷款474亿90天内逾期为354亿超90天逾期和重组贷款为495亿普通股股东权益为3608亿计算下来就是1.0504。
4、年报财报评分为81.51×1.0466×1.0504=89.61分。
5、年报数据比较全面模型能最佳展示对于季报没有公布的关注贷款按照不良贷款的同比增加对于逾期重组贷款指标继续用年报数据对于当年净资产收益率用当期同比乘去年全年数据这样一季报也能给予评分盈利性指标评分为78.20资本约束指标为1.0645。资本回拨系数为6.45%一季报评分89.29分。
6、4月30日A股市净率1.181倍H股市净率0.946倍。用财报的评分去除于市净率A股的评分为89.29/1.181=75.6分H股的评分为89.29/0.946=94.4分。到这一步模型都是盲评的是根据静态数据算出来的也就是按照指标财报评分是都是单位估值评分为多少这个就是性价比也是能够横向对比的值。
**评分说明请看下图**
![3.png][3]
$ $
**评分导入**
由于我们需要自己进行分数的计算我们的结果是储存在一个CSV文件中我们使用的格式如下。
![5.png][4]
那么要怎么在回测中使用这个CSV文件中的数据呢大家可以戳链接[读取文件][5] 密码g9y9
具体步骤我们首先要在研究模块上传我们的CSV文件点击upload选择相应文件。
![12.png][6]
之后在我们的回测中使用下列命令就可以读取数据。
```
from pandas import Series, DataFrame
from six import StringIO
g.data_body = read_file("bankshares.csv")
g.rating_data = pd.read_csv(StringIO(g.data_body))
```
$ $
**策略构建**
我们已经构建出了一个评级的指数接下来要做的全部事情就是根据这个评级指数进行买卖调仓。
1. 一共有16只银行股我们从中选出num=4只加入我们的投资组合。
2. 每当有财务报表更新时我们的评级指数也会发生变化这时就要判断是否要对仓位进行调整。始终保持选择评级最高的num=4只股票加入我们的投资组合。但是这里要注意我们只有当能赚到k=3%的利润时才会进行调仓也就是说假设原先的前4名是A,B,C,D。现在的前四名是A,B,C,E。只有当E的评级指数比D高3%以上时我们才会进行调仓。具体操作见下图。
3. 每当排名发生变化时从新考虑是否满足超过3%的条件满足则再次调仓。
4. 对于这num=4只股票我们会为他们分配一个权重初始权重按照评分从高到低为4:3:2:1之后的权重调整见下图。我们将按照这个权重分配全部的资产即假设一共有100万的资产则如果当前的四只股票比例为4:3:2:1则第一只股票买100*4/(1+2+3+4)万元。
**评分与调仓**
这算是云蒙的策略在实际实践时的一个小麻烦我们下面详细的讲解一下具体做法。
假设原始的评分最高4只股票为A100分B95分C80分D60分所以权重为A4B3C2D1。经过新一轮的重新评分后假设最高的4项为A110分B100分D85分C75分。则AB的排名没有变化不用去管D上升到了第三名所以理论上D应该增加一份C应该减少一份。但我们要先判断一下D=85分是否比C=80分上升了3%以上计算后发现是大于3%的所以D增加一份C减少一份。最后为A4B3D2C1。当股票数目更多时我们就要对多组股票的分数进行比较这里遵循一个原则始终从右面开始比较具体什么叫从右面开始比较呢我们看下图。
$ $
**示例1**
当从新排序后我们发现顺序发生变化。我们遵循从右边开始的原则发现现在排在第四位的股票有两份因为上一期排在第三而这个位置理论上只应该有一份。所以我们又遵循从右边开始的原则看第四只股票往左数的第一只即第三只股票判断一下是否超过了3%若超过则按红线所示移动一份的份额。
![6.png][7]
**示例2**
从右边开始看发现第四只股票份额不对应该有一份但实际有三份因为上一期排在第二所以看他左边第一只第三只是否少份数发现不少。则再向左一只第二只发现他少两份则比较是否超过3%若超过则从第四只移动两份的份额到第二只。
![7.png][8]
![9.png][9]
**示例3**
从右边开始看起发现第四只的理论份额和实际份额不符多两份看他的左数第一只第三只发现不少份数再往左看一只第二只同样不少份数。再往左看一只第一只发现少。则比较是否满足3%原则满足则第四只移动两份到第一只。
![8.png][10]
结束后看第三只发现份数正确。结束后看第二只发现多一份往左数一只第一只发现少一份。如果满足3%原则则第二只往第一只移动一份的份数。
![3-2.png][11]
从上面的例子我们可以看出如果有的时候个别股票之间排名虽然发生了变化但如果未满足3%的条件则四只持仓股票的份额会发生变化即不再是4:3:2:1。这是策略中的正常现象~
$ $
**结果展示**
我们在JoinQuant回测了一下该策略基准收益设置为银行股指数的收益结果如下所示
![银行.png][12]
$ $
**总结**
以上就是我们从雪球大V云蒙处的策略进行适度修改所得到的量化交易策略大家觉得怎么样呢不放克隆下面的回测自己看一看代码跑一跑从而更全面的了解整个策略
![雪球云蒙银行股搬砖_函数说明.png][13]
$ $
```
本文由JoinQuant量化课堂推出版权归JoinQuant所有商业转载请联系我们获得授权非商业转载请注明出处。
文章更迭记录
v2.02016-07-19改为规范代码添加函数说明书
v1.22016-07-18添加CSV文件
v1.12016-07-04添加“导语”
v1.02016-05-21文章上线
```
[1]: https://image.joinquant.com/46be391e5909990be36e640e552fc419
[2]: https://xueqiu.com/3037882447/68184966
[3]: https://image.joinquant.com/c001a80b9b85dda58ba9fbfca220c1df
[4]: https://image.joinquant.com/62b1f1205ee79c95f84b10dc4fe0b418
[5]: http://pan.baidu.com/s/1eRZL7WY
[6]: https://image.joinquant.com/676fdb95c3c6a3ee97962bf0be473f03
[7]: https://image.joinquant.com/7c9fae84149ac43df45f7e9af4bea6e4
[8]: https://image.joinquant.com/7bff0bdf3f8314ed776d2bf0dbc574be
[9]: https://image.joinquant.com/68477e70f3e790cff2c8315760a92f7f
[10]: https://image.joinquant.com/016abae195754365d1e056dea6fb2965
[11]: https://image.joinquant.com/d48a0d5767a0e67b5de683ba848b3ee0
[12]: https://image.joinquant.com/ac3190692e4ff4d756600c6548b7ff90
[13]: https://image.joinquant.com/03300be1f48753119dfafe4918c2bc60
评论
谢谢分享, 银行股搬砖收益也不咋滴嘛, 云蒙为啥死守银行股还加杠杆?
2016-05-22
1.“之后,在我们的回测中使用下列命令就可以读取数据” 框里的命令是空白的!
2.最后一句“不放克隆下面的回测”有错别字
2016-05-22
@陈小宽
from pandas import Series, DataFrame
from six import StringIO
g.data_body = read_file("bankshares.csv")
g.rating_data = pd.read_csv(StringIO(g.data_body))
不妨
2016-05-23
@933168 收到,我看一下
2016-05-27
@933168 预计下周一把策略添加进来~~你可以先看下这个帖子
https://www.joinquant.com/post/1359
2016-05-28
@933168 代码已添加~~
2016-05-30
Exception: read_file bankshares.csv 失败, 错误: 文件'/home2/22675891359/bankshares.csv'不存在
要先把csv文件拷贝到home2目录吗?
2016-07-03
云蒙已被证明是个骗子了,她这个银行股轮动的方法根本就不赚钱,她靠骗人在IB香港开户然后介绍人填她来赚钱
2016-09-12
感觉这里有点问题哇,order_amt=context.portfolio.cash*2*(g.num-i)/(g.num*(g.num-1)) 分母应该是
g.num*(g.num+1) 吧
因为是这个数列的求和(1+2+..+g.num)
2016-10-12
代码里134行
order_amt=context.portfolio.cash*2*(g.num-i)/(g.num*(g.num-1))
最后应该是g.num+1吧?
以g.num=4为例的话 按比例分配cash的话应该是i/(n*(n+1)/2)=2i/(n(n+1))吧? 其中i为第i个股票
2016-12-23
说实话云蒙的这套策略还是非常理性的,只是现实是骨感的
2017-02-14
@Sirius_stat sum(rang(g.num+1))
2017-12-05