第四章:因子构建与筛选

各位同学,今天我们来聊聊因子构建与筛选。说实话,这是整个固收量化策略中最核心、也最磨人的环节。我做了这么多年,见过太多人一上来就堆砌几十个因子,结果回测曲线漂亮得像假的一样——嗯,后来发现确实是假的,过拟合了。

4.1 宏观因子:市场的底色

宏观因子,说白了就是给债券市场画底色。利率债、信用债,谁也逃不开宏观环境的影响。

我个人习惯把宏观因子分成三类:

  • 增长因子:GDP、工业增加值、PMI。这些指标告诉你经济是热是冷。
  • 通胀因子:CPI、PPI、核心通胀。通胀一高,债券就难受。
  • 政策因子:央行操作、利率决议、社融数据。政策转向往往是最猛的。

我在项目中遇到过一个问题:宏观数据发布频率低,而且有滞后。你拿上个月的CPI去预测明天的债券收益率,效果往往很差。怎么办?我建议用高频替代指标,比如用大宗商品价格、航运指数来实时跟踪通胀预期。

核心经验:宏观因子不要直接用原始值,要做差分或标准化。否则不同量纲的因子放在一起,模型会乱套。

4.2 估值因子:便宜还是贵?

估值因子,就是回答一个问题:当前这个债券,到底值不值这个价?

常用的估值因子包括:

  • 到期收益率:最直接的估值指标。
  • 信用利差:同期限国债与信用债的收益率差。
  • 期限利差:长端与短端收益率的差值。
  • Z-Spread:考虑了利率期限结构的利差指标。

你想想看,如果一个信用债的利差已经处于历史95%分位数,那它大概率是被低估了。但要注意——我曾经踩过一个坑:利差高不一定代表便宜,也可能是基本面真的恶化了。所以估值因子一定要结合信用因子一起看。

避坑指南:我曾经直接用历史分位数做估值信号,结果在2016年信用违约潮中亏得很惨。后来我加了行业景气度作为辅助过滤,效果才稳定下来。

4.3 动量因子:趋势是你的朋友

动量因子在股票里用得很多,在债券里其实也有效。只不过债券的动量更温和,不像股票那么剧烈。

我常用的动量因子有:

  1. 价格动量:过去N日的收益率。N我一般取20、60、120个交易日。
  2. 利差动量:信用利差的短期变化方向。
  3. 波动率调整动量:用波动率对动量做标准化,避免在震荡市被反复打脸。

为什么会这样?因为债券市场参与者以机构为主,行为相对理性,趋势一旦形成,往往能持续一段时间。但要注意,动量因子在利率快速转向时容易失效——比如央行突然降息,之前的下跌趋势瞬间反转。

警告:动量因子不要单独使用。我见过有人只靠动量做信用债,结果在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}")

筛选因子的标准,我个人习惯是:

  1. IC均值:绝对值大于0.02,且方向稳定。
  2. IR:大于0.5,说明因子信号稳定。
  3. IC序列自相关:不能太高,否则因子有滞后性。
  4. 因子间相关性:两两相关性不超过0.7,避免多重共线性。

避坑指南:我曾经筛选出IC很高的因子,结果实盘一跑就亏。后来发现是因为IC计算时用了未来数据——回测时不小心用了T+1的数据。所以,IC计算一定要严格对齐时间戳,避免前视偏差。

4.6 因子筛选流程:一张图说清楚

下面这张图是我自己总结的因子筛选流程,你可以直接拿去用:

因子筛选流程图 因子池构建 数据清洗与标准化 IC/IR分析 相关性检验 最终因子集 宏观因子 估值因子 动量因子 信用因子 IC均值 > 0.02 IR > 0.5 相关性 < 0.7 剔除缺失值>30% 剔除极端值 剔除冗余因子

这张图看起来简单,但每一步都有坑。比如数据清洗这一步,我曾经因为没处理极端值,导致IC计算完全失真。一个异常值就能把相关系数从0.05拉到0.3——你以为找到了宝贝,其实是噪声。

4.7 小结

因子构建与筛选,说白了就是去伪存真的过程。宏观因子定方向,估值因子定价格,动量因子定时机,信用因子定安全。四者缺一不可。

我个人建议,刚开始做因子研究时,不要贪多。先选5-8个核心因子,把IC/IR分析做扎实了,再慢慢扩展。因子不是越多越好,而是越精越好。

最后一句:因子筛选没有银弹。每个市场、每个品种、每个周期,有效的因子组合都不一样。保持敬畏,持续迭代,才是正道。

蓝海数据掘金营,专注资料整理