第二.01 布林带均值回归策略

      📘 本章重点

      • 理解均值回归的理论基础及布林带的统计原理(均值±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%资金,震荡市回归策略养着趋势策略,趋势市反过来,整体舒服很多。

      💡 思考题

      1. 布林带参数(20,2)是经典组合,如果改成(10,2)或(20,3),你认为回测结果会发生什么变化?哪种情况更容易过拟合?
      2. 假设某股票在布林带下轨且RSI<30时入场做多,但随后价格继续下跌触发了4%止损。你认为应该立即反向做空吗?为什么?
      3. 根据本章内容,设计一个简单的”趋势/震荡识别开关”,使得只在震荡市中启用布林带均值回归策略。请写出你的判断规则(可用ADX、布林带宽度变化率等)。
      4. (展望题) 如果未来市场有效性大幅提升,波动率聚集现象减弱,你认为基于布林带等经典技术指标的均值回归策略是否还会有效?请从行为金融学角度(如过度反应、处置效应)给出你的推论。

      八、引用/参考出处

      网上内容

      图书(元信息)

      • 约翰·布林格,《布林线》,地震出版社,2012。
      • 史蒂夫·尼森,《日本蜡烛图技术》,地震出版社,2019。
      © 版权声明
      THE END
      喜欢就支持一下吧
      点赞14 分享
      评论 抢沙发

      请登录后发表评论

        暂无评论内容