拓冰建站拓冰建站
首页 / 资讯中心 / 正文

gs-quant 因子合成实战:用 PCA 与因子分析把 10 个高相关因子压成 3 个

gs-quant 因子合成实战用 PCA 与因子分析把 10 个高相关因子压成 3 个【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant手里攥着 10 个风格因子——市值、估值、动量、波动率、流动性……两两一算相关性好几位都超过 0.6。直接加权合成等于对同一个信号重复下注敞口被放大风险高度集中因子库看起来比实际更厚。这就是多因子模型里因子合成要解决的问题。gs-quant 工具包可以把风险模型里的因子数据拉成 DataFrame再配合几行降维代码把冗余因子压成少数几个正交或近正交的合成因子。一分钟看懂 PCA 与因子分析一个压缩照片一个诊断病因**PCA主成分分析**像给照片压缩体积不关心细节纹理只保留轮廓最清晰的主方向压出来的主成分互相正交信息密度最高但你很难说出第一主成分到底是什么。**因子分析FA**更像从症状反推病因一堆症状原始因子背后其实只有少数几个病根潜在因子FA 的目标就是找出这些病根并给出每个症状与病根的关联强度载荷因子天然带有可以被命名的属性比如价值风格动量风格。两者输入相同、输出用途不同要压缩和去噪选 PCA要解释和命名选 FA。gs-quant 本身负责取数与度量分解运算交给 numpy / sklearn 完成这条分工先记住下面按四步走。四步上手从因子数据到合成因子第一步用 FactorRiskModel 取因子暴露import datetime as dt from gs_quant.models.risk_model import ( FactorRiskModel, DataAssetsRequest, RiskModelUniverseIdentifierRequest, ReturnFormat, ) model FactorRiskModel.get(MODEL_ID) # 你的风险模型 ID start_date, end_date dt.date(2022, 1, 1), dt.date(2022, 12, 31) exposure model.get_universe_exposure( start_date, end_date, assetsDataAssetsRequest(RiskModelUniverseIdentifierRequest.gsid, [M0Z04P488Y57, M0Z04P488Y57]), get_factors_by_nameTrue, formatReturnFormat.DATA_FRAME, )返回的exposure是因子暴露 DataFrame。想先确认到底哪些因子冗余可以用model.get_factor(Momentum).correlation(model.get_factor(Value), start_date, end_date)拉两两相关系数序列相关明显偏高的那几对就是合成对象。第二步清洗与标准化import pandas as pd from gs_quant.timeseries import winsorize factors exposure # 行资产×日期列因子 # 逐列做 Winsorize 去极端值默认 2.5 倍标准差截断 clean factors.apply(lambda col: winsorize(col, limit2.5), axis0) # 再做截面 z-score让不同量纲的因子可比 clean clean.sub(clean.mean()).div(clean.std())这一步不能省PCA 对尺度敏感量纲大的因子会抢走主成分的解释方差。第三步跑 PCA 得到主成分得分import numpy as np cov_matrix clean.cov().values eigvals, eigvecs np.linalg.eigh(cov_matrix) order np.argsort(eigvals)[::-1] eigvals, eigvecs eigvals[order], eigvecs[:, order] n 3 pca pd.DataFrame(clean.values eigvecs[:, :n], columns[fPC{i1} for i in range(n)]) print(解释方差占比:, (eigvals[:n] / eigvals.sum()).round(4))eigvals从大到小排列后画个散点碎石图就能定 n特征值跌到 1 以下的主成分基本可以不要。第四步用因子分析提取潜在因子gs-quant 里没有内置的 FA 估计器分解部分用 sklearn 即可数据仍来自风险模型from sklearn.decomposition import FactorAnalysis fa FactorAnalysis(n_components3, random_state42) fa_scores fa.fit_transform(clean.values) fa pd.DataFrame(fa_scores, columns[fF{i1} for i in range(3)]) loadings fa.components_.T # 形状: 3 个因子 × 原始因子数loadings每个因子一行哪一列权重高就说明该因子偏向哪个原始风格——这就是给病根命名的依据。怎么选PCA 还是 FA只关心压缩、降维、去共线性不需要解释→ PCA输出正交、计算快要给合成因子取名字、写进归因报告→ FA载荷矩阵提供解释抓手原始因子平均相关低于 0.3→ 冗余本身不大先做因子筛选合成收益有限因子间相关性高、彼此纠缠→ 合成收益最明显优先上 PCA最终裁判是验证拿合成因子对下期收益算 IC / ICIRgs_quant.timeseries的correlation、cov都能派上用场再和原始因子等权组合做回测对比夏普与回撤谁占优一目了然常见坑与一句解法⚠️ 载荷解释性差、一个因子混了七八个风格 → 对 FA 做 Varimax 旋转后再看载荷⚠️ 合成因子得分隔月漂移策略跟着乱跳 → 改滚动窗口如 12 个月重估别一次性吃全部历史⚠️ 样本期太短、因子数多模型过拟合 → 缩短 n、加长窗口用留一年做样本外检验⚠️ 个别资产因子缺失率很高 → 先按截面中位数填充再做 Winsorize 与标准化⚠️ 主成分数量拿不准 → 双标准Kaiser 准则特征值 1 累计解释方差 ≥ 70%写在最后因子合成不是越少越好而是把冗余压掉、把信号留下PCA 给你正交与效率FA 给你解释与命名用 IC 和回测做最终裁决。仓库里 05_factor_models 示例 和 上传自定义因子模型教程 可以直接照着跑通完整流程更多 API 见 docs/models.rst。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门