Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多因子尝试(二):因子正交化

多因子尝试(二):因子正交化

作者头像
量化小白
发布于 2019-01-22 07:19:13
发布于 2019-01-22 07:19:13
12.1K10
代码可运行
举报
运行总次数:0
代码可运行

本系列的第一篇因子加权方法中提到,对于因子间有相关性的情况,可以通过最大化IR来解决,但也会存在另一个问题:因子协方差矩阵的估计,文中对比了最原始的样本协差阵和Ledoit压缩估计量结果的差异,表明协方差矩阵的估计效果对于结果有很大影响。本文给出另一种更为常用的解决因子间相关性的方法:因子正交化。

01

背景

因子多重共线性

如上一篇所述,传统的多因子模型一般采用IC加权、ICIR加权等方法,这些方法都是以IC为基础确定各因子在模型中的权重。而IC是当期因子暴露与下一期收益间的相关系数。如果因子间存在较强的相关性/相关性,通过上述加权方式,最终会导致因子对于某种风格的因子重复暴露。使得整个组合的表现严重偏向于该因子,削弱其他因子的效果。具体来说,当因子表现好时,组合会获得更高的超额收益,但因子表现不好时,也会出现更大幅的回撤。

举个栗子,在上篇三因子组合市净率1个月动量市值的基础上,加入流通市值因子进行四因子组合。采用过去24个月ICIR加权、月度调仓的方式。组合从2012年1月-2018年12月的表现如下

基准采用沪深300指数,显然,四因子组合由于在估摸因子上的重复暴露,导致15年股灾之后,相较于三因子组合出现了超额增长,但在17年规模因子失效后出现了更大回撤。

正交相关定义

首先给出正交相关的一些概念,忘记的可以再翻一翻线性代数/高等代数。

此外,有兴趣可以再去看看正交变换、旋转放缩变换的矩阵表达式,可以加深理解。

因子正交化统一框架

对于因子多重共线性的问题,可以通过因子正交化的方法来解决。因子正交化有多种方式。目前应用最多的有四种:回归取残差施密特正交化规范正交化对称正交化。其中,后三种都是通过因子旋转的方式来消除因子间的相关性,而第一种,后文会给出证明,实质上跟施密特正交化是一致的。因此,首先对后三种正交化方式给出统一说明(这部分参考了报告[1][2],觉得描述不清楚的可以再去看看报告):

标准化的意义在于,正交跟不相关的概念本来是不等价的,正交不一定不相关,但加上Z-SCORE标准化之后,正交等价于线性相关系数为0

以上是因子正交框架,不同的正交化方法具有不同的特性,接下来一一说明,并给出代码。

02

施密特正交化

施密特正交化就是高等代数教科书上的方法,给定一组向量后,分两步操作,第一步按照一定顺序把每个向量与之前所有向量进行正交。第二步对于正交后的向量进行归一化,最终得到的所有向量两两正交且模为1,正交后的因子暴露矩阵为正交阵,用公式表达为

这里给出的代码里正交顺序是直接按照输入因子矩阵的顺序,从左向右依次正交。输入factors为已经标准化后的因子矩阵,返回Q为正交因子矩阵。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 固定顺序的施密特正交化
    def Schimidt(self,factors):
        class_mkt = factors[['mkt_cap','classname']]
        factors1 = factors.drop(['mkt_cap','classname'],axis = 1)
        col_name = factors1.columns
        factors1 = factors1.values
       
        R = np.zeros((factors1.shape[1], factors1.shape[1]))
        Q = np.zeros(factors1.shape)
        for k in range(0, factors1.shape[1]):
            R[k, k] = np.sqrt(np.dot(factors1[:, k], factors1[:, k]))
            Q[:, k] = factors1[:, k]/R[k, k]
            for j in range(k+1, factors1.shape[1]):
                R[k, j] = np.dot(Q[:, k], factors1[:, j])
                factors1[:, j] = factors1[:, j] - R[k, j]*Q[:, k]

        Q = pd.DataFrame(Q,columns = col_name,index = factors.index)
        Q = pd.concat([Q,class_mkt],axis = 1)
        return Q

注意这里不能用python中的QR分解函数np.linalg.qr计算,施密特正交化是QR分解的一种方法,但numpy的QR分解函数并不是用这种方法做的。

03

回归取残差

回归取残差的方法过程类似施密特正交化,按照一定的顺序将每个向量同之前的所有向量回归取残差代替原值。接下里证明,施密特正交化与最小二乘下的回归取残差是一致的。差别仅在于,施密特正交化多了一步归一化。

04

规范正交化

规范正交化实际上跟主成分分析思路是一样的,但主成分分析在截面上应用可以,用在时间序列上就会出现对应关系不一致的问题,这也是规范正交化的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 规范正交
    def Canonial(self,factors):
        class_mkt = factors[['mkt_cap','classname']]
        factors1 = factors.drop(['mkt_cap','classname'],axis = 1)
        col_name = factors1.columns     
        D,U=np.linalg.eig(np.dot(factors1.T,factors1))
        S = np.dot(U,np.diag(D**(-0.5)))
        
        Fhat = np.dot(factors1,S)
        Fhat = pd.DataFrame(Fhat,columns = col_name,index = factors.index)
        Fhat = pd.concat([Fhat,class_mkt],axis = 1)        

        return Fhat

05

对称正交化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对称正交
    def Symmetry(self,factors):
        class_mkt = factors[['mkt_cap','classname']]
        factors1 = factors.drop(['mkt_cap','classname'],axis = 1)
        col_name = factors1.columns     
        D,U=np.linalg.eig(np.dot(factors1.T,factors1))
        S = np.dot(U,np.diag(D**(-0.5)))
        
        Fhat = np.dot(factors1,S)
        Fhat = np.dot(Fhat,U.T)
        Fhat = pd.DataFrame(Fhat,columns = col_name,index = factors.index)
        Fhat = pd.concat([Fhat,class_mkt],axis = 1)        

        return Fhat

06

方法汇总与对比

对于四因子组合,分别用上述三种因子正交化方法正交之后,组合表现如下

可以看出,对称正交化后的四因子组合表现与三因子表现几乎完全一致,表明对称正交非常完美的剔除了因子相关性的影响,其他三种正交化方法的效果一般,这也与文献【1】【2】中的结论一致。

07

参考文献

【1】20171030-天风证券-天风证券金工专题报告:因子正交全攻略,理论、框架与实践

【2】20180310-光大证券-光大证券多因子系列报告之十:因子正交与择时,基于分类模型的动态权重配置

【3】20170119-海通证券-选股因子系列研究(十七):选股因子的正交

多因子尝试(一):因子加权

资产瞎配模型(一):MVO、风险平价等

资产瞎配模型(二):对(一)的纠正

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化小白躺平记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
特征向量中有负值 后面无法开方导致后面全是na这种情况请问有什么办法解决吗
特征向量中有负值 后面无法开方导致后面全是na这种情况请问有什么办法解决吗
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
单因子测试(上)——因子中性化
之前做了很多因子测试的工作,但一直没有总结,感觉很凌乱,决定花时间把这部分东西写一写,温故知新,也为后续学习打基础。首先写一下单因子测试部分,分三篇,数据预处理一篇, 回归法一篇,分层测试法一篇。本篇首先说明多因子模型是什么,随后着重于单因子测试流程及数据预处理的细节,附代码。
量化小白
2019/01/22
12.7K0
因子评估全流程详解
首先,这是一篇值得收藏的干货文。基本上覆盖到了因子评估的每个方面每个细节,小白友好型,很长,慢慢看。
量化小白
2023/04/03
5.2K1
因子评估全流程详解
Fama-French三因子回归A股实证(附源码)
Fama-French三因子回归是量化中最经典的模型之一,最早提出是在论文《Common risk factors in the returns on stocks and bonds》中,FAMA三因子回归模型可表示如下
量化小白
2023/04/03
4.7K3
Fama-French三因子回归A股实证(附源码)
当我们说正交化的时候,我们在说些什么
这篇没有新的内容,只是把一个老的掉牙的东西,想的更清楚一些。关于正交化,很早之前写过一篇《因子正交化》,细节可以参考这篇,不再展开。
量化小白
2023/03/19
6620
当我们说正交化的时候,我们在说些什么
Carhart四因子模型A股实证(附源码)
接上一篇《Fama-French三因子回归A股实证》,继续写Carhart四因子模型,整个过程比较容易,还是基于Fama三因子的框架,多加进去一个动量因子进行回归。全文的代码数据论文获取请在后台回复“C4"。
量化小白
2020/11/17
4.4K0
Carhart四因子模型A股实证(附源码)
分层风险平价:基于图论和机器学习的新资产配置方法(附代码)
风险平价是构建多样化和均衡投资组合十分流行选择。众所周知,大多数资产类别的未来表现很难预测。 通过仅使用资产的风险特征和相关矩阵构建投资组合,风险平价方法克服了这一缺点。Lohre、Rother和Schafer三位作者在经典风险平价基础上,提出了分层风险平价。他们的方法是:
量化投资与机器学习微信公众号
2020/02/26
2.1K0
多因子尝试(一):因子加权方法在选股中的应用
之前在A股动量与反转的实证过程中,提到了因子择时和风格轮动的重要性,本篇算是对因子择时的一个小小的尝试,没有什么创新性,只是把现在比较传统的方法都拿来试了一遍,目前没有能力创造方法,只做方法的搬运工。
量化小白
2019/08/29
6.8K0
资产瞎配模型(一)
大类资产配置是量化中一个重要的领域,本文尝试实现若干资产配置模型。全文纯属瞎配,欢迎指正!
量化小白
2019/01/22
2K1
多因子模型之因子(信号)测试平台----因子值的处理(一)
在开始今天的内容前,我们要先了解几个概念。许多书本上,可能不会这样讲,这个仅仅是笔者的一些感悟。
钱塘小甲子
2019/01/28
2K0
用Python实现因子分析
因子分析(factor analysis)因子分析的一般步骤factor_analyzer模块进行因子分析使用Python实现因子分析初始化构建数据将原始数据标准化处理 X计算相关矩阵C计算相关矩阵C的特征值 和特征向量 确定公共因子个数k构造初始因子载荷矩阵A建立因子模型将因子表示成变量的线性组合.计算因子得分.
用户3577892
2020/06/10
6.8K0
Python——因子分析(KMO检验和Bartlett’s球形检验)「建议收藏」
因为数据是面试中的得分,量纲相同,并且数据的分布无异常值,所以数据可以不进行标准化。
全栈程序员站长
2022/07/05
3.8K1
Python——因子分析(KMO检验和Bartlett’s球形检验)「建议收藏」
多因子模型之组合构建与优化器(上)
        根据多因子模型,或者说alpha策略的开发顺序,我们应当是按照:因子--》alpha 模型--》风险模型--》组合构建 这样几个模块来的。今天来说说组合构建这个事。         组合构建是在你有了alpha模型和风险模型之后,也就是说,你现在可以预测股票的收益和股票的风险了。那么我们怎么构建组合呢? 大概有这么几种方法:         a.根据alpha模型,选择前面N个预测收益高的股票,然后权重都是1/N;         b.市值加权,当然也可以市值平方根或者市值对数加权,都属于这一类;         c.使用现代portfolio理论,说白了,就是上优化器。
钱塘小甲子
2019/01/28
1.5K0
机器学习算法之PCA算法
在机器学习中降维是我们经常需要用到的算法,在降维的众多方法中PCA无疑是最经典的机器学习算法之一,最近准备撸一个人脸识别算法,也会频繁用到PCA,本文就带着大家一起来学习PCA算法。
BBuf
2019/12/04
1.3K0
机器学习算法之PCA算法
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】
  Jacobi 旋转法的每一次迭代中,需要选择一个非对角元素最大的位置,然后构造相应的旋转矩阵,进行相似变换,使得矩阵逐渐对角化。
Qomolangma
2024/07/30
3630
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】
Python3对多股票的投资组合进行分析「建议收藏」
目前,金融市场总是变幻莫测,充满了不确定因素,是一个有许多投资风险的市场。这与其本身的市场规律和偶然性有关,金融危机、国家政策以及自然灾难等都会影响到金融市场,均会影响投资的收益情况。所以投资者总是希望能够找到应对的方法来减少投资的风险而增加收益。随着老百姓对合理的财富分配理论有着迫切的需求,学会优化投资理财,做到理性投资,是当前投资者最关心的问题。
全栈程序员站长
2022/09/27
2.8K0
Python3对多股票的投资组合进行分析「建议收藏」
Fama-Macbeth 回归和Newey-West调整
Fama Macbeth是一种通过回归方法做因子检验,并且可以剔除残差截面上自相关性的回归方法,同时为了剔除因子时序上的自相关性,可以通过Newey West调整对回归的协方差进行调整。
量化小白
2019/12/30
14.4K25
基于Python的多因子分析
最近看了很多的关于因子分析的资料,整理出这篇理论+实战文章分享给大家。后续会出一篇PCA主成分分析的文章,将主成分分析和因子分析两种降维的方法进行对比。
皮大大
2021/11/06
2.4K1
基于Python的多因子分析
资产瞎配模型(二):对瞎配(一)中净值计算错误的纠正
上上周发的那篇资产瞎配模型,事实证明,果然是瞎配,有大佬指出组合净值计算有一定的问题,所以这里对净值计算部分及进行改正,重新计算结果。
量化小白
2019/01/22
1.6K0
“猜你喜欢”的背后揭秘——我偷偷知道你喜欢什么哟
话说,最近的瓜实在有点多,从我科校友李雨桐怒锤某男、陈羽凡吸毒被捕、蒋劲夫家暴的三连瓜,到不知知网翟博士,再到邓紫棋解约蜂鸟、王思聪花千芳隔空互怼。
用户1621951
2019/06/06
8580
“猜你喜欢”的背后揭秘——我偷偷知道你喜欢什么哟
【Python基础系列】常见的数据预处理方法(附代码)
本文简单介绍python中一些常见的数据预处理,包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。
Ai学习的老章
2020/08/28
19.2K0
推荐阅读
相关推荐
单因子测试(上)——因子中性化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档