因子定义与分类:从概念到实战

做量化投资这些年,我经常被问到同一个问题:「因子到底是什么?」

说实话,刚入行那会儿我也挺困惑的。书上说因子是「能够解释资产收益的某种特征」,听着挺玄乎。后来在实盘里摸爬滚打,我才真正理解——因子就是一把尺子,用来衡量股票为什么涨、为什么跌

一、什么是因子?

咱们用大白话说。因子就是某个能影响股价的「特征」或「信号」。

举个例子。你想想看,为什么茅台比ST股贵那么多?因为茅台赚钱能力强、品牌好、业绩稳定。这些「赚钱能力强」「品牌好」就是因子。只不过在量化里,我们得把它们变成数字。

因子的本质:一个可量化的、能解释或预测资产收益的变量。

比如:市盈率(PE)、过去一个月的涨幅、成交量变化率……这些都是因子。

我个人习惯把因子理解成「选股的角度」。你从哪个角度挑股票?是看便宜不便宜(估值因子),还是看涨得快不快(动量因子),还是看公司有没有爆雷风险(质量因子)?每个角度就是一个因子。

我记得刚做第一个回测系统时,只用了市盈率一个因子。结果呢?回测曲线漂亮得不行,一上实盘就崩。后来才明白——单因子就像一条腿走路,不稳。真正赚钱的策略,往往是多个因子组合的结果。

二、因子的三大分类

因子怎么分类?业内没有统一标准。但我习惯分成三类:基本面因子、技术面因子、另类数据因子。这三类基本覆盖了市面上90%以上的因子。

下面这张图是我自己整理的因子分类框架,你看一眼就明白了:

因子分类框架 量化因子 基本面因子 技术面因子 另类数据因子 估值类(PE、PB、PS) 成长类(营收增速、利润增速) 质量类(ROE、毛利率) 动量类(过去N日涨幅) 反转类(短期超跌反弹) 波动类(ATR、标准差) 舆情类(新闻情感、研报) 供应链数据(上下游关系) 卫星图像(车流、库存) 注:三类因子可单独使用,也可组合成多因子模型 实际应用中,因子之间可能存在相关性,需做正交化处理

三、基本面因子

基本面因子,说白了就是看公司「底子」好不好。这类因子来自财务报表、经营数据。

常见的几类:

  • 估值因子:市盈率(PE)、市净率(PB)、市销率(PS)。便宜是硬道理,但便宜也可能有陷阱。
  • 成长因子:营收增速、净利润增速、EPS增长率。买股票就是买未来,成长因子就是看未来。
  • 质量因子:ROE、毛利率、资产负债率。公司赚不赚钱、稳不稳,就看这些。
  • 分红因子:股息率。适合追求稳定现金流的策略。

我的经验:基本面因子最大的问题是「滞后性」。财报一个季度才出一次,等你看到数据,股价可能已经反映完了。所以做短线的话,基本面因子要配合其他因子一起用。

举个例子。我做过一个回测,只用PE因子选股——选市盈率最低的10%股票。结果呢?回测年化收益12%,但最大回撤超过40%。为什么?因为便宜的不一定是好货,可能是「价值陷阱」。后来我加了ROE和营收增速两个因子,回撤立马降到25%以下。

四、技术面因子

技术面因子,就是看「市场行为」本身。价格、成交量、波动率……这些数据每天都在变,反应也更快。

常见的几类:

  • 动量因子:过去N日收益率、过去N日相对强弱(RSI)。强者恒强,弱者恒弱——这是动量因子的核心逻辑。
  • 反转因子:短期超跌反弹、均值回归。涨多了会跌,跌多了会涨。
  • 波动因子:ATR(平均真实波幅)、历史波动率。波动大的股票,潜在收益高,风险也大。
  • 量价因子:成交量变化率、换手率、量价背离。量在价先,成交量是市场的「温度计」。

注意:技术面因子容易过拟合。我曾经在回测里加了一个「过去3天涨幅+过去5天成交量」的复合因子,回测曲线漂亮得不像话。结果实盘一跑,直接亏了两个月。后来复盘发现,那个因子纯粹是数据挖掘出来的「假规律」。

技术面因子最大的优势是「高频」。你可以每天、甚至每分钟计算一次。对于短线策略来说,技术面因子是主力。

五、另类数据因子

另类数据,就是传统财报和行情数据之外的「非主流」数据。这几年越来越火。

常见的几类:

  • 舆情因子:新闻情感分析、社交媒体热度、研报推荐力度。市场情绪往往领先于价格。
  • 供应链因子:上下游企业的订单数据、物流数据。比如苹果的供应商股价,往往跟着苹果的订单走。
  • 卫星图像数据:停车场车流量、农田面积、港口集装箱数量。这些数据能提前反映经济活动。
  • 支付数据:信用卡消费、电商交易额。直接反映消费景气度。

我记得有个项目,我们用爬虫抓了某电商平台的评论数据,做了个「好评率变化因子」。结果发现,好评率下降的股票,未来两周平均跑输大盘3%。这个因子在传统数据里根本看不到。

另类数据的难点

  • 数据获取成本高(很多需要购买)
  • 数据清洗难度大(非结构化数据多)
  • 时效性要求高(今天的数据明天可能就失效)

六、常见因子举例(代码实现)

光说不练假把式。咱们用Python实现几个常见因子的计算。这里以A股日频数据为例。

import pandas as pd
import numpy as np

# 假设我们有一个DataFrame,包含股票日频数据
# 列名:'date', 'stock_id', 'close', 'volume', 'pe', 'roe'

def calc_momentum_factor(df, n=20):
    """
    计算动量因子:过去N日收益率
    """
    df = df.sort_values(['stock_id', 'date'])
    df['momentum'] = df.groupby('stock_id')['close'].pct_change(n)
    return df

def calc_volume_ratio(df, n=5):
    """
    计算量比因子:过去N日平均成交量 / 过去60日平均成交量
    """
    df = df.sort_values(['stock_id', 'date'])
    df['avg_vol_5'] = df.groupby('stock_id')['volume'].rolling(n).mean().values
    df['avg_vol_60'] = df.groupby('stock_id')['volume'].rolling(60).mean().values
    df['volume_ratio'] = df['avg_vol_5'] / df['avg_vol_60']
    return df

def calc_quality_factor(df):
    """
    计算质量因子:ROE标准化后的Z-score
    """
    df['roe_zscore'] = df.groupby('date')['roe'].transform(
        lambda x: (x - x.mean()) / x.std()
    )
    return df

# 使用示例
# df = pd.read_csv('stock_data.csv')
# df = calc_momentum_factor(df, n=20)
# df = calc_volume_ratio(df, n=5)
# df = calc_quality_factor(df)
# print(df[['date', 'stock_id', 'momentum', 'volume_ratio', 'roe_zscore']].head())

小技巧:计算因子时,一定要做「去极值」和「标准化」处理。否则极端值会严重扭曲因子效果。我一般用MAD(中位数绝对偏差)去极值,然后用Z-score标准化。

七、因子的核心属性

一个因子好不好,不是看它名字多好听。我一般从三个维度评估:

属性 含义 怎么判断
有效性 因子能否预测收益 看IC(信息系数)、IR(信息比率)
稳定性 因子效果是否随时间衰减 看分年IC、滚动IC的波动率
独立性 因子与其他因子的相关性 做相关性矩阵,避免多重共线性

嗯,这里要注意。很多新手一上来就搞几十个因子,觉得越多越好。其实不是。因子多了,反而容易「过拟合」和「多重共线性」。我个人的习惯是:先精挑5-8个核心因子,跑通了再加

八、写在最后

因子是量化投资的「砖块」。你搭得好,能盖出摩天大楼;搭得不好,就是一堆废料。

这一章我们讲了因子的定义、三大分类、常见例子,还手写了几行代码。下一章我们会深入因子回测的框架搭建——怎么把因子变成可执行的策略。

记住一句话:因子没有绝对的好坏,只有适合不适合你的策略。多试、多测、多复盘,慢慢你就会有感觉。


公众号:蓝海资料掘金营,微信deep3321