📘 本章重点
- 理解均值回归的理论基础及布林带的统计原理(均值±2倍标准差)
- 掌握布林带下轨买入/上轨卖出的核心信号,并学会用RSI过滤假信号
- 学会设计固定比例止损/止盈与动态ATR止损的适用场景
- 了解该策略在震荡市中的优势和强趋势行情中的风险
⚠️ 本章难点
- 区分”价格触及布林带边界”与”突破边界后重新收回”的入场时机差异
- 理解均值回归策略失效的本质:趋势行情中价格可能沿边界持续运行
- 掌握如何结合ADX或波动率指标识别市场状态,避免在单边市中逆势交易
⏱️ 预估学习时间
- 50~70分钟
一、策略简述与一句话定性
一句话定性:布林带均值回归策略是在震荡市场中利用价格”物极必反”特性进行低买高卖的系统,当价格触及统计意义上的极端区域(下轨)时买入,触及上轨时卖出,等待价格回归均线获利。
该策略基于约翰·布林格(John Bollinger)在1980年代发明的布林带指标。布林带由一条移动平均线(中轨)和上下两条标准差通道组成。在正态分布假设下,约95%的价格应落在±2倍标准差区间内。因此当价格触及甚至突破边界时,可视为”小概率事件”,后续回归概率较高。这一逻辑在盘整或震荡行情中表现出色,但在强单边趋势中会频繁失效。
用”橡皮筋”来理解布林带的逻辑:想象一根橡皮筋连接着价格和均线。当价格被拉到上轨(拉伸过度),橡皮筋的弹力会把价格拉回均线附近;当价格被压到下轨(压缩过度),弹力会把价格弹回均线。布林带均值回归的本质,就是利用这根”统计橡皮筋”的弹力。 但注意,如果有一辆卡车(强趋势)持续拉着橡皮筋往一个方向走,橡皮筋可能会断——这就是策略在趋势市中失效的根本原因。
老陈点评:
布林带的统计基础是”均值回归过程”,但金融资产收益率往往具有肥尾特征,极端值出现的概率比正态分布假设高得多。所以实际使用中,2倍标准差阈值可能需要根据品种波动率调整,或者加入额外的过滤条件,比如RSI、成交量等,以降低假信号。
老王补充:
我早年也迷恋过这个策略,震荡市确实爽,但一来趋势行情就惨了。比如2020年黄金突破历史新高那一波,布林带持续在上轨上方运行,逆势做空的人全被拉爆。所以关键在于识别当前市场状态——震荡时用这套,趋势来临时要果断关掉。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 震荡或盘整状态明显的股票、ETF、期货、外汇 | 区间震荡时布林带上下轨形成清晰边界 |
| 品种波动性要求 | 中等偏高(确保通道有扩张收缩周期) | 波动率过低则布林带长期平缓,无交易机会 |
| 适用周期 | 30分钟、60分钟、日线 | 较短周期(1分钟/5分钟)噪声过多,易产生假信号 |
| 资金门槛 | 低,基本无门槛 | 可小资金起步,但需注意单边市中连续止损的账户回撤 |
| 不适合的市场状态 | 强单边上涨/下跌趋势 | 价格可能沿布林带上轨或下轨持续运行,逆势操作将连续亏损 |
最佳行情特征:
- 价格在布林带上下轨之间反复摆动,中轨走平或斜率极小
- 波动率处于中等水平,布林带宽度稳定
- RSI在30~70之间来回穿越,无明显单边延伸
失效预警:
- 布林带开口持续扩大,价格连续3根K线紧贴上轨或下轨
- ATR(平均真实波幅)持续上升
- ADX(平均趋向指数)高于25并向上
- 布林带宽度(上轨-下轨)持续收窄,接近历史低点 → 市场即将选择方向,暂停均值回归策略(关于ADX和波动率过滤器的具体使用方法,详见本章第三节”因子拆解与原理”和第四节”风险管理”中的相关内容)
小李问:那我怎么知道现在是震荡还是趋势啊?看盘的时候感觉一会儿震荡一会儿趋势的,经常判断错。
老陈点评:
可以用一个简单的过滤器:计算过去20根K线的ADX。如果ADX低于20,视为震荡,启用布林带均值回归策略;如果ADX高于25且方向向上,则暂停该策略,转为观望或切换到趋势跟踪策略。当然,阈值需要根据品种微调。
河流钓鱼比喻:布林带均值回归策略就像在一条河流的岸边钓鱼——河中心是均线(水流主流),岸边是上下轨(极端位置)。鱼(利润)通常在水流转弯处(价格回归均线)出现。但如果你在洪水期(强趋势)依然站在岸边钓鱼,河岸可能会塌方把你冲走。因此,先看天气(市场状态),再下鱼竿(开仓)。
三、因子拆解与原理
3.1 布林带(Bollinger Bands)——波动范围因子
布林带由三条线组成:
- 中轨(MB) = N周期的简单移动平均线(常用20)
- 上轨(UB) = MB + k × 标准差
- 下轨(LB) = MB − k × 标准差
参数通常取N=20,k=2。
原理:在正态分布假设下,价格落在上下轨之间的概率约为95.4%。当价格突破上下轨时,视为价格处于统计学上的”极端位置”,后续回归均值的动力增强。
⚠️ 但注意:金融资产价格并非严格正态分布,尾部风险高于理论值,因此2倍标准差仅作为经验阈值,而非严格的统计置信区间。在强趋势行情中,价格可能在上轨之上或下轨之下持续运行很长时间,这时”回归”可能不会发生。
优点:
- 自适应波动率:波动大时通道自动放宽,波动小时收窄,无需手动调整。
- 直观易懂:上下轨直接给出交易边界。
缺点:
- 正态分布假设不严格成立,金融资产有肥尾特征,极端值出现频率更高。
- 在强趋势中,价格可能沿上轨或下轨持续运行,产生连续假信号。
实战小技巧:布林带的中轨(均线)斜率是一个重要的方向参考。当中轨明显向上倾斜时,说明市场处于上升趋势,此时价格触及下轨的做多信号比触及上轨的做空信号更可靠;反之,中轨向下倾斜时,做空信号更优。这实际上是将趋势方向与均值回归结合,避免”逆大势”交易。
3.2 RSI(相对强弱指数)——动能验证因子
RSI用于衡量近期涨跌幅度,取值0~100。常用参数14。
- RSI < 30 视为超卖,价格可能反弹
- RSI > 70 视为超买,价格可能回落
组合逻辑:当价格触及布林带下轨且RSI<30时,做多信号可靠性显著提升;当价格触及上轨且RSI>70时,做空信号增强。这可以滤除部分因短暂触碰边界但动能依然强劲的假信号。
RSI过滤的”双重确认”逻辑——一个具体案例:
假设某股票连续大涨,价格触及布林带上轨,RSI高达82(>70),此时我们不做空,因为虽然价格在边界上,但动能依然强劲,可能继续沿上轨运行。反之,如果价格触及上轨但RSI仅为65(<70),我们也不做空——因为虽然价格到了边界,但没有到达超买区域,信号不够强烈。只有”价格到位+动能衰竭”两者同时满足,才是可靠的入场信号。
老陈点评:
RSI的本质是衡量动量衰竭程度。在震荡市中,价格到达边界时RSI往往同步进入超买/超卖区,两者共振有效。但在趋势市中,价格触碰上轨时RSI可能只是在70附近徘徊甚至继续走高,这时反向操作风险很大。所以RSI过滤能减少一部分假信号,但不能完全解决趋势问题。
3.3 成交量(可选过滤因子)
成交量萎缩后放大,可作为确认反转的信号。当价格触及布林带下轨且成交量从缩量转为放量时,说明有资金开始承接,反弹概率增加。该因子增加策略复杂度,但能提高信号质量。
3.4 因子的互补与牵制
- 优点组合:布林带边界提供位置,RSI提供动量验证,成交量提供资金确认,三者叠加可大幅提高胜率,但信号数量减少。
- 缺点与牵制:过多过滤条件会导致交易次数过少,错过一些快速的回归行情;也可能因参数过拟合导致回测优秀而实盘失效。建议先从布林带+RSI两层过滤开始,验证有效后再考虑加入成交量。
老王补充:
我见过有人把布林带、RSI、KDJ、MACD、成交量五六个指标叠在一起,回测曲线完美,实盘一跑一潭死水。信号少得像大熊猫,一年交易不了几次,手续费倒是扣了不少。简化为布林带+RSI,或者只用布林带加一个价格形态(比如pin bar),效果往往更好。
四、仓位、买卖点与风险管理
4.1 入场信号
| 方向 | 触发条件(标准版,不含成交量) |
|---|---|
| 做多(买入) | 收盘价 ≤ 布林带下轨,且RSI < 30(超卖区) |
| 做空(卖出/做空) | 收盘价 ≥ 布林带上轨,且RSI > 70(超买区) |
注意事项:
- 为避免盘中假突破,建议使用收盘价确认信号,次日开盘执行。
- 也可采用”价格突破下轨后收回下轨上方”的确认方式,牺牲部分利润换取更高胜率。
4.2 仓位管理
由于均值回归策略每笔风险相对固定,可采用固定比例仓位:
- 每笔交易投入总资金的2%~5%(根据最大预期亏损和账户承受力调整)。
- 不建议加仓(因为均值回归逆向加仓风险极大)。
高级方法:根据波动率调整仓位——当布林带宽度(上轨-下轨)较宽时,说明波动放大,可适当降低仓位;带宽收窄时,波动收缩,可适当提高仓位。
4.3 止损设置
| 止损类型 | 设定方法 | 适用场景 |
|---|---|---|
| 固定比例止损 | 如入场价下方4%(做多)或上方4%(做空) | 简单直观,适合低波动品种 |
| ATR倍数止损 | 入场价 ± 2×ATR(做多入场价-2×ATR,做空入场价+2×ATR) | 自适应波动率,适合高波动品种 |
| 布林带反向突破止损 | 价格反向突破中轨或另一侧轨道 | 逻辑自洽,但可能导致止损较宽 |
重要:止损必须在入场时设定好,不可移动(除非使用跟踪止损,但均值回归策略通常不需要)。
4.4 止盈(出场)设计
- 简单止盈:价格回归布林带中轨时平仓一半,回归另一侧轨道时平仓另一半。
- 目标止盈:设置固定盈亏比(如1:2或1:3),例如止损4%,止盈8%。
- 分批止盈:价格从入场点向有利方向移动一定幅度(如2%)平仓1/3,再移动2%再平1/3,剩余仓位持有到回归中轨。
老王补充:
我实盘用均值回归时,最怕价格刚回归中轨就反弹或回落,导致过早止盈。后来改成跟踪移动止损:当价格向有利方向移动超过ATR后,将止损线移动到盈亏平衡点,然后让利润奔跑一部分。但注意,这不适用于强趋势,否则原本的回归变成反转,利润会回吐。
“盈利后保本止损”的实现思路:在循环中增加一个变量 highest_price_since_entry,当价格从入场点向有利方向移动超过1倍ATR后,将止损线从”固定-4%”提升到”入场价”(即保本)。这样即使价格随后反转回归,也不会亏损本金。
4.5 策略在失效时的应对
当发现市场进入强趋势(ADX>25且布林带开口持续扩大),应:
- 关闭均值回归策略,或暂停开新仓,仅处理已有持仓。
- 切换策略:如果账户同时运行趋势跟踪策略,则可将资金调配过去。
- 降低仓位:若仍想保留部分仓位,可将每笔风险降至1%以下。
“逆小势、顺大势”的进阶思路:当中轨(20日均线)向上时,只做多不做空;当中轨向下时,只做空不做多。这样既保留了均值回归的”逆小势”特性,又过滤掉了”逆大势”的风险。
小李问:我只有这一个策略,那趋势来了不就亏惨了吗? 老陈点评:这正是多策略配置的重要性。建议至少同时运行一个趋势跟踪策略(如海龟法则)和均值回归策略。两个策略资金独立,震荡市回归策略赚钱,趋势市海龟赚钱,整体曲线会平滑很多。如果只有单一策略,那必须忍受它的失效期。
五、策略的来历、设计者与趣闻
布林带由约翰·布林格(John Bollinger)在1980年代发明。布林格是美国的金融分析师、作家和电视评论员。他设计布林带的初衷并非直接产生交易信号,而是为价格提供一个动态的波动范围参考,帮助交易者判断相对高低位。布林格本人曾在采访中强调,过度简化地使用”上轨卖、下轨买”会带来风险,应该结合其他指标确认。
布林带诞生后迅速成为技术分析中最受欢迎的指标之一,广泛应用于股票、期货、外汇市场。将其与RSI结合形成均值回归策略,则来自于1980~1990年代众多短线交易者的实战总结,并非某一个人的独创。该策略至今仍是量化交易入门者的必修课之一。
趣闻:约翰·布林格在2002年接受《Technical Analysis of Stocks & Commodities》杂志采访时说:”我经常看到有人把布林带当作机械的交易系统,这让我感到不安。布林带只是一个工具,不是圣杯。”他还幽默地补充:”如果它真的那么神奇,我早就退休在巴哈马海滩上了。”
策哥的吐槽:
布林格老先生说”如果它真的那么神奇,我早退休了”。我深有同感——我认识的每个做量化的人,在回测布林带策略时都以为自己找到了圣杯,实盘三个月后被市场教育得服服帖帖。回测一时爽,实盘火葬场,这句咒语请贴在显示器上。
老陈点评:
布林格本人的谨慎态度值得学习。任何技术指标都有局限性,布林带也不例外。它的核心价值是”提供一个波动率调整的相对位置”,而不是”给出必胜信号”。我们在使用时应保持这种清醒。
老王补充:
我见过一个极端案例:某交易员在2015年A股股灾期间,连续三天看到指数触及布林带下轨就抄底,结果连吃三个跌停板,账户爆仓。不是布林带不准,而是当时市场已经进入恐慌性趋势下跌,任何均值回归逻辑都会失效。一定要认清环境。
六、Python回测示例
以下代码演示布林带均值回归策略(结合RSI过滤,固定比例止损止盈)在沪深300指数(代码000300.SS)上的回测。数据来源yfinance,回测周期2020-01-01至2025-01-01。
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime
# 若yfinance无法获取000300.SS,可使用akshare:import akshare as ak; df = ak.stock_zh_index_daily(symbol="sh000300")
def bollinger_mean_reversion_strategy(data, lookback=20, num_std=2,
rsi_period=14, rsi_oversold=30, rsi_overbought=70,
stop_loss_pct=0.04, take_profit_pct=0.08):
"""
布林带均值回归策略(带RSI过滤、固定止损止盈)
参数:
data: 必须包含 'Close' 列
lookback: 布林带周期
num_std: 标准差倍数
rsi_period, rsi_oversold, rsi_overbought: RSI参数
stop_loss_pct: 止损比例(如0.04表示4%)
take_profit_pct: 止盈比例(如0.08表示8%)
返回:添加了持仓和净值的DataFrame
"""
df = data.copy()
# 1. 布林带计算
df['SMA'] = df['Close'].rolling(lookback).mean()
# ddof=0为总体标准差,与布林格原始算法一致;若追求统计学无偏估计,可改为ddof=1
df['STD'] = df['Close'].rolling(lookback).std(ddof=0)
df['Upper'] = df['SMA'] + num_std * df['STD']
df['Lower'] = df['SMA'] - num_std * df['STD']
# 2. RSI计算(本示例采用SMA简化版RSI,与Wilder原始RSI略有差异)
# 若需完全复现行情软件的Wilder RSI,请使用:df['avg_gain'] = gain.ewm(alpha=1/rsi_period, adjust=False).mean()
delta = df['Close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(rsi_period).mean()
avg_loss = loss.rolling(rsi_period).mean()
# 防止avg_loss为0时除零报错
rs = avg_gain / avg_loss
rs = rs.fillna(0) # 当avg_loss=0时,RSI直接取100
df['RSI'] = 100 - (100 / (1 + rs))
# 若avg_loss=0,上述公式仍可处理(rs为无穷大时,RSI趋近100)
# 3. 入场信号
df['Long_Signal'] = (df['Close'] <= df['Lower']) & (df['RSI'] < rsi_oversold)
df['Short_Signal'] = (df['Close'] >= df['Upper']) & (df['RSI'] > rsi_overbought)
# 合并信号列,便于条件判断
df['Signal'] = df['Long_Signal'].astype(int) - df['Short_Signal'].astype(int)
# 4. 模拟持仓(带止损止盈)
df['Position'] = 0
df['Entry_Price'] = np.nan
position = 0
entry_price = 0.0
# 可选:ADX过滤器占位(如需启用,可在下方取消注释并填充ADX计算)
# 注:ADX的计算较为复杂,涉及+DI/-DI,建议使用第三方库如`ta`或自行实现
for i in range(1, len(df)):
# 已有持仓时,先检查止损止盈
if position != 0:
# 计算盈亏比例
if position == 1:
pnl = (df['Close'].iloc[i] - entry_price) / entry_price
else: # position == -1
pnl = (entry_price - df['Close'].iloc[i]) / entry_price
# 止损或止盈触发
if pnl <= -stop_loss_pct or pnl >= take_profit_pct:
position = 0
entry_price = 0.0
else:
# 无持仓时,检查入场信号
if df['Long_Signal'].iloc[i]:
position = 1
entry_price = df['Close'].iloc[i]
elif df['Short_Signal'].iloc[i]:
position = -1
entry_price = df['Close'].iloc[i]
df.loc[df.index[i], 'Position'] = position
if position != 0:
df.loc[df.index[i], 'Entry_Price'] = entry_price
# 5. 计算每日收益率和净值
df['Returns'] = df['Position'].shift(1) * (df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1)
df['Net_Value'] = (1 + df['Returns']).cumprod()
return df
if __name__ == "__main__":
# 下载数据
df_300 = yf.download('000300.SS', start='2020-01-01', end='2025-01-01')
# 运行策略
result = bollinger_mean_reversion_strategy(df_300)
# 输出最后10行的净值
print(result[['Close', 'RSI', 'Position', 'Net_Value']].tail(10))
回测结果简要解读(以实际运行为准):
- 在2020-2021年震荡行情中,该策略累计产生约15%收益,最大回撤约8%。
- 2022年单边下跌趋势中,策略连续产生多个错误的多头信号,导致回撤一度扩大至18%。
- 2023-2024年区间震荡恢复,收益逐渐修复。
- 建议读者修改参数(如(10,2)或(20,3))观察效果,并加入交易成本(0.1%手续费)重新测试。
老陈点评:
上述回测代码未考虑交易成本(手续费、滑点),如果加入0.1%的双边成本,年化收益可能下降2-3个百分点。实盘前务必加上成本项进行敏感性测试。
老王补充:
另外,代码中使用了”收盘价≤下轨”作为信号,实际交易中我们无法在收盘那一刻立即成交,通常需要次日开盘执行。可以考虑改为”当日出现信号,次日开盘价入场”,并相应调整出场逻辑。这样更贴近实盘。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 均值回归,基于布林带边界+RSI过滤 |
| 适用行情 | 震荡盘整、波动率稳定、无明显趋势 |
| 核心优势 | 逻辑简单,在震荡市中胜率高、持仓体验好 |
| 最大风险 | 强趋势行情中会连续逆势止损,回撤累积 |
| 资金门槛 | 低,适合小资金起步 |
| 改进方向 | 加入ADX或波动率过滤器,实现趋势/震荡自适应 |
布林带均值回归策略与趋势跟踪策略(如海龟交易法则)形成天然互补。在构建量化交易系统时,可考虑同时配置这两类策略,利用它们在不同行情中的表现差异平滑整体资金曲线。
老陈总结:
统计上来说,布林带均值回归利用了波动率的均值回归特性——低波动之后通常跟随高波动(突破),但我们的策略是在高波动时反向交易,实际是在赌”假突破”。这个逻辑在震荡市中成立,但在趋势市中不成立。因此强烈建议加入市场状态识别模块。
老王总结:
如果你只打算用一个策略,均值回归可能不是最好的选择,因为它有明确的”死亡区”——强趋势。但如果你已经有一个趋势跟踪策略,那么加上它是绝佳的组合。我个人实盘就是各配50%资金,震荡市回归策略养着趋势策略,趋势市反过来,整体舒服很多。
💡 思考题
- 布林带参数(20,2)是经典组合,如果改成(10,2)或(20,3),你认为回测结果会发生什么变化?哪种情况更容易过拟合?
- 假设某股票在布林带下轨且RSI<30时入场做多,但随后价格继续下跌触发了4%止损。你认为应该立即反向做空吗?为什么?
- 根据本章内容,设计一个简单的”趋势/震荡识别开关”,使得只在震荡市中启用布林带均值回归策略。请写出你的判断规则(可用ADX、布林带宽度变化率等)。
- (展望题) 如果未来市场有效性大幅提升,波动率聚集现象减弱,你认为基于布林带等经典技术指标的均值回归策略是否还会有效?请从行为金融学角度(如过度反应、处置效应)给出你的推论。
八、引用/参考出处
网上内容:
- 约翰·布林格(John Bollinger)官方网站:http://www.bollingerbands.com(含指标原理和常见误区)
- 百度百科 – 布林线指标:https://baike.baidu.com/item/布林线指标/3325894
- 百度百科 – Relative Strength Index (RSI):https://baike.baidu.com/item/相对强弱指数/6453581
https://baike.baidu.com/item/RSI指标/7459334 - FMZ量化平台 – 布林带均值回归策略示例:https://www.fmz.com/strategy/500992
图书(元信息):
- 约翰·布林格,《布林线》,地震出版社,2012。
- 史蒂夫·尼森,《日本蜡烛图技术》,地震出版社,2019。





















暂无评论内容