4. Alpha因子基础
在Qlib的机器学习Alpha预测流程中,因子是连接原始行情数据与模型预测的桥梁。模型不会直接“看懂”K线,它需要你先把市场信息加工成数值化的特征,这些特征就是因子。因子质量决定了模型上限,模型只是逼近这个上限。本节从因子定义出发,梳理分类体系、常见量价与基本面因子,并重点讲清IC、RankIC、IR等有效性评价指标,为后续特征工程与模型训练打基础。
一、因子的定义与分类
因子(Factor)是对资产某一维度特征的数值化描述,通常以“股票×时间”的二维面板形式存在。在Qlib中,因子最终会被组织成DataFrame,索引为(datetime, instrument),列为因子名。因子的本质是假设“该数值与未来收益存在某种统计关系”,这种关系需要被验证,而不是被默认。
按信息来源,因子可分为三大类:
- 量价因子:来自行情数据,包括价格、成交量、成交额、换手率等,更新频率高、覆盖全市场,是短周期Alpha的主力。
- 基本面因子:来自财务报表与公司公告,如ROE、营收增速、资产负债率,频率低但经济含义清晰,适合中长周期。
- 另类因子:舆情、供应链、卫星、资金流等,数据获取成本高,但在特定场景下有独特增量。
按计算方式,又可分为原始因子(如收盘价)、衍生因子(如收益率、波动率)、复合因子(多因子加权或非线性组合)。分类的意义在于:不同类别因子的数据频率、缺失模式、标准化方式不同,处理策略也应不同。
二、常见量价因子
量价因子是Qlib实战中最先上手的一类。它们计算简单、可解释性强,且与机器学习模型配合良好。常见构造包括:
- 动量类:过去N日收益率,如
Ref($close, -20)/$close - 1,捕捉趋势延续。 - 反转类:短期收益取负,如过去5日收益的相反数,捕捉超跌反弹。
- 波动类:过去N日收益率标准差,衡量风险,低波动因子长期有效。
- 量能类:换手率、量比、成交额均值,反映资金活跃度。
- 价量背离类:价格新高但成交量未新高,常作为反转信号。
在Qlib中,这些因子可通过表达式引擎快速生成。例如:
from qlib.data import D
# 定义因子表达式
fields = [
"Ref($close, -1)/$close - 1", # 1日反转
"Mean($volume, 20)/$volume", # 量比
"Std($close/Ref($close,1)-1, 20)", # 20日波动率
"($close - Mean($close,20))/Std($close,20)" # 布林带位置
]
df = D.features(D.instruments("csi300"), fields, start_time="2020-01-01", end_time="2023-12-31")
print(df.head())
CSZScoreNorm和CSRankNorm处理器可直接完成。三、基本面因子
基本面因子来自财报,频率为季度,存在披露滞后。使用时必须注意“Point-in-Time”原则:只能用当时已披露的数据,否则会引入未来函数。常见因子包括:
- 盈利能力:ROE、ROA、毛利率、净利率。
- 成长能力:营收同比、净利润同比、EPS增速。
- 估值:PE、PB、PS、股息率。
- 财务健康:资产负债率、流动比率、经营现金流/净利润。
基本面因子在Qlib中通常需要先对齐到日频,再与量价因子合并。由于季度数据变化慢,直接使用原始值会导致因子在季度内几乎不变,因此常做同比、环比或滚动差分处理。
| 因子类别 | 典型因子 | 数据频率 | 主要风险 |
|---|---|---|---|
| 动量 | 20日收益率 | 日频 | 趋势反转时回撤大 |
| 波动 | 20日收益率标准差 | 日频 | 极端行情失效 |
| 量能 | 换手率、量比 | 日频 | 易受游资扰动 |
| 估值 | PE、PB | 季度 | 行业差异大 |
| 成长 | 净利润同比 | 季度 | 披露滞后与修正 |
四、因子有效性评价指标
构造出因子后,必须回答一个问题:这个因子对未来收益有预测能力吗?业界最常用的指标是IC、RankIC和IR。
IC(Information Coefficient):因子值与未来收益的截面相关系数。通常在每个截面上计算Pearson相关系数,再对时间序列求均值。IC绝对值越大,预测能力越强。一般|IC|>0.03可认为有效,>0.05较好。
RankIC:因子值与未来收益的截面Spearman秩相关系数。相比IC,RankIC对极端值不敏感,更稳健,是Qlib中默认关注的指标。
IR(Information Ratio):IC的均值除以IC的标准差,衡量因子预测能力的稳定性。IR越高,说明因子在不同时间段表现越一致。通常IR>0.5可认为稳定。
import pandas as pd
from scipy.stats import pearsonr, spearmanr
# 假设 factor 和 forward_return 为同一截面的 Series
ic = pearsonr(factor, forward_return)[0]
rank_ic = spearmanr(factor, forward_return)[0]
# 时间序列上计算 IR
ic_series = [...] # 每个截面的 IC
ir = ic_series.mean() / ic_series.std()
print(f"IC={ic:.4f}, RankIC={rank_ic:.4f}, IR={ir:.4f}")
qlib.contrib.eva.alpha.calc_ic直接计算IC与RankIC,并支持按日、按行业分组统计。建议同时观察IC的时序曲线,若IC在某些年份持续为负,说明因子逻辑可能已失效。五、误区与复盘
初学者常犯的错误有三类:
- 未来函数:使用财报时未考虑披露日期,或使用当日收盘价计算当日因子却预测当日收益。正确做法是因子计算只使用T日及之前数据,预测T+1及之后收益。
- 过度挖掘:在同一个数据集上反复测试上百个因子,只保留IC最高的几个,导致过拟合。应保留样本外验证集,并关注因子逻辑是否可解释。
- 忽略中性化:行业和市值对因子影响巨大,未做中性化的因子可能只是行业暴露的代理。Qlib提供
CSRankNorm和行业中性化处理器,建议在评价前先做中性化。
复盘时,建议建立因子档案:记录因子定义、计算逻辑、IC/RankIC/IR、换手率、衰减曲线。一个因子从想法到上线,通常需要经过“逻辑假设→构造→单因子测试→中性化→组合测试→样本外跟踪”六个步骤。只有通过样本外跟踪的因子,才值得进入机器学习模型。
掌握因子定义、分类与评价方法后,你就能在Qlib中系统性地构建和筛选Alpha因子,为后续的机器学习模型提供高质量输入。