5、布林带策略:中轨、上下轨计算,突破信号与回归信号

布林带这东西,说白了就是一个动态的「价格通道」。它不像固定支撑阻力线那样死板,而是根据市场波动率自己调整宽窄。我个人习惯把它叫做「会呼吸的通道」——市场安静时收窄,躁动时张开。

嗯,咱们直接进入正题。布林带的核心就三根线:中轨、上轨、下轨。中轨是基础,上下轨是边界。

5.1 中轨与上下轨的计算

中轨其实就是一个简单移动平均线(SMA),周期我一般用20。为什么是20?因为一个月大概有20个交易日,能较好地反映中期趋势。

上下轨的计算公式:

  • 中轨 = SMA(close, 20)
  • 上轨 = 中轨 + k × 标准差(close, 20)
  • 下轨 = 中轨 - k × 标准差(close, 20)

这里的k值,经典取值是2。但我在高频数据里发现,k=2.5或1.8有时效果更好。为什么?因为高频数据噪声大,k值太小容易频繁触发假信号。

核心要点:布林带的宽度 = 2 × k × 标准差。宽度越宽,说明市场波动越大;越窄,说明市场在蓄力。

来看代码实现:

import numpy as np
import pandas as pd

def bollinger_bands(df, window=20, k=2):
    """
    计算布林带
    df: 包含'close'列的DataFrame
    """
    df = df.copy()
    df['middle'] = df['close'].rolling(window=window).mean()
    df['std'] = df['close'].rolling(window=window).std()
    df['upper'] = df['middle'] + k * df['std']
    df['lower'] = df['middle'] - k * df['std']
    return df

# 示例用法
# df = bollinger_bands(df, window=20, k=2)

这里有个坑,我踩过。rolling计算标准差时,默认是样本标准差(ddof=1)。但在高频数据里,用总体标准差(ddof=0)有时更稳定。你自己试试看,不同选择对信号触发频率影响挺大的。

5.2 突破信号:价格冲出通道

突破信号分两种:向上突破和向下突破。

  • 向上突破信号:收盘价 > 上轨。意味着价格强势,可能继续上涨。
  • 向下突破信号:收盘价 < 下轨。意味着价格弱势,可能继续下跌。

但注意,单纯的突破信号在震荡市里就是灾难。我曾经在横盘行情里用突破信号做交易,一天被来回打脸三次。后来我加了一个过滤条件:突破时布林带宽度必须大于某个阈值。

我的经验:突破信号最好配合成交量确认。如果突破时成交量放大,信号可靠性更高。如果缩量突破,大概率是假突破。

代码实现突破信号检测:

def detect_breakout(df, k=2):
    """
    检测突破信号
    返回:1=向上突破,-1=向下突破,0=无信号
    """
    df = bollinger_bands(df, k=k)
    df['signal'] = 0
    
    # 向上突破
    df.loc[df['close'] > df['upper'], 'signal'] = 1
    # 向下突破
    df.loc[df['close'] < df['lower'], 'signal'] = -1
    
    return df

5.3 回归信号:价格回到通道内

回归信号是布林带策略的精髓。它基于一个假设:价格偏离均值太远后,会向均值回归。

  • 回归买入信号:价格跌破下轨后,重新回到下轨上方。意味着超卖反弹。
  • 回归卖出信号:价格突破上轨后,重新回到上轨下方。意味着超买回落。

说白了,就是「涨多了会跌,跌多了会涨」。但这里有个度的问题。我记得有一次做股指期货,价格连续三天贴着上轨跑,我一直在等回归信号,结果等来了爆仓。趋势行情里,回归信号会让你死得很惨。

警告:回归信号在强趋势行情中完全失效。一定要先判断市场状态——震荡市用回归,趋势市用突破。

回归信号检测代码:

def detect_reversion(df, k=2):
    """
    检测回归信号
    返回:1=回归买入,-1=回归卖出,0=无信号
    """
    df = bollinger_bands(df, k=k)
    df['signal'] = 0
    
    # 回归买入:之前跌破下轨,现在回到下轨上方
    df['below_lower'] = df['close'] < df['lower']
    df['reversion_buy'] = df['below_lower'].shift(1) & (df['close'] > df['lower'])
    
    # 回归卖出:之前突破上轨,现在回到上轨下方
    df['above_upper'] = df['close'] > df['upper']
    df['reversion_sell'] = df['above_upper'].shift(1) & (df['close'] < df['upper'])
    
    df.loc[df['reversion_buy'], 'signal'] = 1
    df.loc[df['reversion_sell'], 'signal'] = -1
    
    return df

5.4 布林带策略知识体系

下面这张图,是我自己梳理的布林带策略核心逻辑。你看一眼就能明白整个框架:

布林带策略核心逻辑 中轨 (SMA 20) 上轨 = 中轨 + k×σ 下轨 = 中轨 - k×σ 突破信号:价格冲出通道 回归信号:价格回到通道内 震荡市 → 回归信号 | 趋势市 → 突破信号

5.5 实战中的参数调优

参数调优是布林带策略的灵魂。我整理了一个参数对比表,供你参考:

参数 默认值 高频数据建议 说明
窗口期 20 10-15 高频数据周期短,窗口太大反应迟钝
k值 2 1.5-2.5 噪声大用大k,噪声小用小k
标准差类型 样本标准差 总体标准差 高频数据用总体标准差更稳定
信号过滤 成交量+带宽 过滤掉80%的假信号
避坑指南:我曾经在5分钟K线上用默认参数跑布林带,结果信号多到没法看。后来把窗口从20改成12,k值从2改成2.2,信号质量明显提升。记住,参数不是死的,要根据数据频率调整。

最后说一句,布林带策略不是万能钥匙。它最适合震荡行情,在趋势行情里要搭配其他指标使用。比如加上ADX指标判断趋势强度,或者用RSI过滤极端值。这些组合策略,咱们后面章节会详细讲。