第四章:因子构建与筛选
各位同学,今天我们来聊聊因子构建与筛选。说实话,这是整个固收量化策略中最核心、也最磨人的环节。我做了这么多年,见过太多人一上来就堆砌几十个因子,结果回测曲线漂亮得像假的一样——嗯,后来发现确实是假的,过拟合了。
4.1 宏观因子:市场的底色
宏观因子,说白了就是给债券市场画底色。利率债、信用债,谁也逃不开宏观环境的影响。
我个人习惯把宏观因子分成三类:
- 增长因子:GDP、工业增加值、PMI。这些指标告诉你经济是热是冷。
- 通胀因子:CPI、PPI、核心通胀。通胀一高,债券就难受。
- 政策因子:央行操作、利率决议、社融数据。政策转向往往是最猛的。
我在项目中遇到过一个问题:宏观数据发布频率低,而且有滞后。你拿上个月的CPI去预测明天的债券收益率,效果往往很差。怎么办?我建议用高频替代指标,比如用大宗商品价格、航运指数来实时跟踪通胀预期。
核心经验:宏观因子不要直接用原始值,要做差分或标准化。否则不同量纲的因子放在一起,模型会乱套。
4.2 估值因子:便宜还是贵?
估值因子,就是回答一个问题:当前这个债券,到底值不值这个价?
常用的估值因子包括:
- 到期收益率:最直接的估值指标。
- 信用利差:同期限国债与信用债的收益率差。
- 期限利差:长端与短端收益率的差值。
- Z-Spread:考虑了利率期限结构的利差指标。
你想想看,如果一个信用债的利差已经处于历史95%分位数,那它大概率是被低估了。但要注意——我曾经踩过一个坑:利差高不一定代表便宜,也可能是基本面真的恶化了。所以估值因子一定要结合信用因子一起看。
避坑指南:我曾经直接用历史分位数做估值信号,结果在2016年信用违约潮中亏得很惨。后来我加了行业景气度作为辅助过滤,效果才稳定下来。
4.3 动量因子:趋势是你的朋友
动量因子在股票里用得很多,在债券里其实也有效。只不过债券的动量更温和,不像股票那么剧烈。
我常用的动量因子有:
- 价格动量:过去N日的收益率。N我一般取20、60、120个交易日。
- 利差动量:信用利差的短期变化方向。
- 波动率调整动量:用波动率对动量做标准化,避免在震荡市被反复打脸。
为什么会这样?因为债券市场参与者以机构为主,行为相对理性,趋势一旦形成,往往能持续一段时间。但要注意,动量因子在利率快速转向时容易失效——比如央行突然降息,之前的下跌趋势瞬间反转。
警告:动量因子不要单独使用。我见过有人只靠动量做信用债,结果在2018年民企违约潮中连续踩雷。动量因子必须和信用因子、估值因子配合使用。
4.4 信用因子:别踩雷
信用因子,是固收量化里最需要小心处理的。毕竟债券亏起来,可不是跌几个点那么简单,可能直接归零。
我常用的信用因子包括:
| 因子类别 | 具体指标 | 说明 |
|---|---|---|
| 财务因子 | 资产负债率、利息保障倍数、现金流覆盖率 | 反映企业偿债能力 |
| 市场因子 | 信用评级、评级展望、CDS价格 | 市场对信用的定价 |
| 行为因子 | 大股东质押比例、关联交易、审计意见 | 公司治理风险 |
我个人习惯把信用因子做成打分卡。每个指标打分,然后加权汇总。分数低于某个阈值,直接剔除。嗯,这里要注意:打分卡的权重不要拍脑袋,要用历史数据回测优化。
核心经验:信用因子最重要的是时效性。我见过有人用半年前的财报数据做信用评分,结果公司已经ST了还不知道。建议至少每季度更新一次信用评分。
4.5 因子IC/IR分析:谁才是真英雄?
因子建了一大堆,怎么知道哪个有用?这就轮到IC和IR登场了。
- IC(信息系数):因子值与未来收益的相关系数。IC为正,说明因子能预测上涨。
- IR(信息比率):IC的均值除以IC的标准差。IR越高,因子越稳定。
我一般用Rank IC,也就是秩相关系数。为什么?因为债券收益分布往往有厚尾,用皮尔逊相关系数容易受极端值影响。
下面是一个简单的IC计算代码示例:
import pandas as pd
import numpy as np
from scipy.stats import spearmanr
def calc_ic(factor_series, return_series):
"""
计算Rank IC
factor_series: 因子值
return_series: 未来N日收益率
"""
ic, p_value = spearmanr(factor_series, return_series)
return ic, p_value
# 示例:计算某个因子的月度IC
factor_data = pd.Series([0.5, 0.3, -0.2, 0.1, -0.4])
return_data = pd.Series([0.02, 0.01, -0.01, 0.005, -0.02])
ic, p = calc_ic(factor_data, return_data)
print(f"IC: {ic:.3f}, p-value: {p:.3f}")
筛选因子的标准,我个人习惯是:
- IC均值:绝对值大于0.02,且方向稳定。
- IR:大于0.5,说明因子信号稳定。
- IC序列自相关:不能太高,否则因子有滞后性。
- 因子间相关性:两两相关性不超过0.7,避免多重共线性。
避坑指南:我曾经筛选出IC很高的因子,结果实盘一跑就亏。后来发现是因为IC计算时用了未来数据——回测时不小心用了T+1的数据。所以,IC计算一定要严格对齐时间戳,避免前视偏差。
4.6 因子筛选流程:一张图说清楚
下面这张图是我自己总结的因子筛选流程,你可以直接拿去用:
这张图看起来简单,但每一步都有坑。比如数据清洗这一步,我曾经因为没处理极端值,导致IC计算完全失真。一个异常值就能把相关系数从0.05拉到0.3——你以为找到了宝贝,其实是噪声。
4.7 小结
因子构建与筛选,说白了就是去伪存真的过程。宏观因子定方向,估值因子定价格,动量因子定时机,信用因子定安全。四者缺一不可。
我个人建议,刚开始做因子研究时,不要贪多。先选5-8个核心因子,把IC/IR分析做扎实了,再慢慢扩展。因子不是越多越好,而是越精越好。
最后一句:因子筛选没有银弹。每个市场、每个品种、每个周期,有效的因子组合都不一样。保持敬畏,持续迭代,才是正道。