https://www.joinquant.com/view/community/detail/e7344a5530d6f5586d37611112b11060?type=1

聚宽小秘书 8个月前
点赞 1
应用文 | 用聚宽实现一个多因子策略
本文选自公众号「天风期货研究院」 作者:章程

单因子分析
单因子方面,参考了天风证券金融工程组的单因子追踪报告中设计的20余个因子,在聚宽平台上对其中的大多数因子进行了一个实现。

单因子是Alpha的来源,因此需要对单因子进行挖掘,检验,理解这些单因子究竟是什么也很重要。

6401.jpg

在前几期的报告中已列出了这些因子,如上表。

虽然这些因子列出来并不难,但是怎么用确实是一个问题。从理解因子是什么的角度来说,Fama-French的三因子模型给出了一个比较简单的解释。

三因子模型从规模,Beta,BP三个角度,对股票的风险暴露进行规定:

WX20180906-200000.png

这个公式当中,三因子的风险暴露分别是Beta,SMB,HML。每一个股票理论上都对这三个因子具有风险暴露。因此三因子解释了股票的定价情况,Fama-French模型也就是一个定价模型。值的注意的是,Fama-French三因子模型中的三个因子,除了Beta可以被简单理解为全市场风险,SMB,HML并不是他们本来的意思,即市值或者PB/BP。根据Fama-French三因子模型,SMB是small minus big,HML是high minus low,即SMB是小股票减大股票,HML是BP高的股票减BP低的股票。

SMB用的是做多全市场市值较小的三分之一的股票,做空全市场市值较大的三分之一股票,从而得到一个针对市值的股票多空组合,用这个股票多空组合的收益率作为这个SMB因子的收益率。HML原理类似,不过是做多BP较大的三分之一股票,做空BP较小的三分之一股票,形成一个针对BP的股票多空组合作为HML因子的收益率。根据公式,需要得到每个个股在Beta,SMB,HML上的暴露,B,bs,bv。计算某股票的Beta暴露的时候,都是用个股在时间序列上的收益率,与市场benchmark的收益率做回归,得到的回归系数就是Beta暴露值。对于CAPM模型,为了得到个股在SMB和HML上的暴露情况,也是用个股在时间序列上的收益率与SMB和HML的收益率做回归从而得到各个因子上的暴露值。这个一系列说下来稍微有点抽象了。

稍加理解,可以是这样的:

在时间序列上对于个股的收益率与目标因子的收益率进行回归,从而得到个股在目标因子上的暴露。假设现在做一个三因子模型的策略,就意味着,个股在因子上的暴露值是需要先用个股一段时间的历史数据,对于市场一段时间的历史数据,SMB一段时间的历史数据,HML一段时间的历史数据,做一遍回归,从而得到个股在SMB,HML以及市场这三个维度上的暴露值。进一步加深理解,CAPM的这种假设的实际含义有一个隐含的意思是,如果一个个股是一个小市值的股票,然而与SMB因子的收益率回归下来发现bs不大,也就意味着这个个股虽然市值很小,但是其表现出来的股价走势却没有一个小市值股票应该有的股价走势,这样一来,这个股票的SMB因子暴露就会比较小,哪怕从市值来看这真的是一个小市值股票。

同样的道理,对于其他因子都是如此。

在国内的市场上,用股票多空组合作为因子的收益率并不合理,毕竟国内不能做空,所以我考虑用获取因子收益率的时候只采用做多的部分。另外如果做多30%的股票,其比例非常的高,效果并不是很显著。所以我用10%的股票做多。对于SMB因子,即取全市场市值最小的10%的股票,对于HML即取全市场BP最高的10%的股票。上表的因子,例如市盈率因子,即取市盈率最小的10%的股票,例如净资产收益率即ROE,则取ROE最高的10%的股票。有了这个认知之后,就可以在聚宽里面对这些因子的收益率作为一个策略进行编写。以市值因子为例,编写的规则是,20个交易日调一次仓,每次调仓,选取全市场市值最小的10%的股票进行买入持有。结果如下:

6402.jpg

从2010年至今的回测中,小市值因子表现出了异乎寻常的获益能力,根据聚宽的计算,Alpha达30%。再比如ROE:

6403.jpg

不难看出来ROE的Alpha比小市值少了许多,但是小市值在2016年之后,出现了极大的衰减,而ROE则没有出现这个衰减,稳定很多。

这里需要做一个说明,就是这个单因子的构建并没有做任何的中性化。对于除了市值因子之外的因子,市值中性化是可以做的,另外行业中性化都是可以做的。初期选择不做主要是因为我们在尝试实证了市值和行业中性化之后,发现并没有多少收益的增强,只是在Alpha的稳定方面有所贡献,为了尽快做出一个多因子模型,就先放一放,即便没有中性化也不是什么太大的问题。

由此,单因子的一个简单的实现就有了。根据CAPM的理论,需要得到个股的因子暴露值还需要拿这个因子的收益率与个股收益率做回归。我们经过大量的实证回归,测试对比,认为这种方法的意义不大。虽然理论上来说对收益率时间序列进行个股和因子收益率维度上的回归,可以得到确切的个股在该因子上的暴露情况,或者更简单的就是对一个个股的收益率在多个因子的收益率上做一个多元线性回归。

然而,问题在ROE的这个因子收益率上就能看的很清楚,即因子收益率本身虽然有Alpha,但是Beta极大,甚至因子跟因子之间的相关性非常高,在回归中,个股的收益率用因子解释就存在极大的多重共线性问题。另外,如果回归需要一段时间的历史收益率数据,不同的个股在不同的时间段中,因子暴露的特征未必一样,需要一段时间历史数据得情况存在逻辑上的问题。

在从单因子组合为多因子模型的过程中,采用CAPM的这种资产定价模型进行构建,势必存在个股的收益解释的问题。逻辑上看,CAPM用了三个因子,市场,估值,规模,的因子收益率与个股收益率做回归,来计算个股的因子暴露,这种思路可能在实际中并不适用。

多因子模型
有了上面的一个大致结论,个股的因子暴露就不是特别合适用CAPM的定价方式,就自然转向用因子值直接作为个股在因子上的暴露。这种方法在逻辑上并没有巨大的缺陷,只是从定价角度,用因子值直接作为因子的暴露,肯定是有缺陷的。但是我们不是做学术文章,而是做赚钱的模型,即使从定价角度有一些逻辑问题,也是可以接受的。

用因子值直接做为因子暴露做模型,就会存在一个scale的问题。低PE的股票的分布在中下偏多,而PE向上没有上限,有几千几万的PE值。ROE也有类似的情况,低ROE的股票可以存在负的几十的ROE,高ROE也可以高到正的几十,而大多数ROE分布在大于0小于10的区间,并不符合正态分布或者其他什么分布。我们做的第一个多因子模型肯定是方便起见用打分法,直接用因子值进行打分然后等权加在一起,选出分数最高的个股,简单粗暴,应该有效。我们在上两期的报告中就复制粘贴了天风证券金融工程组的标准化方式,这里再写一遍:

去极值:采用了MAD(Median Absolute Deviation绝对中位数)去极值,对于极端数值,将其插值在3倍绝对中位数的边缘。对于因子f,我们的绝对中位数具体计算方式如下:

mf =median( f )

MAD=median(|f-mf|)
对于超过上边界的因子f:

f > mf+31.483×MAD
我们将超出的部分的因子值强制等于上边界:

f = mf+3×1.483×MAD
对于低于下边界的因子f:

f < mf-31.483MAD
我们将低于的部分的因子值强制等于下边界:

f =mf-3×1.483×MAD
标准化:为使得计算因子的量纲一致,我们利用Z-score的方法对每个因子都进行标准化处理,使其满足均值为0,标准差为1;我们的标准化计算方式如下:

f‘=(f-mean(f)) / std(f)
标准化之后,理论上讲,对于每个因子的因子值分布都服从平均值为0,标准差为1的未必规则的分布。然而即使分布未必规则,因子值和因子值直接是可比了。分布的问题则是另一个打分的问题,是否需要强制因子值分布服从某种分布,这个都是未来可以考虑的。然后,又在聚宽平台上做了如下处理:

ST股票处理:我们直接在股票列表中去除ST股票的所有数据,只保留非ST股票数据。

因子权重:将完成去极值以及标准差后的因子按照市场逻辑安排各因子的逆序或者顺序,顺序的因子乘以1,逆序的因子乘以-1,并等权相加。将因子加权后的总值再以从大到小排列,取前5%的股票以开仓。

交易费用设置:

时间大于2009年1月1号:买入手续费为千分之2;卖出手续费为千分之 3,最低手续费为5
时间大于2011年1月1号:买入手续费为千分之1;卖出手续费为千分之2,最低手续费为5
时间大于2013年1月1号:买入手续费为万分之3;卖出手续费为千分之13,最低手续费为5
最终多因子模型,用中证500的成分股作为回测,得以下结果:

6404.jpg

客观的说这也不是一个特别理想的结果。接近21%的Alpha并不是特别的高。然而每一年都是有相对于指数的超额收益的。这种结果要做对冲形成绝对收益肯定是不行的,不过做做指数增强已经是够了。

交易因子
以上取了十几个因子,多数是基本面因子,在设置权重的时候做了一个等权,居然也能做出一个正的能看的Alpha,由此我们也在思考,从定价模型的逻辑出发,这种用因子值直接作为因子暴露,并且将因子暴露等权相加的方法,似乎总有哪里不对。市场上有一类因子,是纯交易性质的,多数来自于对股票量价信息的处理。

目前市面上比较有代表性的是WorldQuant发布的Alpha101和国君金工组发布的Alpha191。这两个颇具代表性的交易性的量价因子集合,展现了一下,横截面上,可能出现的量价因子,大致是什么形式长什么样子。这些因子大多张这样:

(rank(Ts_ArgMax(SignedPower(((returns < 0) ? stddev(returns, 20) : close), 2.), 5)) - 0.5)
或者这样:

(sign(delta(volume, 1))(-1 delta(close, 1)))
乍看之下,这些因子基本就是数学公式的组合。其用到的信息,无非就是股票的量、价。大多数时候还是只有价。用这些因子,很难想象任何的定价模型可以派上用场。这些所谓因子本身可能就没有任何实际含义。WorldQuant声称至今这些公布出来的因子依然在被广泛的使用在WorldQuant的投资组合中。

这也让我们思考,定价模型固然重要,但是涉及到了交易性的因子,看上去反倒是更像另一种我们更熟悉的交易系统,即CTA的交易系统。与CTA交易系统的差别在于,CTA交易的信号大多来自于时间序列上的量价信息,比如为人熟知的一些均线,布林线等等指标。这些交易性因子则更多的实在横截面上对一个横截面的股票进行量价信息上的衡量。

聚宽上实现了Alpha101和Alpha191的绝大多数因子,通过接口可以方便的调用。使用聚宽对这些因子进行调用,可以方便的测试这些因子的有效性。

我们在聚宽的notebook里面创建了一个对于Alpha101和Alpha191的因子进行有效性测试的模板。以Alpha191的alpha001,即第一个因子为例,取出因子,进行排序,以十分位,计算因子分位收益率。得到一些初步的结果如下:

6405.jpg
6408.png

在2016年2月至今的测试中,以中证500为样本,两天一次的调仓频率,在指数实现0.91净值的情况下,最高的分位8获得了1.25的净值。从图中大致看,分位8似乎也对应有一些alpha。这个因子并不呈现一个线性的特征,两头的分位都表现非常差。在别的一些测试中,各类这种因子也体现出了类似的特性,以及随时间的推移,因子的alpha不稳定,或存在alpha的分位发生变化的情况。

我们认为可以将这些量价因子理解为一个拓宽股票选择信息维度的因子,而不是对于股票收益率进行解释的因子。

这些量价因子显然没法解释为什么股票的收益率发生着一些变化,然而拓宽了股票信息的维度,使得同一个横截面的股票存在着多个维度的信息可用于分析。显然如果直接用Alpha191里面的alpha001因子,并且对着第八个分位进行买卖,未必能保证获得稳定的可观的alpha,但在alpha101和alpha191众多的因子中,进行测试和筛选,进而自行挖掘更多的因子,量价因子也可以是构建多因子组合的重要组成部分。

改进的方向
从单因子到多因子,从对CAPM的简单理解到对交易性因子的一些理解和尝试,不难看出多因子模型的构建并不一定是机械的来自于定价模型,当然定价模型会提供许许多多的思路和参考,多因子模型提供了一个可以将更多的信息融入到投资中去的途径。

从目前我们在尝试的一些新内容看,用横截面因子对于股票收益率在一段时间内的回归或者统计模型的运用,我们还只是初步的尝试。这种横截面的回归和横截面的收益预测,在我们的初步尝试中仿佛有稳定Alpha收益的功效。

单因子方面,更多的去挖掘类似于Alpha101,Alpha191这样的交易因子,或者哪怕先捋一遍这些已经公布的因子,然后挑出其中相对而言较为稳定的因子,用在横截面的回归当中,共同去构建一个多因子组合。在基本面因子方面,则有添加行业中性化,或者从基本面逻辑以至于行业逻辑寻找更多的因子等等,都是下一步可以研究的方向。

多因子模型固然复杂,然而在聚宽中,从复现天风证券金融工程组的多因子报告,到组一个能看的多因子模型,在加上做一些初步的时间序列回归和横截面回归的尝试,一共也就花了我不超过24个小时的时间。为了理解那些交易型的因子,写了些代码,甚至尝试着用了些统计和机器学习算法,也不过是花了些时间试错和学习。

这个主要原因也是有聚宽这样的平台,从数据,回测,绩效统计,甚至因子都已经做好了方便用户调用。使用这样的工具,对于多因子的投资逻辑进行学习和尝试之后,是否需要构建自己的交易系统,则反而是不那么重要的问题了,对于很多个人和小机构,依附于聚宽这样平台即可,对于大一些的机构,找一帮人过来实现明确的投资思路,也只是钱的问题。

感想
如果投资就像人生一样,在每一个投资的阶段,或许都应该花更多的心思,去考虑现在的方法是否正确,去思索能不能做的更好。闭着眼睛开车,任凭自己的感受指导自己的行为,做投资,大概率要亏,过日子,大概率药丸。这么一想,人生比投资要更艰难,投资万一做错了,只要不亏完本金总还是有机会弥补的。

聚宽,助您实现单因子多因子策略~
点击查看更多:聚宽社区的因子探讨~

转载:用聚宽实现一个多因子策略相关推荐

  1. 量化回测平台|有现成的不用吗?如何利用聚宽平台回测交易策略

    导览 本文为掘金小册课程加推篇!小册还在持续加推中,敬请期待!!!目前已经加推了20节!!! 超值的43节课程!从目录就能看出来! 1-贯穿小册:Python金融数据分析实战型项目 2-前置基础:量化 ...

  2. 分享聚宽量化交易执行选股策略的执行过程

    分享聚宽量化交易执行选股策略的执行过程: 首先就是需要用不同的函数处理不同的数据,比如上市数据,要用run_query()函数处理,财务与估值数据要用get_fundamentals()函数处理.以及 ...

  3. 聚宽量化一个命令获取全部股票全部的财务报表数据

    -- 本篇文章 by Richard 通过这个代码,可以获得全部股票从2010年开始的三大报表数据.聚宽的财务数据是每季度更新,因此我们获取2010年以来全部的季度数据,已沪深300为例.数据由JQD ...

  4. 【转载】聚宽:JQData | 量化界最好用的本地量化金融数据

    什么是本地量化金融数据 - JQData ? 使用JQData本地量化金融数据服务,可快速查看.计算或接入金融数据信息,解决本地.web.自研金融终端调用数据的需求.支持python多版本及多操作系统 ...

  5. 聚宽 get_price 多个股票数据_聚宽量化一个命令获取全部股票全部的财务报表数据...

    -- 本篇文章 by Richard 通过这个代码,可以获得全部股票从2010年开始的三大报表数据.聚宽的财务数据是每季度更新,因此我们获取2010年以来全部的季度数据,已沪深300为例.数据由JQD ...

  6. 用聚宽网写双均线策略(1)

    鉴于上次自己建立python系统是在说太浪费时间,而且主要是浪费中数据上,实在不爽,这次用一下第三方平台,提高一下建模的速度,平台选择聚宽网,国内的平台很多,聚宽/优矿/米宽,都差不多少,原来还有一家 ...

  7. 用聚宽量化炒股-财务因子选股-1成长类因子选股-1

    量化选股是利用数量化的方法选择股票组合,期望该股票组合能够获得超越基准收益率的投资行为. 量化选股可以分为两类:基本面选股和技术面选股. 在实际的股票投资中,往往利用基本面选出要操作的股票,然后根据技 ...

  8. 【量化】基于聚宽实现基本面多因子选股+技术指标择时策略

    *** 这是一个尚未更新完全的博文*** 引入包: from jqdata import macro import datetime 总体回测前: ''' ====================== ...

  9. 【年度福利】聚宽2018年度评选+精选文章合集

    量化交易策略基本框架岁月不居,时节如流,聚宽量化交易平台与大家共度了一个不平凡的2018年,在这一年里,虽然投资环境波云诡谲,难以捉摸,但依然有许许多多的用户在聚宽做出了优秀的研究,并无私地分享了出来 ...

最新文章

  1. Boosted Tree:一篇很有见识的文章
  2. 为什么C++(来自C++之父的观点)
  3. 每日一题(22)——malloc与free(三)
  4. MaxCompute JOIN优化小结
  5. 然而毕博淮安的毕博淮安
  6. BZOJ 3450: Tyvj1952 Easy [DP 概率]
  7. C语言课后习题(19)
  8. android 输入金额,EditText输入金额保留两位小数点
  9. Redmi 卢伟冰:要做就做真旗舰 绝不通过简配压低成本
  10. 不足百行代码 实体数组转DataTable通用类
  11. 2016年最火的15款HTML5游戏引擎
  12. dts同步常见问题_家庭影院十大常见故障解决办法
  13. shell grep正则匹配汉字
  14. 个人表现怎么写学生_个人主要事迹怎么写
  15. 表情分析计算机,利用深度学习和计算机视觉进行面部表情分析
  16. PHP代码从数据库中获取数据
  17. 关闭计算机的几种方法
  18. StackOverflow网友Bert F发帖提问:哪本最具影响力的书,是每个程序员都应该读的?...
  19. ubuntu更换pip3源提高下载速度
  20. 中国石油大学《红楼梦研究》第二阶段在线作业

热门文章

  1. amcharts图表使用总结
  2. Discom BKS03/KS91D传感器
  3. 参考文献自动生成--
  4. edge打开pdf不显示印章_win10 Edge浏览器打不开pdf文件的解决方法
  5. 【错误解决】Spring JPA的错误及其解决方案
  6. cosface:large margin cosine loss for deep face recognition
  7. 已解决Pandas requires version ‘1.4.0‘ or newer of ‘sqlalchemy‘ (version ‘0.7.10‘ currently installed).
  8. 修改Endnote插入Word参考文献中位置
  9. 三个显示图像的matlab函数图像,如何在matlab中将三个隐函数图像画在同一个图上...
  10. codeforces 884F 费用流,图解很清晰