第4章:均值回归策略基础
震荡市中的均值回归逻辑
做量化这些年,我见过太多人在趋势策略上栽跟头。其实在震荡市里,有一套逻辑特别管用——均值回归。
什么叫均值回归?说白了就是:价格涨多了会跌,跌多了会涨。就像一根被拉长的橡皮筋,松手后总会弹回去。这个道理听起来简单,但真要用好它,你得理解背后的数学逻辑。
我刚开始做策略研究时,总想着抓大趋势。结果呢?在震荡行情里反复被打脸。后来我慢慢悟出一个道理:市场80%的时间都在震荡,只有20%的时间在走趋势。你想想看,如果我们能把这80%的时间利用好,收益会怎样?
均值回归的核心假设是:价格围绕某个「均衡值」上下波动。这个均衡值可以是移动平均线,也可以是某个统计均值。当价格偏离均衡值太远时,回归的力量就会显现。
核心逻辑:
- 价格偏离均值越远,回归概率越大
- 偏离程度用标准差来衡量
- 回归需要时间,不是瞬间完成
这里有个坑,我踩过。均值回归策略最怕什么?怕趋势行情。一旦市场走出单边趋势,你的回归策略就会不断抄底、不断被套。所以,识别市场状态是第一步。
布林带策略的原理与参数设置
布林带是我个人最常用的均值回归工具之一。它由三条线组成:中轨(通常是20日均线)、上轨和下轨(中轨加减2倍标准差)。
原理其实很直观:
- 上轨 = 中轨 + k × 标准差
- 下轨 = 中轨 - k × 标准差
- 中轨 = N日移动平均线
当价格触及上轨时,说明偏离均值较远,可以考虑做空;触及下轨时,可以考虑做多。当然,这不是绝对的,需要结合其他指标确认。
参数怎么设?我分享下我的经验:
| 参数 | 默认值 | 我的建议 | 适用场景 |
|---|---|---|---|
| N(周期) | 20 | 15-30 | 日线用20,小时线用30 |
| k(倍数) | 2 | 1.5-2.5 | 波动大用2.5,波动小用1.5 |
| 计算方式 | 简单移动平均 | 指数加权移动平均 | 对近期数据更敏感 |
我曾经在回测中发现,默认的20日均线+2倍标准差在A股市场效果一般。后来我改成15日均线+1.8倍标准差,收益曲线明显平滑了。为什么?因为A股震荡频率高,需要更灵敏的布林带。
实战技巧:
布林带收窄时,往往预示着即将变盘。这时候不要急着入场,等方向明确再说。我习惯用「布林带宽度」指标来辅助判断:宽度 = (上轨 - 下轨) / 中轨。当宽度处于历史低位时,警惕变盘。
代码实现其实很简单:
import numpy as np
import pandas as pd
def bollinger_bands(data, window=20, num_std=2):
"""
计算布林带
data: 价格序列
window: 移动平均周期
num_std: 标准差倍数
"""
middle = data.rolling(window=window).mean()
std = data.rolling(window=window).std()
upper = middle + num_std * std
lower = middle - num_std * std
return upper, middle, lower
# 使用示例
close_prices = pd.Series([...]) # 你的收盘价数据
upper, middle, lower = bollinger_bands(close_prices, window=20, num_std=2)
注意:
布林带不是万能的。在强趋势行情中,价格会沿着上轨或下轨运行,这时候做反向操作会死得很惨。我建议配合趋势指标(如ADX)一起使用,当ADX大于25时,放弃布林带策略。
RSI指标在震荡市中的应用
RSI(相对强弱指标)是我另一个常用的震荡指标。它的取值范围是0到100,通常认为:
- RSI > 70:超买,可能回调
- RSI < 30:超卖,可能反弹
- RSI在30-70之间:正常震荡
但说实话,直接用70和30作为阈值,效果一般。为什么?因为不同品种、不同时间周期的RSI波动特征不一样。
我个人的做法是:动态调整阈值。比如,先计算过去100天的RSI均值,然后以均值±20作为新的阈值。这样能自适应市场的变化。
举个例子:
def adaptive_rsi_strategy(data, period=14, lookback=100):
"""
自适应RSI策略
data: 价格序列
period: RSI计算周期
lookback: 回溯周期
"""
# 计算RSI
delta = data.diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=period).mean()
avg_loss = loss.rolling(window=period).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
# 动态阈值
rsi_mean = rsi.rolling(window=lookback).mean()
upper_threshold = rsi_mean + 20
lower_threshold = rsi_mean - 20
return rsi, upper_threshold, lower_threshold
这里有个小技巧:RSI的背离信号比单纯超买超卖更可靠。什么叫背离?就是价格创新高,但RSI没创新高,这叫顶背离,是卖出信号。反过来,价格创新低,RSI没创新低,叫底背离,是买入信号。
RSI在震荡市的核心用法:
- 超买超卖:RSI > 70做空,RSI < 30做多(需配合趋势判断)
- 背离信号:价格与RSI走势不一致时,反转概率高
- RSI形态:比如双顶、双底,比单一阈值更可靠
- 多周期共振:日线RSI和小时线RSI同时超买,做空胜率更高
我记得有一次做股指期货的日内策略,发现单纯用RSI超买超卖,胜率只有55%左右。后来加入背离信号,胜率提升到了62%。虽然只提高了7个百分点,但加上杠杆后,收益差距就大了。
最后说一句:任何指标都有失效的时候。布林带和RSI在震荡市好用,但一旦市场进入趋势行情,它们就会变成反向指标。所以,策略的核心不是指标本身,而是你对市场状态的判断。
嗯,这一章的内容就到这里。均值回归的逻辑、布林带的参数设置、RSI的实战应用,这三块是震荡市策略的基石。把这些吃透了,后面的内容会轻松很多。