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())
量价因子容易受极端值影响,建议先做去极值(如MAD)和标准化(Z-Score或Rank),再送入模型。Qlib的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中,可使用qlib.contrib.eva.alpha.calc_ic直接计算IC与RankIC,并支持按日、按行业分组统计。建议同时观察IC的时序曲线,若IC在某些年份持续为负,说明因子逻辑可能已失效。

五、误区与复盘

初学者常犯的错误有三类:

  1. 未来函数:使用财报时未考虑披露日期,或使用当日收盘价计算当日因子却预测当日收益。正确做法是因子计算只使用T日及之前数据,预测T+1及之后收益。
  2. 过度挖掘:在同一个数据集上反复测试上百个因子,只保留IC最高的几个,导致过拟合。应保留样本外验证集,并关注因子逻辑是否可解释。
  3. 忽略中性化:行业和市值对因子影响巨大,未做中性化的因子可能只是行业暴露的代理。Qlib提供CSRankNorm和行业中性化处理器,建议在评价前先做中性化。

复盘时,建议建立因子档案:记录因子定义、计算逻辑、IC/RankIC/IR、换手率、衰减曲线。一个因子从想法到上线,通常需要经过“逻辑假设→构造→单因子测试→中性化→组合测试→样本外跟踪”六个步骤。只有通过样本外跟踪的因子,才值得进入机器学习模型。

IC高不代表能赚钱。高IC因子可能换手率极高,扣除交易成本后收益为负。评价因子时,务必结合换手率和成本模型,必要时计算“扣费后IC”或“因子收益”。

掌握因子定义、分类与评价方法后,你就能在Qlib中系统性地构建和筛选Alpha因子,为后续的机器学习模型提供高质量输入。