gs-quant 因子合成手把手教程:PCA 与因子分析 3 步搞定高维因子降维
gs-quant 因子合成手把手教程PCA 与因子分析 3 步搞定高维因子降维【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant你手里攒了一堆因子市值、估值、动量、波动率、流动性……十几个指标挤在一起互相之间还高度相关——市盈率因子和市净率因子讲的几乎是同一件事。这时候直接把整列因子扔进模型结果往往是模型把冗余信息当成了独立信号预测结果忽上忽下还很难说清楚到底是哪个因子在起作用。gs-quant 是一个 Python 量化金融工具包其中的RiskModel风险模型模块能帮你拉取标准化的因子暴露数据再配合gs_quant.timeseries的统计函数就能把一团纠缠的因子压缩成少数几根独立主线这就是多因子模型里的因子合成。读完这篇你会知道怎么拿到干净因子数据、怎么判断该用 PCA 还是因子分析FA、又该看哪些指标验证合成效果。PCA 和因子分析到底差在哪一句话PCA 是压缩FA 是解释——你的目标不同选法就不同。PCA 主成分分析FA 因子分析核心目标把数据压成少数几个方向保留尽可能多的信息挖出数据背后隐藏的公共因子区分共同变化和各自独有变化一句话思路找数据里波动最大的几个正交方向把数据投影上去假设观测公共因子贡献独有噪声反推因子载荷适合场景数据压缩、去噪、降维、可视化你想给每个因子起个经济学名字如价值动量因子是否正交强制正交互不干扰默认斜交可通过旋转变得更可解释怎么选如果你的因子又多、相关性又强先上 PCA它没有分布假设最稳如果你最终要对外解释第 1 个因子是什么再考虑 FA 加旋转。下面这张图是原始因子到合成因子的完整数据流三步跑通因子合成① 拿到干净因子数据数据质量决定上限缺失值和量纲不处理后面全白搭。因子数据直接从RiskModel拉按股票和日期组织成宽表。from gs_quant.models import RiskModel import datetime as dt risk_model RiskModel.get(你的模型ID) exposures risk_model.get_universe_exposure( start_datedt.date(2020, 1, 1), end_datedt.date(2023, 12, 31) ) factors exposures[[pe_ratio, momentum, volatility]] factors factors.fillna(factors.median()) # 中位数填充比均值更不怕极端值 factors (factors - factors.mean()) / factors.std() # z-score把每个因子拉到同一量纲为什么标准化因为市值可能是几百亿动量可能是 0.3不拉到同一尺度PCA 会只跟着大数值因子跑。② 选对合成方法PCA 还是 FA先体检再动手因子冗余程度决定你走哪条路。两个快速判断算因子间平均相关系数超过 0.4 说明冗余明显PCA 收益大KMO 检验样本适切性度量高于 0.7 且 Bartlett 球形检验显著说明因子间共享结构强FA 才划算。mean_corr factors.corr().abs().values.mean() print(mean_corr) # 大于 0.4 → 冗余明显先试 PCA逻辑很简单平均相关系数低因子本来就不太相关合成意义不大直接用原始因子即可高且 KMO 达标才值得花时间做降维。③ 验证合成效果碎石图怎么看拐点、载荷怎么读合成完不算完拐点定了因子数量载荷定了因子含义。碎石图就是按从大到小排好各主成分的特征值找曲线明显变平的那个位置它左边就是值得保留的因子数。import numpy as np eigenvalues, _ np.linalg.eig(factors.cov().values) eigenvalues np.sort(eigenvalues)[::-1] # 从大到小排画碎石图 ratio eigenvalues / eigenvalues.sum() print((ratio.cumsum() * 100).round(1)) # 累计解释方差看前几个是否已经够了载荷矩阵每个因子在各主成分上的权重要这样读如果估值和低波动在 PC1 上载荷都很高PC2 上动量载荷高那 PC1 可命名价值稳定风格、PC2 命名动量风格。读不出清晰经济含义就说明该换个因子数量或换 FA 旋转。效果验证看什么指标合成因子到底好不好就看它能不能稳定地预测收益。用下面这张速查表对着你的回测结果打勾指标一句话含义经验阈值IC信息系数因子值与下期收益的相关性正且越大越好稳定在 0.03 以上算可用ICIRIC 的均值除以标准差衡量 IC 的稳定性大于 0.5 算比较稳夏普比率每单位风险换来多少超额收益年化大于 1 算及格最大回撤组合从高点到低点最差跌多少越小越好注意控制结果怎么读IC 高但 ICIR 低说明因子时灵时不灵合成后波动没被真正降下来IC 和 ICIR 都高、夏普也跟着抬升说明合成因子确实把噪声挤掉了。文中阈值仅为演示口径真实项目必须用你自己的资产池和时间窗口回测。新手最常踩的 4 个坑① 载荷解释性差现象主成分读不出任何经济含义。原因默认主成分方向是数学最优、不是业务最优。解法换 Varimax 正交旋转或 Promax 斜交旋转。② 样本量不足过拟合现象回测漂亮、一上线就崩。原因因子数相对样本太多模型记住了噪声。解法加正则化如带 L1 的 PCA或按时间段做交叉验证。③ 滚动窗口不稳定现象换一段窗口合成因子就变脸。原因窗口太短特征值排序对个别极端值敏感。解法把滚动窗口拉长比如 6 个月起步让排序更平滑。④ 高维计算慢现象因子上千个特征值分解卡住。原因完整分解的复杂度随维度立方增长。解法用随机 SVD 只算前 k 个成分速度快几个量级。再进一步非线性合成用核 PCA 或自编码器替代线性投影捕捉因子间的非线性结构。时序因子结合 LSTM 等模型提取随时间演化的动态因子替代固定窗口。端到端联合优化把因子选择—合成—组合优化串成一条可回测的流水线而不是手工分步做。项目内的配套材料可以从这里继续看风险模型 API 在 gs_quant/models/risk_model.py统计函数cov、std、winsorize在 gs_quant/timeseries/statistics.py完整因子模型示例在 gs_quant/documentation/05_factor_models/其余教程文档见 docs/。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考