这是什么
因子之间的相关性是多头量化模型的隐形杀手:信号看似丰富,实际是同一风险暴露的反复押注。本技能把一组相关因子变换为线性无关、互相关为零的正交因子集。
解决什么问题
- 多因子模型共线性:IC 高但组合波动来源解释不清
- 因子重叠导致仓位在隐性风险上过度集中
- 降维需求:alpha 研究中特征列冗余
核心能力
- 三种正交方法:Gram-Schmidt(保序)、PCA(方差最优)、Cholesky(因式变换),按场景选择
- 零互相关保证:输出因子集经独立性检验
- 通用特征列处理:不限于金融因子,任意数值特征列均可
- 报告输出:变换前后相关性矩阵对比、因子载荷、方差解释率
快速开始(示例指令)
- "我有5个因子相关性都挺高,帮我正交化,输出新的因子值"
- "用PCA把这20个特征降到5个正交因子,给出方差解释率"
- "检查这组因子去相关之后是否真的独立"
常见问题
Q: 输入数据格式?
CSV/表格均可,行为样本、列为因子;数据缺失会先提示处理方式(剔除/填充),不会静默插值。
Q: 三种方法怎么选?
保留因子原始顺序与解释性选 Gram-Schmidt;追求方差压缩选 PCA;已有协方差结构想做变换选 Cholesky。不确定时默认 Gram-Schmidt 并附选择建议。
Q: 样本量有要求吗?
样本数应大于因子数,否则给出明确告警与最小样本建议。
Q: 和同系列技能的关系?
《A股数据获取》供数 → 因子构造 → 本技能正交化 → 《Vibe Trading》回测 → 《回测过拟合诊断》检验,形成完整流水线。
更新日志
- v1.1.0:补齐详情页与 FAQ;摘要中文化;增强缺失值与样本量不足的校验提示(针对错误处理短板)
- v1.0.1:Initial release
析衡量化 · 因子正交化(xiheng-factor-orthogonalize)
> 量化因子正交化工具 —— 多因子模型共线性处理、因子去相关与正交因子构造。
用途
对一组数值型因子(alpha 因子 / 风险因子 / 任意数值特征列)做正交化处理,把相关因子转换为互不相关(线性独立)的因子集,输出正交化后的因子载荷矩阵,可直接接入多因子选股模型或风险模型使用。
触发场景
- 用户提供多因子日频/周频数据,要求"因子去相关后做多因子合成"
- 用户构建多因子选股模型,遇到共线性(VIF > 5)需要处理
- 用户做风险因子模型(如 Barra-style),需要构造 N 个正交风格因子
- 用户做因子分析或因子降维,需要基于相关矩阵的因子分解
- 用户用 PCA / Gram-Schmidt / Cholesky 对因子载荷做正交化
工作流(5 步)
Step 1:因子数据读取
输入支持三种格式:
- CSV 因子收益:
factor_name × date矩阵,行为交易日,列为各因子 - JSON 因子载荷:
{factor_name: [w_1, w_2, ..., w_N]}因子在 N 个股票上的载荷 - Parquet 因子收益:高性能场景
Step 2:因子预处理
1. 缺失值处理:前向填充 + 截面均值填补(IC=NaN 当日剔除)
2. 标准化:z-score (x - mean) / std,按日或全样本
4. 极值处理:缩尾 ±3σ 或 winsorize
5. 行业中性化(可选):对每个行业内做 demean
Step 3:计算相关/协方差矩阵
R = factors_df.corr() # 相关矩阵(标准用法)
C = factors_df.cov() # 协方差矩阵(保留量级时用)
Step 4:调用正交化
四种内置算法,按场景选用:
# 施密特正交化(保留因子可解释性)
python scripts/orthogonalize.py --method gramschmidt \
--input factors.csv --output orthogonal_factors.csv
# 主成分分析(最大化信息保留)
python scripts/orthogonalize.py --method pca \
--input factors.csv --output orthogonal_factors.csv --n-components 8
# Cholesky 分解(基于协方差矩阵的白化变换)
python scripts/orthogonalize.py --method cholesky \
--input factors.csv --output orthogonal_factors.csv
# 贪心相关剔除(保留原始因子命名)
python scripts/orthogonalize.py --method greedy_decorrelate \
--input factors.csv --output orthogonal_factors.csv --threshold 0.3
Step 5:交付
- 输出
orthogonal_factors.csv:正交化后的因子收益矩阵 - 输出
factor_loadings.json:每个新因子的原始因子构成(系数向量) - 输出
correlation_report.txt:验证正交性(对角线=1,对角线外 < 0.01) - 输出
vif_report.csv:原 VIF vs 正交化后 VIF(应全部 < 1.5)
关键文件
scripts/orthogonalize.py— 四种正交化算法(gramschmidt/pca/cholesky/greedy_decorrelate)scripts/extract_factor_returns.py— 从 CSV/Parquet 读取因子收益并预处理scripts/verify_orthogonality.py— 验证正交性(相关矩阵 + VIF)references/algorithms.md— 四种算法原理与适用场景references/factor_types.md— 常见因子分类与正交化建议assets/sample_factor_returns.csv— 示例因子收益矩阵assets/sample_loadings.json— 示例因子载荷
注意事项
- 算法选择:
-grams┌schmidt:保留因子可解释性(每个新因子是原始因子的线性组合且命名清晰),推荐用于因子库去重
-pca:最大化信息保留,但新因子无业务含义,推荐用于风险模型
-cholesky:保留全部信息且输出白噪声化,常用于协方差矩阵求逆
-greedy_decorrelate:保留原始因子名(仅剔除冗余),推荐用于因子库初步筛选 - 样本对齐:因子收益必须按日对齐;IC 计算周期建议 ≥ 252 个交易日
- 正交 ≠ 独立:正交化只能保证线性独立,因子之间仍可能存在非线性关系
- 回测必须:正交化后须重跑 IC/RankIC 检验,确认合成因子预测力无明显衰减
- 行业中性化:A 股市场强烈建议做行业中性化后再正交化,避免中性化不足导致因子暴露集中
- 样本期选择:用近 3 年数据训练正交化矩阵,再用前 1 年样本外验证稳定性
与同系列其他技能的关系
> 本技能属于 析衡量化 系列,统一入口见 xiheng-quant-toolkit:
> series.py list 看系列全景,series.py route <场景> 定位技能,series.py chain <场景> 看整条调用链。
| 方向 | 技能 | 衔接方式 |
|---|---|---|
| 上游 | xiheng-data-fetch 数据获取 |
季频财务与行情 CSV 作为因子的原始列,按日期与代码对齐后入模 |
| 下游 | xiheng-vibe-trading 策略回测 |
正交因子矩阵可直接作为多因子组合的输入信号 |
| 下游 | xiheng-backtest-overfit 回测过拟合诊断 |
正交化的方法选择与参数同样可能存在过拟合,可交由诊断检验 |
> 系列地图维护在 xiheng-quant-toolkit/assets/series.json;本技能在该地图中的条目(slug/stage/role/feeds/triggers)应保持同步。