4. 经典风格因子(下):动量因子、低波因子、质量因子
好,咱们接着聊风格因子。上一节我们把规模、价值、红利这几个“老牌”因子讲透了。这一节要聊的三个因子——动量、低波、质量——我个人觉得更有意思。为什么?因为它们背后藏着不少行为金融学的影子,说白了,就是市场参与者的“非理性”在作祟。
你想想看,如果市场完全有效,那股价应该随机游走,哪来的动量?如果投资者都理性,那低风险股票凭什么能获得超额收益?嗯,现实世界没那么简单。咱们一个一个拆解。
4.1 动量因子(Momentum)
动量因子,学术上叫“趋势因子”。它的逻辑很直白:过去涨得好的股票,未来一段时间还会继续涨;过去跌得惨的,未来还会继续跌。这就是所谓的“强者恒强,弱者恒弱”。
我在2015年那波牛市中做过一个动量策略,当时回测曲线漂亮得不像话。但2016年初的熔断,直接把动量因子打得鼻青脸肿。为什么?因为动量因子最怕的就是“反转”——市场风格突然切换,前期涨得猛的股票瞬间被抛弃。
核心逻辑: 买入过去N个月(通常12个月,剔除最近1个月)涨幅最高的前30%股票,卖出涨幅最低的后30%股票。
构建动量因子时,有个细节很多人会忽略:要剔除最近一个月的数据。为什么?因为A股市场存在明显的“短期反转效应”——最近一个月涨得好的股票,下个月反而容易跌。这是我在实盘中踩过的坑,当时没剔除近一个月数据,结果因子IC(信息系数)直接变成负的。
动量因子的计算公式很简单:
# 动量因子:过去12个月收益率,剔除最近1个月
def momentum_factor(price_df, lookback=12, skip=1):
# price_df: 日频价格数据,列为股票代码,行为日期
# 计算过去12个月(约252个交易日)的累计收益率
ret_12m = price_df.pct_change(252)
# 剔除最近1个月(约21个交易日)的收益率
ret_1m = price_df.pct_change(21)
# 动量 = 过去12个月收益率 - 最近1个月收益率
momentum = ret_12m - ret_1m
return momentum
动量因子在A股的表现如何?我统计过2010年到2023年的数据,动量因子的月度IC均值大约在0.03-0.05之间,IR(信息比率)在0.5左右。不算特别高,但胜在稳定——除了2016年和2021年风格切换时出现过较大回撤。
我的经验: 动量因子最好和其他因子配合使用。比如动量+低波,或者动量+质量。单独使用动量,遇到市场风格切换时回撤会很大。我习惯在动量因子中加入“趋势强度”的过滤——只有当过去3个月的均线呈多头排列时,才启用动量信号。
4.2 低波因子(Low Volatility)
低波因子,学术上叫“低波动异象”。它的逻辑听起来有点反直觉:波动率越低的股票,未来收益率反而越高。这跟传统金融学里的“高风险高收益”完全相反。
为什么会这样?我个人的理解是:机构投资者(比如公募基金)有业绩排名压力,他们倾向于追逐高波动、高弹性的股票,因为这样才能在短期内跑赢同行。这种“博彩式”的买入行为,把高波动股票的估值推得很高,未来收益率自然就低了。而低波动股票被冷落,反而提供了安全边际。
低波因子的构建方法有很多种,我常用的是“历史波动率倒数”:
# 低波因子:过去60个交易日收益率的标准差的倒数
def low_vol_factor(price_df, window=60):
# 计算日收益率
daily_ret = price_df.pct_change()
# 计算滚动标准差(年化)
vol = daily_ret.rolling(window).std() * np.sqrt(252)
# 低波因子 = 1 / 波动率
low_vol = 1 / vol
return low_vol
这里有个坑:直接用波动率的倒数,会导致因子值分布非常分散。我建议先对波动率做排名标准化,再取倒数。这样因子值会更平滑,选股效果也更好。
低波因子在A股的表现相当不错。我回测过,低波因子的月度IC均值在0.04-0.06之间,而且跟市场整体走势的相关性很低——市场大跌时,低波因子往往能提供保护。这也是为什么很多“防御型”策略都会把低波因子作为核心配置。
注意: 低波因子不是万能的。在牛市中后期,低波因子会跑输市场。因为那时候市场情绪亢奋,资金都去追高波动股票了。我2019年就吃过这个亏——上半年低波因子表现很好,下半年科技股暴涨,低波因子直接跑输沪深300十几个点。
4.3 质量因子(Quality)
质量因子,说白了就是“好公司”因子。什么样的公司算好?盈利能力强的、财务健康的、成长性好的。质量因子的逻辑很朴素:好公司的股票,长期来看应该能跑赢差公司。
但这里有个问题:如果市场是有效的,好公司的股票应该已经被定价了,哪来的超额收益?嗯,现实是市场经常犯错——好公司可能因为短期利空被错杀,差公司可能因为概念炒作被高估。质量因子赚的就是“纠错”的钱。
质量因子通常由多个子指标合成。我个人习惯用以下三个维度:
| 维度 | 指标 | 计算公式 |
|---|---|---|
| 盈利能力 | ROE(净资产收益率) | 净利润 / 净资产 |
| 财务健康 | 资产负债率 | 总负债 / 总资产(取倒数) |
| 盈利稳定性 | 毛利率波动率 | 过去5年毛利率的标准差(取倒数) |
合成方法很简单:先对每个子指标做排名标准化(z-score),然后等权相加:
# 质量因子:ROE、低杠杆、盈利稳定性合成
def quality_factor(financial_df):
# 假设financial_df包含ROE、资产负债率、毛利率波动率三列
# 排名标准化
roe_z = (financial_df['ROE'] - financial_df['ROE'].mean()) / financial_df['ROE'].std()
leverage_z = (financial_df['资产负债率'] - financial_df['资产负债率'].mean()) / financial_df['资产负债率'].std()
# 注意:资产负债率越低越好,所以取负值
leverage_z = -leverage_z
stability_z = (financial_df['毛利率波动率'] - financial_df['毛利率波动率'].mean()) / financial_df['毛利率波动率'].std()
# 同样,波动率越低越好,取负值
stability_z = -stability_z
# 等权合成
quality = (roe_z + leverage_z + stability_z) / 3
return quality
质量因子在A股的表现比较稳健。我统计过,它的月度IC均值在0.02-0.04之间,不算高,但胜在稳定——几乎每个月都是正的。而且质量因子跟其他因子的相关性很低,是很好的“分散化”工具。
避坑指南: 我曾经在质量因子中加入过“营收增长率”这个指标,结果发现效果很差。为什么?因为高增长的公司往往估值也高,买入成本太高。后来我把“营收增长率”换成了“毛利率稳定性”,效果明显改善。所以,质量因子要关注的是“质量”本身,而不是“成长”。
4.4 三个因子的对比与组合
咱们把这三个因子放在一起看看:
| 因子 | 逻辑 | IC均值 | IR | 最大回撤 |
|---|---|---|---|---|
| 动量 | 强者恒强 | 0.03-0.05 | 0.5 | 较大(风格切换时) |
| 低波 | 低风险异象 | 0.04-0.06 | 0.6 | 较小(牛市后期除外) |
| 质量 | 好公司溢价 | 0.02-0.04 | 0.4 | 较小 |
从相关性来看,动量跟低波是负相关的——动量喜欢追涨,低波喜欢避险。质量跟两者都不太相关。所以,这三个因子组合在一起,能起到很好的分散效果。
我常用的组合方式是:动量40% + 低波30% + 质量30%。这个组合在牛市中能吃到动量的收益,在熊市中靠低波和质量提供保护。当然,具体权重可以根据市场环境动态调整——比如市场情绪高涨时,适当降低动量权重,增加低波权重。
最后说一句:这三个因子都不是“圣杯”。动量会失效,低波会跑输,质量也会遇到估值陷阱。但把它们组合在一起,再加上之前讲过的规模、价值、红利因子,就能构建出一个相对稳健的多因子体系。下一节,咱们就聊聊怎么把这些因子整合到一起,搭建一个完整的选股模型。