V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
liuziji
V2EX  ›  Python

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

  •  1
     
  •   liuziji · 2016-09-02 16:24:27 +08:00 · 5835 次点击
    这是一个创建于 2794 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    规范源码已更新!请大家克隆研究。
    本文由 JoinQuant 量化课堂推出 。难度标签为进阶上,理解深度标签: level-0
    
    JoinQuant 免费提供数据获取、研究环境、策略回测、实盘连接、发送交易信号,学习交流等功能.
    
    作者: 导数君
    编辑: 宏观经济算命师
    
    

    因子

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

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

    选取因子

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

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

    1.png

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

    2.png

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

    3.png

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

    4.png

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

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

    5.png

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

    编写代码的一些问题

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

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

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

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

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

    小结

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

    多因子策略入门_函数说明.png

    本文由 JoinQuant 量化课堂推出,版权归 JoinQuant 所有,商业转载请联系我们获得授权,非商业转载请注明出处。
    
    文章更迭记录:
    v2.1 , 2016-07-25 ,修正文字,感谢 liuzehong 指出
    v2.0 , 2016-07-16 ,更新为规范源码,添加“函数说明书”
    v1.1 , 2016-07-04 ,添加“导语”
    v1.0 , 2016-05-21 ,文章上线
    

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2983 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:21 · PVG 21:21 · LAX 06:21 · JFK 09:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.