第二章 选股逻辑基础:多因子选股模型简介
做量化指增,说白了就是回答两个问题:买什么?买多少?
第一个问题,就是选股逻辑。我个人习惯把选股比作「筛沙子」——你要从几千只股票里,把那些可能跑赢指数的「金砂」筛出来。怎么筛?靠因子。
核心观点:多因子选股不是玄学,它是用多个维度的数据,给每只股票打一个综合分。分数高的,就多买点。
2.1 多因子选股模型长什么样?
先看一张图,这是我做课程时画的框架。你一看就明白。
你看,整个流程其实不复杂。数据进去,因子算出来,处理干净,打个分,最后挑出得分最高的那些股票。我在项目里经常跟团队说:别把模型搞得太花哨,先把这五步跑通再说。
2.2 因子分类:四大金刚
因子分很多种,但常用的就四大类。我管它们叫「四大金刚」。
| 因子类别 | 核心逻辑 | 常用指标 | 我的经验 |
|---|---|---|---|
| 估值因子 | 便宜就是硬道理 | PE、PB、PS、PCF | PE要结合行业看,银行股PE低不代表好 |
| 成长因子 | 买的是未来 | 营收增速、利润增速、ROE增速 | 增速太高要警惕,可能是基数效应 |
| 质量因子 | 好公司才能走得远 | ROE、毛利率、负债率、现金流 | ROE连续3年>15%的,大概率是好公司 |
| 情绪因子 | 市场有时会犯错 | 换手率、波动率、分析师预期 | 情绪因子有效期短,适合做短期增强 |
我的习惯:做指增策略时,估值和成长因子权重各占30%,质量占25%,情绪占15%。这个比例不是固定的,但可以作为起步参考。
2.3 因子有效性检验:别被假信号骗了
选好因子后,最怕什么?怕它是个「假因子」。我踩过这个坑。
曾经我找到一个因子,回测收益高得离谱,年化超额20%以上。当时兴奋得不行,结果实盘跑了三个月,超额收益是负的。后来复盘才发现,那个因子在样本外完全失效——说白了就是过拟合了。
所以,因子有效性检验必须做。我一般看四个维度:
- IC值(信息系数):因子值和未来收益的相关性。绝对值大于0.05才算有点用。
- IR值(信息比率):IC的均值除以标准差。大于0.5的因子,稳定性不错。
- 分组收益:把股票按因子值分成10组,看第1组和第10组的收益差。差距越大越好。
- 多空收益:做多因子值高的,做空因子值低的。这个收益要显著为正。
下面这段代码,是我在项目中常用的因子检验脚本。你拿去改改就能用。
import pandas as pd
import numpy as np
from scipy import stats
def factor_ic_test(factor_series, forward_returns):
"""
计算因子的IC值和IR值
factor_series: 因子值,index为股票代码
forward_returns: 未来N日收益,index为股票代码
"""
# 去极值:用MAD方法
median = factor_series.median()
mad = np.abs(factor_series - median).median()
upper = median + 5 * mad
lower = median - 5 * mad
factor_series = factor_series.clip(lower, upper)
# 标准化
factor_series = (factor_series - factor_series.mean()) / factor_series.std()
# 计算Spearman秩相关系数
ic, p_value = stats.spearmanr(factor_series, forward_returns)
# 计算IR
# 这里假设我们有多个时间点的IC值
# 实际使用时需要滚动计算
ir = ic / np.std([ic]) if np.std([ic]) != 0 else 0
return {
'IC': round(ic, 4),
'p_value': round(p_value, 4),
'IR': round(ir, 4),
'significant': p_value < 0.05
}
# 使用示例
# result = factor_ic_test(my_factor, next_month_returns)
# print(result)
注意:IC值高不代表因子一定好用。我见过IC高达0.12的因子,但分组收益图是倒U型的——中间组收益最高,两头反而低。这种因子你敢用吗?反正我不敢。
2.4 因子组合:1+1>2 还是 1+1<2?
单个因子检验通过后,就要考虑怎么组合了。这里有个坑:因子之间可能有相关性。
举个例子,估值因子和情绪因子有时候是负相关的——股票跌得多了(估值低),市场情绪往往也差。如果你把这两个因子简单加权,效果可能还不如只用其中一个。
我常用的方法有两种:
- 等权合成:简单粗暴,每个因子标准化后直接平均。适合因子数量不多、相关性较低的情况。
- ICIR加权:用每个因子的ICIR值作为权重。ICIR高的因子,权重就大。这个方法更精细,但需要滚动计算权重。
嗯,这里要注意:ICIR加权虽然效果好,但计算量也大。我一般每个月重新算一次权重,不会每天调。
2.5 实战中的避坑指南
做多因子选股这几年,我总结了几条血泪教训:
- 不要用未来数据:因子计算时,只能用截止到当天的数据。我曾经见过有人用季报发布后的数据去算因子,但回测时用的是季报截止日——这差了快一个月,结果当然好看,但实盘就露馅了。
- 注意行业中性化:有些因子天然偏向某些行业。比如银行股PE普遍低,消费股ROE普遍高。如果不做行业中性化,选出来的股票可能全是同一个行业的。
- 因子衰减要监控:再好的因子,用的人多了也会失效。我每个月都会检查因子的IC值变化趋势,一旦连续3个月下降,就要考虑替换了。
最后说一句:多因子选股不是一劳永逸的事。市场在变,因子也在变。保持学习,保持迭代,这才是量化投资的本质。
我的建议:刚开始做多因子模型时,先选3-5个经典因子跑通流程。别一上来就搞几十个因子,那样你连问题出在哪都找不到。