4、因子构建(上):动量因子与均值回归因子
各位同学,今天我们来聊聊因子构建中最基础、也最实用的两个方向——动量因子和均值回归因子。
说实话,我刚入行那会儿,觉得因子越多越好,恨不得把能想到的指标全塞进模型里。结果呢?过拟合得一塌糊涂,回测曲线漂亮得像假的一样,实盘一跑就露馅。后来我才明白,因子的逻辑比数量重要得多。
今天这两个因子,一个追涨杀跌,一个抄底逃顶。听起来矛盾对吧?但它们在多因子模型里可以共存,甚至互补。我们一个一个来看。
一、动量因子:趋势是你的朋友
动量因子的核心思想很简单:过去涨的,未来还会涨;过去跌的,未来还会跌。这不是玄学,背后有行为金融学的解释——投资者反应不足、信息传播需要时间等等。
我个人习惯用两种方式构建动量因子:N日收益率和乖离率。
1. N日收益率
这个最直接。就是计算过去N天的累计收益率。
# 伪代码示例
def n_day_return(close_prices, n=20):
return (close_prices[-1] / close_prices[-n-1]) - 1
N怎么选?这是个好问题。我做过大量测试,发现:
- 短期动量(5-10天):噪音大,反转快,不太适合做因子
- 中期动量(20-60天):效果最稳定,我个人常用30天
- 长期动量(120天以上):在数字货币里效果一般,因为市场变化太快
2. 乖离率(BIAS)
乖离率衡量的是当前价格偏离移动平均线的程度。公式是:
BIAS = (当前价格 - MA(N)) / MA(N) * 100%
说白了,就是看价格跑得离均线有多远。乖离率越大,说明动量越强,但也意味着回调风险在积累。
我曾经在ETH上吃过亏。2021年那波牛市,乖离率一度冲到30%以上,我以为是超买信号就做空了。结果呢?市场继续涨,我爆仓了。后来我学乖了——乖离率在强趋势行情里会失效,它更适合震荡市。
二、均值回归因子:涨多了会跌,跌多了会涨
均值回归因子的逻辑和动量完全相反。它认为价格会围绕某个均值波动,偏离太远就会拉回来。
听起来很有道理对吧?但实际操作中,均值回归因子有个致命问题——你不知道什么时候回归。价格可以偏离均值很久,久到你扛不住。
1. 均值回归的常见构建方式
我常用的均值回归因子有:
- 价格与均线的距离:类似乖离率,但方向相反
- RSI指标:低于30做多,高于70做空
- 布林带位置:价格在布林带上下轨的位置
# 一个简单的均值回归因子示例
def mean_reversion_factor(close_prices, window=20):
ma = close_prices.rolling(window).mean()
std = close_prices.rolling(window).std()
# 计算z-score
z_score = (close_prices - ma) / std
# 取负值,因为我们要做反向操作
return -z_score
三、动量 vs 均值回归:什么时候用哪个?
这个问题我思考了很久,也踩过不少坑。我的结论是:
| 市场状态 | 动量因子 | 均值回归因子 |
|---|---|---|
| 强趋势行情 | ✅ 有效 | ❌ 失效 |
| 震荡行情 | ❌ 失效 | ✅ 有效 |
| 高波动行情 | ⚠️ 需谨慎 | ⚠️ 需谨慎 |
你想想看,如果市场在单边上涨,你用均值回归做空,那不是找死吗?反过来,如果市场在横盘震荡,你用动量追涨杀跌,大概率两边挨打。
所以,真正的难点不在于构建因子,而在于判断当前市场适合哪种因子。这也是为什么多因子模型比单因子模型更稳健——你可以让多个因子同时工作,用模型自动分配权重。
四、本章知识体系
下面这张图展示了本章的核心逻辑,我画成了SVG,方便你理解:
嗯,这张图把今天的核心内容串起来了。你可以看到,动量因子和均值回归因子各有各的子因子,也各有各的适用场景。关键是要学会判断市场状态,然后灵活运用。
好了,今天的内容就到这里。下一章我们会继续讲因子构建的下半部分——波动率因子和流动性因子。到时候你会发现,这些因子组合起来,威力会大得多。