← 返回《初阶量化交易:策略编写及系统搭建》
📑 查看全课大纲(第 14 / 38 节)

基于BOLL的交易信号开发

约 9 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

基于BOLL的交易信号开发

小象实战讲义 · 初阶量化交易:策略编写及系统搭建 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在统计套利与通道突破策略中,BOLL(Bollinger Bands,布林线) 是极具数理优雅感的自适应指标。它由约翰·布林格(John Bollinger)于 1980 年代创立,基于统计学中正态分布与标准差(Standard Deviation) 原理,在均线两端构建动态置信区间通道。

与固定宽度的传统包络线不同,布林带通道宽度会随着标的历史波动率自适应收缩与扩张。本讲将系统解析布林带三大轨道的数学构建逻辑;重点剖析量化实盘中利用前一日轨道消除盘中信号闪烁(Anti-flickering) 的工程架构方案;并给出突破上下轨的信号提取与数据库落库实现。


💡 核心导读

  • BOLL 指标的三大轨道与数学公式(经典参数:N=20,k=2N=20, k=2
    • 中轨(MB, Middle Band):过去 NN 日收盘价的简单移动平均: MB=1Ni=1NCloseiMB = \frac{1}{N} \sum_{i=1}^N Close_i
    • 样本标准差(σ\sigma / STD)σ=1Ni=1N(CloseiMB)2\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (Close_i - MB)^2}
    • 上轨(UP, 动态压力线)UP=MB+kσUP = MB + k \cdot \sigma
    • 下轨(DOWN, 动态支撑线)DOWN=MBkσDOWN = MB - k \cdot \sigma
    • 带宽指标(BandWidth)BandWidth=UPDOWNMB=2kσMBBandWidth = \frac{UP - DOWN}{MB} = \frac{2k\sigma}{MB},直接反映市场波动率大小。
  • 盘中信号防闪烁工程设计(Anti-flickering Design)
    • 盘中实时价格跳变频繁,若以当日未定格的 UPtUP_t 实时判定,信号会出现反复闪烁(产生大量假单);
    • 工程解决方案:采用 t1t-1 日已收盘固定的 UPt1UP_{t-1}DOWNt1DOWN_{t-1} 作为当日突破比对基准线,消除信号闪烁;
  • 两大核心交易逻辑分支
    • 动量突破策略(Trend Following):低波动挤压(Squeeze)后,价格强势向上刺破上轨(Closet>UPt1Close_t > UP_{t-1}),预示主升浪开启,顺势追买;
    • 均值回归策略(Mean Reverting):震荡市中,价格击穿下轨(Closet<DOWNt1Close_t < DOWN_{t-1})后大概率向中轨均值回归反弹,逆势低吸。
┌─────────────────────────────────────────────────────────────┐
│                    BOLL 布林通道三轨与波动率自适应             │
└──────────────────────────────┬──────────────────────────────┘

 ┌─────────────────────────────┴─────────────────────────────┐
 ▼                                                           ▼
┌──────────────────┐                               ┌──────────────────┐
│   上轨: MB + 2σ  │ ─── 压力带 (95.4% 概率置信上限)  │   通道收窄 (Squeeze)│
├──────────────────┤                               ├──────────────────┤
│   中轨: MA20     │ ─── 价值中枢 (趋势基准线)        │ • 波动率极度压缩 │
├──────────────────┤                               │ • 预示大变盘在即 │
│   下轨: MB - 2σ  │ ─── 支撑带 (95.4% 概率置信下限)  │ • 突破即单边主升 │
└──────────────────┘                               └──────────────────┘

一、布林带的统计学原理与动态带宽

1. 正态分布置信区间的数理内涵

在统计学中,若价格服从均值为 μ\mu、方差为 σ2\sigma^2 的分布:

  • 价格落在 [μσ,μ+σ][\mu - \sigma, \mu + \sigma] 内的理论概率约为 68.2%
  • 价格落在 [μ2σ,μ+2σ][\mu - 2\sigma, \mu + 2\sigma] 内的理论概率约为 95.4%
  • 价格落在 [μ3σ,μ+3σ][\mu - 3\sigma, \mu + 3\sigma] 内的理论概率约为 99.7%

因此,k=2k=2 的上轨与下轨构成了常态下 95% 以上价格波动的天然包络线。一旦价格有效穿越该边界,往往意味着小概率极端行情的爆发。

2. 波动率挤压(The Bollinger Squeeze)

当市场陷入长时间缩量震荡时,σ\sigma 极速衰减,上下轨急剧向中轨靠拢,带宽百分比降至历史极低分位。历史规律表明:波动率具有强烈的均值回归特征,极度的波动率挤压必然伴随着单边爆发性趋势的来临


二、防闪烁突破判定与代码实现

为防止盘中价格未定格时因上轨动态变化引起信号高频闪烁,量化系统统一采用平移一期的基准线对比:

Break_UPt=(Closet1UPt1)(Closet>UPt1)\text{Break_UP}t = (Close{t-1} \le UP_{t-1}) \land (Close_t > UP_{t-1})

Break_DOWNt=(Closet1DOWNt1)(Closet<DOWNt1)\text{Break_DOWN}t = (Close{t-1} \ge DOWN_{t-1}) \land (Close_t < DOWN_{t-1})


📝 动手练一练

下面我们用 Python 编写一段 BOLL 布林通道与防闪烁上下轨突破信号计算引擎,验证价格在低波动整理后向上暴力突破上轨的精准识别:

import pandas as pd
import numpy as np

def compute_boll_signals(df, n=20, k=2.0):
    """
    计算布林带 (BOLL) 三轨指标与防闪烁上下轨突破信号
    """
    df = df.copy()
    # 1. 计算中轨 (N 日收盘均线) 与 滚动样本标准差
    df['MB'] = df['Close'].rolling(n).mean()
    df['STD'] = df['Close'].rolling(n).std()
    
    # 2. 计算上轨、下轨与动态带宽百分比
    df['UP'] = df['MB'] + k * df['STD']
    df['DOWN'] = df['MB'] - k * df['STD']
    df['BandWidth'] = (df['UP'] - df['DOWN']) / df['MB'] * 100.0
    
    # 3. 防闪烁设计: 基于 t-1 日固定的上下轨进行边沿突破判定
    df['Last_Close'] = df['Close'].shift(1)
    df['Shifted_UP'] = df['UP'].shift(1)
    df['Shifted_DOWN'] = df['DOWN'].shift(1)
    
    # 向上突破上轨: 前一日在轨下,当日穿到轨上
    df['Break_UP'] = (df['Last_Close'] <= df['Shifted_UP']) & (df['Close'] > df['Shifted_UP'])
    # 向下跌破下轨: 前一日在轨上,当日跌到轨下
    df['Break_DOWN'] = (df['Last_Close'] >= df['Shifted_DOWN']) & (df['Close'] < df['Shifted_DOWN'])
    
    return df

def test_boll_run():
    np.random.seed(42)
    n_days = 30
    dates = pd.date_range("2023-01-01", periods=n_days, freq="D")
    # 构造稳定窄幅横盘后突发强力向上暴涨突破的价格时序
    base_prices = np.full(n_days, 10.0) + np.random.normal(0, 0.2, n_days)
    base_prices[24:] += np.array([1.0, 1.8, 2.5, 3.2, 3.8, 4.5])  # 模拟突破拉升
    
    df = pd.DataFrame({'Close': base_prices}, index=dates)
    res = compute_boll_signals(df, n=15, k=2.0)
    
    break_ups = res[res['Break_UP']].index.strftime('%Y-%m-%d').tolist()
    break_downs = res[res['Break_DOWN']].index.strftime('%Y-%m-%d').tolist()
    
    print("================ BOLL 布林通道与突破信号引擎 ================")
    print(res[['Close', 'MB', 'UP', 'DOWN', 'BandWidth', 'Break_UP', 'Break_DOWN']].tail(8))
    print("------------------------------------------------------------")
    print(f"检测到 BOLL 向上突破上轨日期: {break_ups}")
    print(f"检测到 BOLL 向下跌破下轨日期: {break_downs}")
    print("============================================================")

if __name__ == "__main__":
    test_boll_run()

运行结果输出:

================ BOLL 布林通道与突破信号引擎 ================
                Close         MB         UP       DOWN  BandWidth  Break_UP  Break_DOWN
2023-01-23  10.013506   9.912985  10.271795   9.554175   7.239192     False       False
2023-01-24   9.715050   9.900248  10.273383   9.527113   7.537888     False       False
2023-01-25  10.891123   9.952422  10.581465   9.323380  12.640995      True       False
2023-01-26  11.822185  10.080080  11.230789   8.929370  22.831344     False       False
2023-01-27  12.269801  10.237610  11.843590   8.631630  31.374107     False       False
2023-01-28  13.275140  10.452727  12.690311   8.215144  42.813418     False       False
2023-01-29  13.679872  10.723562  13.456435   7.990689  50.969498     False       False
2023-01-30  14.441661  11.042672  14.306985   7.778359  59.121798     False       False
------------------------------------------------------------
检测到 BOLL 向上突破上轨日期: ['2023-01-25']
检测到 BOLL 向下跌破下轨日期: []
============================================================

本章小结

  1. 掌握布林带统计内涵:均线代表价值中枢,两倍标准差上下轨提供动态波动的包络线。
  2. 防闪烁工程设计:实盘与回测判定突破时,使用上一交易日已收盘定型的轨道作为比对基准线,确保信号稳定性。
  3. 重视波动率挤压形态:通道收窄至极值往往是重大单边行情的蓄势期,突破瞬间是胜率极高的顺势入场点。

📋 行动清单 (Action Checklist)

  • 运行本讲 BOLL 引擎代码,观察突破发生后 BandWidth 从 7.2% 迅速扩张至 59.1% 的动态过程;
  • 尝试将倍数 kk 从 2.0 调整至 1.5 和 2.5,对比突破信号灵敏度与虚假突破的比例;
  • 预习下一讲,探索非线性形态识别指标——分形(Fractal)顶底结构的量化开发。

— 小象教研组

配套学习资源与课件
  • 第2章课件:认识量化信号系统(PDF · 2.1MB)
    下载
  • 开发环境准备:软件安装指导(PDF · 0.9MB · 建议第3章动手实践前先通读)
    下载
  • 量化入门推荐书单(PDF · 318KB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问