[编程炒股] 用 python 做投资之多因子策略 from JoinQuant 聚宽量化交易平台-量化课堂

2016-09-02 16:24:27 +08:00
 liuziji

导语:每一位宽客都相信,影响股票涨跌的因素不胜枚举,而这些“因素”就是因子!本文作为一篇合格的入门教程,提供代码当做框架,各路宽客可以自己测试,查看收益率,亦可利用聚宽 python 平台自行构建代码。

规范源码已更新!请大家克隆研究。
本文由 JoinQuant 量化课堂推出 。难度标签为进阶上,理解深度标签: level-0

JoinQuant 免费提供数据获取、研究环境、策略回测、实盘连接、发送交易信号,学习交流等功能.

作者: 导数君
编辑: 宏观经济算命师

因子

因子是什么?通俗来讲。选股择时,我们得有一个标准对不对?这些标准就叫做因子。比如,我认为营收增长率高的公司就是好公司!那我就把营收增长率大于 30%的股票拉出来纳入石榴裙下好了。这个营收增长率大于 30%就是因子,完毕。

因子有选股的因子(股票好不好),有择时的因子(好股票什么时候买)。由于择时往往跟技术指标关系紧密,本篇中就介绍基本面类的因子吧,偏财务向。

选取因子

最简单的方法,先物色一些自己喜欢的因子,比如增长率啦,市值啦, ROE 啦,等等。然后一个个往里面加,看看效果如何,效果好了留下,效果差了删除,反复重复这个过程就能找到心仪的因子啦。

举个例子,小编先选两个因子, ROA 和净利润 /营业总收入(%)。 ROA 和利润率比较高的一般都是表现良好的公司,所以小编决定选取 ROA 和净利润 /营业总收入前 20 名的股票买入,回测结果如下图所示:

表现比大盘略好一点, 11 年的收益有 3.98 倍。那换个因子试试?小编把净利润 /营业总收入换成净利润环比增长率(%),回测结果如下图所示:

然后发现收益率好了一点点,过去 11 年的收益有 7.54 倍。嗯,比刚才高了一些。如果我们把这三个因子都加进去会怎样呢?

收益率为 5.34 倍,没有刚才那么好了,还是刚才的 ROA 和净利润环比增长率(%)这两个因子比较好,那就保留两个吧。小编听说小市值股票收益好,如果把市值这个因子也加进去会怎么样呢?回测了一下,发现:

收益居然有 28 倍!真的是太不可思议了。

所以话说回来,虽然这种试错法选因子是一种比较基础的选因子方式,但其实还挺有用。经过反复试错,小编发现小市值和 ROE 高的股票收益比较高,回测结果显示,收益可以达到 42 倍之多!

是不是很惊艳!你可以直接编程构建代码,也可以用我们的代码当做框架。总之,可以自己测试一下,看看收益会不会爆表。 作为一篇合格的教程,我们接下来看看代码是如何实现的:

编写代码的一些问题

首先,财务面的数据有个问题,就是有些数据是不可获得的,这样的话对排序的影响比较大,因此涉及到一个清洗数据的步骤。一个很简单的办法就是用均值来填充,这个在 Python 的 pandas 库里面有个现成的函数,大家可以尝试使用里面的均值填充法。小编自己也写了一个填充均值的函数,大家也可以参考一下源码。

不过随着深入的研究,可能会发现用均值填充并不是一个完美的方法。这里小编再提供一个思路,大家感兴趣可以自己实现:如果某只股票这一期的某个财务数据空缺,但是上一期没有,我们可以根据该股票这个数据与上一期的平均值比例来确定。用公式说可能更清晰点: 空缺数值=本期该字段平均值*上期该字段数值 /上期该字段平均值。

其次,我们对因子的单位要做一个统一。因为有的因子绝对值好几十亿(比如市值),有的可能只有十几(收益率)甚至是负的,因此因子和因子之间很难直接赋予权重进行计算。因此,我们可以考虑使用排名的方法,对这些因子进行排名。 Python 自带有一个 sort 函数,不过为了练手起见,小编自己写了一个。用的是最简单的冒泡排序算法,高手也可以试一下堆排序或者归并排序以加快回测的速度。

最后,我们将上述功能汇总成一个函数,集中取数据-清洗数据。

有了以上的几个子函数,写主函数就很方便了,各位宽粉们赶紧尝试吧!

小结

我们这篇文章主要介绍了如何通过财务数据来构建一个多因子的策略。由于是入门向,我们构建多因子的方法比较简单,选取的因子依据是主观分析+排名。 如果想定量的分析,主流的方法是做回归分析,或者对各个因子进行打分,这些将会在进阶的量化课堂中有所介绍。如果还有其他的方法,当然也欢迎尝试。

本文由 JoinQuant 量化课堂推出,版权归 JoinQuant 所有,商业转载请联系我们获得授权,非商业转载请注明出处。

文章更迭记录:
v2.1 , 2016-07-25 ,修正文字,感谢 liuzehong 指出
v2.0 , 2016-07-16 ,更新为规范源码,添加“函数说明书”
v1.1 , 2016-07-04 ,添加“导语”
v1.0 , 2016-05-21 ,文章上线

策略代码与回测结果见原文

5919 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX