ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

多因子模型因子降维与因子合成指南:用 PCA 与因子分析把 10 个冗余因子压成 3 个

多因子模型因子降维与因子合成指南:用 PCA 与因子分析把 10 个冗余因子压成 3 个 多因子模型因子降维与因子合成指南用 PCA 与因子分析把 10 个冗余因子压成 3 个【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quantgs-quant 是一个 Python 量化金融工具包。当一堆因子高度相关时会引来维度灾难与信息冗余本文讲清如何用主成分分析PCA和因子分析FA把一摞冗余因子压成少量正交合成因子并跑通判读与选型的完整流程。因子越堆越多模型为什么会病先说结论因子不是越多越好。想象你手里有 10 个因子市值、估值、动量、流动性、换手率、波动率……其中好几个其实说的是同一件事。两个典型症状维度灾难估值、流动性、换手率彼此相关性都在 0.7 以上回归里它们互相抢功劳系数一会儿正一会儿负模型对数据抖动极度敏感。高相关因子放进同一组回归等于让三个人用同一句话作证——信息量没变噪声却翻了三倍。信息冗余多因子模型本质上是用少数驱动因子解释资产收益。如果喂进去的 10 个因子背后其实只有 3 个独立信号剩下 7 个就是在重复计费还会稀释真正有效的因子权重。gs-quant 里这类问题很常见FactorRiskModel能一次性给你拉出成百上千个因子及其协方差矩阵见 gs_quant/models/risk_model.py因子间相关性一高直接等权合成或进回归都会出事。解法就一句话先降维再合成——用 PCA 或 FA 把 10 个冗余因子压成 3 个左右互相正交互不相关的合成因子后面所有建模工作都在这 3 个因子上做。PCA vs FA两种压缩思路一句话说清差异两者都是把一摞因子压成几根轴但出发点和输出不同维度主成分分析PCA因子分析FA核心目标找到方差最大的方向把信息无损地压进去假设因子背后有几个根因把共同部分与个体噪声拆开输出正交主成分得分天然互不相关潜在因子得分 因子载荷矩阵可旋转成斜交类比照片压缩优先保住变化最大的部分找根因照片里的乱象归结为几个原因其余算个性噪声正交性强制正交默认相关可用 Varimax/Promax 旋转适合场景纯压缩、去噪、做特征工程想让合成因子有经济含义如价值动量一行公式带过配人话PCAX ≈ ZWᵀ—— 每个主成分都是原始因子的加权组合权重选在方差最大的方向上。FAX ≈ ΛF ε—— 原始因子由少数潜在因子 F 驱动Λ是因子载荷谁跟着谁动ε是各自的特有部分。一句话选型要干净的正交特征选 PCA要能讲出故事选 FA。从原始因子数据到合成因子四步走整体流程一张图第一步拉数据 预处理用 gs-quant 的FactorRiskModel拉因子暴露再做三件事填缺失、缩尾Winsorize把极端值掐头去尾、标准化Z-score让每个因子均值为 0、标准差为 1量纲一致才能比。from gs_quant.models import FactorRiskModel from gs_quant.timeseries import zscores, winsorize # 统计工具见 gs_quant/timeseries/statistics.py model FactorRiskModel.get(RISK_MODEL_ID) exposure model.get_universe_exposure( # 日期 × 资产 × 因子的暴露数据 start_datedt.date(2021, 1, 4), end_datedt.date(2021, 12, 31), assetsDataAssetsRequest(Identifier.gsid, []) ) # 按截面组织成日期 × 因子矩阵后一行完成 缩尾 标准化 clean pivot.apply(lambda s: zscores(winsorize(s, 2.5)))人话预处理的目的只有一个——别让量纲和极端值决定谁的声音大。估值因子以 20 为刻度、动量以 0.05 为刻度不标准化它们就没法比。第二步选维度——保留几个因子两个实用判据不用死背公式碎石图Scree Plot把特征值从大到小画成折线找肘部——曲线由陡变缓的拐点就是该停的地方。Kaiser 准则标准化后特征值 1 的才算装下了至少一个原始因子的信息数数有几个 1。再看累计解释方差占比实践中合成 3~5 个因子能覆盖 60%~80% 的总方差通常就够了。再多边际信息就很薄了。第三步合成PCA 就是协方差矩阵的特征分解取前 k 个特征向量当压扁轴import numpy as np cov clean.cov() # 因子间协方差矩阵 vals, vecs np.linalg.eigh(cov) # 特征值分解 order np.argsort(vals)[::-1] # 按解释方差从大到小排 k 3 # 第二步选出的维度数 pca_scores clean vecs[:, order[:k]] # 合成因子得分矩阵 evr vals[order] / vals.sum() # 每个主成分的解释方差占比FA 则用极大似然估计载荷顺手做个旋转让结果更好读from sklearn.decomposition import FactorAnalysis fa FactorAnalysis(n_components3, rotationvarimax) fa_scores fa.fit_transform(clean) # 潜在因子得分 loadings fa.components_ # 因子载荷原始因子在各合成因子上的挂钩程度两者的输出可以直接互换进下游PCA 给你正交干净的得分FA 给你带共同方差/特殊方差拆分的得分和载荷表。第四步判读拿到结果别急着回测先花十分钟读看载荷矩阵某合成因子上哪些原始因子载荷大|载荷| 接近 1它就是这些因子的代表。看合成因子间相关性PCA 结果应接近对角阵正交性检查FA 旋转后应出现简单结构——每个原始因子只在某一个合成因子上有显著载荷。看碎石图如果第 4 个特征值还在陡降说明 3 个不够。结果怎么读方法怎么选判读三件事的及格线看什么及格信号不及格信号解释方差占比前 3 个合成因子累计 ≥ 60%累计不到 50%说明原始因子本身很散降维收益有限因子载荷旋转后呈一因子一高载荷的简单结构载荷平均分散说明维度选多了或因子混杂合成因子相关性接近 0正交或按旋转设定斜交相关性 0.5多共线性没解决何时 PCA 更好何时 FA 更好选 PCA目标是特征工程——压缩、去噪、可视化、喂给机器学习模型数据样本不多FA 的极大似然在小样本下估计不稳不需要给因子起经济名字。选 FA目标是讲故事——你要向投委会解释第一个因子是价值想区分市场共同信号与个股特有风险ε项直接可用因子很多且高度相关FA 的共同方差占比能告诉你冗余到底有多大。一个实用组合拳先用 PCA 做快速压缩验证降维有没有信息再对通过验证的维度数用 FA 出最终可解释版本。踩坑与调优清单Q载荷矩阵乱成一锅粥合成因子起不了名字A先做 Varimax正交或 Promax斜交旋转还不行就减少维度数再检查是否把不同族的因子市场 β 族、流动性族混在一起做了合成——分族处理往往立竿见影。Q样本内解释方差 85%一上实盘 IC 就掉A典型过拟合。对策滚动窗口重估比如 12 个月滚动合成用交叉验证挑维度数换正则化 PCA。记住合成因子的解释方差是描述统计不是预测能力的承诺。Q这个月合成因子是价值下个月变成动量不稳定怎么办A特征分解的符号和排序会随数据漂移。对策固定载荷符号约定如最大载荷为正用滚动窗口平滑得分监控载荷矩阵的月度变动超过阈值就重跑选型。Q因子几百个特征分解跑不动A先用随机 SVD近似分解快几个数量级或者像下图那样先对因子做聚类分组、组内再分解——压缩前先分家计算量和可解释性双赢。上线前自查清单预处理缺失值已处理极端值已缩尾已标准化相关矩阵看过平均相关 0.4 再降维才有意义维度数用碎石图 累计解释方差双重确认而不是拍脑袋载荷矩阵可读出经济含义或已明确放弃解释性纯 PCA 路线合成因子与原始因子做了 IC 对比确认降维没把信号压没收尾与延伸选型一句话要正交特征和稳健性选 PCA要经济含义和风险分解选 FA不确定就先 PCA 验证信息量再 FA 出解释版本。gs-quant 把因子暴露、协方差矩阵、因子收益这些原料都封装在FactorRiskModel里示例见 gs_quant/documentation/05_factor_models/降维这一步在本地用 numpy/sklearn 完成即可两边拼起来就是完整闭环。可以继续探索的方向分族聚类后再组内合成市场族/流动性族分开压、滚动时变的合成因子跟踪载荷漂移以及把合成因子接到Portfolio做真实组合回测。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表