关闭
您正在使用的浏览器版本较低,无法支持聚宽的某些特性。
为了获得更好的体验,推荐使用:
Google Chrome
或者
Mozilla Firefox
或者
IE9以上
。
返回主题列表
因子分析系列文章(九):多因子研究框架
量化狙击
发布于2020-04-11
回复 16
浏览 24992
222
listen
分享到:
微信
微博
雪球
多因子模型构建流程主要包括:因子筛选、收益预测、风险预测、组合优化。1)数据处理及因子筛选:1.1基础数据采集;1.2数据标准化;1.3识别有效因子;2)收益预测:2.1大类因子分析;2.2因子共线性分析;2.3残差异方差分析;2.4多元线性回归:2.5计算因子预期收益;2.6计算股票预期收益;3)风险预测:3.1计算因子历史收益率协方差矩阵;3.2残差风险估计;4)组合优化:4.1确定组合的收益目标;4.2确定组合的风险目标;4.3行业权重约束;4.4因子暴露约束;4.5个股上下限约束;4.6二次规划求解组合权重分配;4.7模拟业绩回溯。 多因子模型构建工作步骤:1)依次对不同类别的风格因子进行单因子测试;2)对筛选出的有效因子进行大类因子分析;3)在收益预测和风险预测的基础上,构建选股模型;4)对选股模型进行回测和绩效分析 多因子模型构建的流程图  第一部分:准备工作 1.1基础数据采集:首先需要确定原始因子集合,然后按照原始因子集合逐个进行因子原始数据的采集和计算工作; 1.2数据标准化:由于原始数据的量纲不一致,为保证数据之间的可比性和可叠加性,要对原始数据进行标准化、去量纲的工作; 1.3识别有效因子:原始因子集合是在逻辑上被认为与股票收益率存在关联性的因素,实证中并不是每个原始因子和股票收益率都存在相关性,因此需要对原始因子进行有效性检验,排除跟收益率相关性不高的因子。 第二部分:收益模型 2.1大类因子分析:大类因子是指在逻辑上具有一定相似性的因子,在实证中这些因子之间也很有可能表现出很强的相关性,即共线性问题。为尽量多的保留有用信息,需要首先根据因子所属大类对其进行处理,比如进行因子合成,或者尽量挑选效果显著,并且相关性不高的因子集合进行保留; 2.2因子共线性分析:如果因子之间存在明显的多重共线性,那么进行多元线性回归时,会使得模型的估计失真或者难以估计准确,所以在进行多元线性回归之前需要进行因子共线性分析,剔除相对不重要但是会对模型造成共线性干扰的因子; 2.3残差异方差分析:如果回归的残差项具有不同的方差,则称回归模型存在异方差。如果存在异方差,则传统的最小二乘回归得到的参数估计量不是有效估计量,所以在进行多元线性回归之前必须进行残差的异方差分析。根据Barra的文档,可以采用个股流通市值的平方根作为权重进行加权最小二乘法回归,经实践在大部分截面期上可以消除异方差的影响; 2.4多元线性回归:通过多元线性回归计算每一期的因子收益; 2.5估计因子预期收益:由于因子每期收益或多或少存在不稳定性,为保证模型的稳定性,需要对因子历史收益序列进行分析,给出下一期因子收益的合理预期值。因为很多因子存在明确的经济含义和投资逻辑,所以因子收益的方向(±号)需要进行约束; 2.6计算股票预期收益:根据因子收益和每个股票的因子载荷计算出个股的预期收益率。 第三部分:风险模型 3.1计算因子收益率协方差矩阵:根据因子收益率的历史序列,计算出因子的协方差阵; 3.2残差风险估计:计算出个股的残差风险。 第四部分:优化模型 4.1确定组合的收益目标:可以是两种,一种是确定目标收益,然后最小化风险;另外一种是确定风险目标,然后最大化收益; 4.2确定组合的风险目标:和4.1一起联合确定; 4.3行业权重约束:根据风险目标确定行业风险的暴露。如果组合存在基准组合,则需要根据基准组合在各个行业的权重分布,确定行业偏离约束; 4.4因子暴露约束:多因子模型本身是一个追求宽度的模型,所以为避免在某些因子上暴露过大导致风险过高,需要对因子暴露进行一定的约束; 4.5个股上下限约束:因为卖空约束以及避免在个股上暴露过高的风险,所以需要对个股权重的上下限进行约束; 4.6二次规划求解组合权重分配:根据2.6、3.1和3.2获取的个股预期风险—收益数据集,以及4.1~4.5确定的约束条件,采用二次规划的方式,计算组合中的个股权重; 4.7模拟业绩回溯:根据每期确定的组合成份股及权重分配,对模型进行模拟业绩回溯。 基础数据采集 基础数据采集主要完成两个工作,第一是确定备选因子池,其次是确定因子的具体计算方法。本部分的基础数据采集主要是指风格因子(Style Factor)基础数据采集。 主要的风格因子暂时分为十二大类:估值因子(Value Factor)、成长因子(Growth Factor)、财务质量因子(Financial Quality Factor)、杠杆因子(Leverage Factor)、规模因子(Size Factor)、动量因子(Momentum Factor)、波动率因子(Volatility Factor)、换手率因子(Turnover Factor)、改进的动量因子(Modified Momentum Factor)、分析师情绪因子(Sentiment Factor)、股东因子(Shareholder Factor)和技术因子(Technical Factor)。因子库是多因子模型的重要组成部分,我们持续探索,力求发现新的有效因子。 数据标准化 由于各个因子的量纲不一致,为方便进行比较和回归,需要对因子进行标准化处理。对因子进行标准化处理主要有两种方式: 1.直接对因子载荷原始值进行标准化; 2.首先将因子载荷原始值转换为排序值,然后再进行标准化。 第一种方式的好处在于能够更多保留因子载荷之间原始的分布关系,但是进行回归的时候会受到极端值的影响;第二种方式的好处在于标准化之后的分布是标准正态分布,容易看出因子载荷和收益率之间的相关性的方向。 方法一:因子载荷原始值标准化 由于少数极端值会因子和收益率之间的相关关系估计造成严重干扰,而多因子模型本身是一个追求投资宽度的模型,所以在进行因子载荷标准化之前,我们需要对极端值进行处理。比较常见的去极值方法是“中位数去极值法”: 数据去极值后的序列再进行标准化: 有效因子识别 有效因子应该满足两个条件:第一是在逻辑上应该和收益率存在一定的相关性;第二是在实证中确实和收益率存在比较明显的相关性。 在前面的章节中,我们已经列举出了逻辑上应该和收益率存在相关性的风格因子集合。接下来我们介绍如何从实证角度验证有效因子的方法。 步骤一:单因子回归确定每个因子每期的因子收益市场风险、行业风险、风格风险是影响股票收益最主要的三种因素,在验证风格因子有效性时,必须考虑市场因子和行业因子的影响。对于市场因子和行业因子的处理方式有两种: 1.市场因子和行业因子同时纳入模型; 2.仅纳入行业因子,而将市场因子包含在行业因子中。 第一种方式和第二种方式的区别在于,第一种方式行业因子收益率计算出来的是行业相对于市场的超额收益率,而第二种方式计算出来的收益率是行业绝对收益率。对于验证风格因子有效性而言,这两种方式是没有区别的;对于回归而言,只是前者是带截距项的回归,而后者是穿越原点的回归。 实证中我们采用第二种方式,针对因子k,单因子的回归模型如下: XtjsXjst是一个0−1哑变量,即如果股票j属于行业s,则暴露度为1,否则为0。在我们的报告体系中,不会对公司所属行业进行比例拆分,即股票(公司)j只能属于一个特定的行业s,在行业s上的暴露度为1,在其他所有行业的暴露度为0。 注:在有的模型中,会对公司所属行业进行拆分,比如公司j的业务50%属于行业a,30%属于行业b,20%属于行业c,则股票j在行业a的暴露度为0.5,在行业b的暴露度为0.3,在行业c的暴露度为0.2。 A股的行业分类,主要存在两种方式,一种是外来的GICS风格的行业分类,一种是本土的行业分类。 GICS风格的行业分类,我们中证指数公司发布的中证行业指数系列; 1)中证能源;2)中证材料;3)中证工业;4)中证可选;5)中证消费;6)中证医药;7)中证金融;8)中证信息;9)中证电信;10)中证公用。 本土的行业分类,参考中信行业指数系列; 1)石油石化;2)煤炭;3)有色金属;4)电力及公用事业;5)钢铁;6)基础化工;7)建筑;8)建材;9)轻工制造;10)机械;11)电力设备;12)国防军工;13)汽车;14)商贸零售;15)餐饮旅游;16)家电;17)纺织服装;18)医药;19)食品饮料;20)农林牧渔;21)银行;22)非银行金融;23)房地产;24)交通运输;25)电子元器件;26)通信;27)计算机;28)传媒;29)综合。 步骤二:因子收益率序列t检验是因子k在第t期的因子收益,为确定因子k在第t期是否和股票收益率显著相关,即是否显著不等于0: 对于t检验,需要进行三个方面的分析: 1.t值绝对值序列的均值:对于每一期的截面回归,都可以得到一个因子收益率fkt ̃的t值。对于t值序列,首先取绝对值,然后计算|t|的均值,|t|是判断因子是否为有效因子的重要指标。之所以要取绝对值,是因为只要t值显著不等于0即可以认为在当期,因子和收益率存在明显的相关性。但是这种相关性有的时候为正,有的时候为负,如果不取绝对值,则很多正负抵消,会低估因子的有效性; 2.t值绝对值序列大于2的比例:检验|t|>2的比例主要是为了保证|t|平均值的稳定性,避免出现少数数值特别大的样本值拉高均值; 3.因子收益率fkt ̃序列的t值检验:对于每一期的截面回归,都可以得到一个因子收益率fkt ̃,对于fkt ̃序列同样需要进行t检验,以观察因子收益率序列的方向一致性。 有效因子的分类—收益类因子和风险类因子 所谓有效因子,就是和收益率存在很明显相关性的因子,即满足前面的t的第一点和第二点。根据第三点,我们可以大致将有效因子分成收益类因子和风险类因子。 收益类因子:即因子收益率fkt ̃序列的t值显著不等于0,因子收益率的方向性相对明确,这类型的因子,用历史序列对下一期的因子收益进行预测时,相对比较准确,所以称之为收益类因子。 风险类因子:即因子收益率fkt ̃序列的t值在0附近,因子收益率的方向性相对不明确,这类型的因子,用历史序列对下一期的因子收益进行预测时,风险比较大,所以称之为风险类因子。 收益类因子是多因子模型超额收益的主要来源,在模型中是需要风险暴露相对多的因子。而风险类因子也需要重点关注,因为风险类因子是进行风险控制的重点,需要风险暴露尽量少。 步骤三:辅助鉴别之因子IC值在实际计算中,因子k的IC值一般是指个股第T期在因子k上的暴露度与T+1期的收益率的相关系数。因子IC值反映的是个股下期收益率和本期因子暴露度的线性相关程度,是使用该因子进行收益率预测的稳健性;而回归法中计算出的因子收益率本质上是一个斜率,反映的是从该因子可能获得的收益的大小,这并不能代表任何关于稳健性的信息。 举个例子,票池里5只个股第T期在动量因子上的暴露度为−2、−1、0、1、2,假设它们第T+1期收益率为−0.2、−0.1、0、0.1、0.2,则因子IC值为1,因子收益率为0.1;假设它们第T+1期收益率为−0.4、−0.2、0、0.2、0.4,则因子IC值为1,因子收益率为0.2。而因子t值某种程度上反映的也是稳健性信息,在上述举例的两种简单情形下,因子t值都是正无穷。但是在更复杂的包括其它因子和行业哑变量的多元线性回归模型中,因子t值和IC的关系也随之变得复杂,无法用确定的公式表示,只能说它们之间具有某种正相关关系。 在利用IC值评价因子有效性时,可以预先对因子进行提纯,排除行业、市值等重要因素的影响,使结果更明晰。具体来说,就是在因子标准化处理之后,在每个截面期上用其做因变量对市值因子及行业因子等做线性回归,取残差作为因子值的一个替代,这种做法可以消除因子在行业、板块、市值等方面的偏离。例如,股息率因子较高的个股可能较多分布在电力及公用事业、汽车、商贸零售等行业以及大市值板块,经过因子提纯之后,股息率因子较高的个股就会平均分布在各行业及板块了。 当得到各因子IC值序列后,我们可以仿照上一小节t检验的分析方法进行计算: 1.IC值序列的均值及绝对值均值:判断因子有效性; 2.IC值序列的标准差:判断因子稳定性; 3.IC值序列大于零(或小于零)的占比:判断因子效果的一致性。 步骤四:辅助鉴别之因子打分法回测 依照因子值对股票进行打分,构建投资组合回测,是最直观的衡量指标优劣的手段。具体来说,在某个截面期上,可以根据一个或几个因子值对个股进行打分,将所有个股依照分数进行排序,然后分为n个投资组合,进行回测。 构建方法详细说明如下: 1.股票池、回溯区间、截面期(换仓期)可均与回归法相同; 2.选取一个基准组合(比如沪深300),将所有个股在各个行业内按照得分进行排序,每个行业内按得分从高到低分成n个组合,每个行业内的每个组合中股票按流通市值配比,然后将各行业的n个组合中序数相同的组合结合在一起(最后一共形成n个组合),组合内行业间权重按沪深300配比。以上这种构造方法得到的n个组合为行业中性组合。也可以选择不做行业中性,直接在全股票池中不分行业按得分高低分成n个组合,每个组合中的股票等权配比或按流通市值配比。 3.评价方法:回测年化收益率、年化波动率、夏普比率、最大回撤、胜率(分时间、分行业胜率)等。 一般来说,对于比较有效的因子(如市净率),分成3~5层进行回测,各个投资组合的最终净值一般可以保序。分成n层(n>5)进行回测时,可以用最终净值的秩相关系数来衡量因子的优劣(秩相关系数的绝对值越接近1时效果越好)。
222
listen
分享到:
微信
微博
雪球
评论
uyscuti
膜拜膜拜!
2020-04-28
uyscuti
用什么挖因子呢?
2020-04-28
freemars
您水平很高啊。专业的么?
2020-04-28
elizabeth2020
@ShieldUY alphalens
2020-04-29
elizabeth2020
666@ShieldUY
2020-04-29
18672388375
@ShieldUY zipline
2020-04-29
18672388375
@ShieldUY 厉害
2020-04-29
haha3
quantopian@ShieldUY
2020-04-29
haha3
0@ShieldUY
2020-04-29
乌合投基
谢谢分享。
2020-05-02
weepo
您好想请教下alphalens每天股票数据长度不一样这个需要处理吗?比如2005年有1300多只股票,2020年有4100多只。还有如果某个数据某只股票因为上市时间短计算长度不够等原因有空值的话,需要提前dropna()吗,还是直接扔进alphalens里
2020-11-03
金陵紫金
推广文章,赚积分[用机器学习挑选上涨股票的研究](https://www.joinquant.com/view/community/detail/09a547b6ce99e51fbb7b7d55e3c920ed)
2020-11-04
QuantYY
感谢分享
2021-10-18
李宝库
多因子合成是针对因子收益率的合成还是对于因子暴露值的合成?
2024-06-29
一叶知萩
感谢分享
2025-07-31
您尚未登录,请
登录
或者
注册
聚宽发表回复。
取 消
提 交