第二章 选股逻辑基础:多因子选股模型简介

做量化指增,说白了就是回答两个问题:买什么?买多少?

第一个问题,就是选股逻辑。我个人习惯把选股比作「筛沙子」——你要从几千只股票里,把那些可能跑赢指数的「金砂」筛出来。怎么筛?靠因子。

核心观点:多因子选股不是玄学,它是用多个维度的数据,给每只股票打一个综合分。分数高的,就多买点。

2.1 多因子选股模型长什么样?

先看一张图,这是我做课程时画的框架。你一看就明白。

多因子选股模型核心流程 原始数据输入 因子计算:估值 | 成长 | 质量 | 情绪 因子处理:去极值 | 标准化 | 中性化 因子合成 & 综合打分 选股输出:Top N 股票组合

你看,整个流程其实不复杂。数据进去,因子算出来,处理干净,打个分,最后挑出得分最高的那些股票。我在项目里经常跟团队说:别把模型搞得太花哨,先把这五步跑通再说。

2.2 因子分类:四大金刚

因子分很多种,但常用的就四大类。我管它们叫「四大金刚」。

因子类别 核心逻辑 常用指标 我的经验
估值因子 便宜就是硬道理 PE、PB、PS、PCF PE要结合行业看,银行股PE低不代表好
成长因子 买的是未来 营收增速、利润增速、ROE增速 增速太高要警惕,可能是基数效应
质量因子 好公司才能走得远 ROE、毛利率、负债率、现金流 ROE连续3年>15%的,大概率是好公司
情绪因子 市场有时会犯错 换手率、波动率、分析师预期 情绪因子有效期短,适合做短期增强

我的习惯:做指增策略时,估值和成长因子权重各占30%,质量占25%,情绪占15%。这个比例不是固定的,但可以作为起步参考。

2.3 因子有效性检验:别被假信号骗了

选好因子后,最怕什么?怕它是个「假因子」。我踩过这个坑。

曾经我找到一个因子,回测收益高得离谱,年化超额20%以上。当时兴奋得不行,结果实盘跑了三个月,超额收益是负的。后来复盘才发现,那个因子在样本外完全失效——说白了就是过拟合了。

所以,因子有效性检验必须做。我一般看四个维度:

  1. IC值(信息系数):因子值和未来收益的相关性。绝对值大于0.05才算有点用。
  2. IR值(信息比率):IC的均值除以标准差。大于0.5的因子,稳定性不错。
  3. 分组收益:把股票按因子值分成10组,看第1组和第10组的收益差。差距越大越好。
  4. 多空收益:做多因子值高的,做空因子值低的。这个收益要显著为正。

下面这段代码,是我在项目中常用的因子检验脚本。你拿去改改就能用。

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 实战中的避坑指南

做多因子选股这几年,我总结了几条血泪教训:

  1. 不要用未来数据:因子计算时,只能用截止到当天的数据。我曾经见过有人用季报发布后的数据去算因子,但回测时用的是季报截止日——这差了快一个月,结果当然好看,但实盘就露馅了。
  2. 注意行业中性化:有些因子天然偏向某些行业。比如银行股PE普遍低,消费股ROE普遍高。如果不做行业中性化,选出来的股票可能全是同一个行业的。
  3. 因子衰减要监控:再好的因子,用的人多了也会失效。我每个月都会检查因子的IC值变化趋势,一旦连续3个月下降,就要考虑替换了。

最后说一句:多因子选股不是一劳永逸的事。市场在变,因子也在变。保持学习,保持迭代,这才是量化投资的本质。

我的建议:刚开始做多因子模型时,先选3-5个经典因子跑通流程。别一上来就搞几十个因子,那样你连问题出在哪都找不到。


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