当前位置: 首页 > news >正文

量化交易 - 布林带(Bollinger Bands)策略研究 - 源码

一、介绍

布林带(Bollinger Bands)是一种技术分析工具,用于判断金融资产的价格波动和相对的高低点。布林带由约翰·布林格(John Bollinger)在20世纪80年代发明,是广泛应用于股市、外汇市场等各类金融市场的趋势跟踪指标。

原理

布林带由三个部分组成:

1. 中轨线(Middle Band):通常是一定周期的简单移动平均线。
2. 上轨线(Upper Band):中轨线加上一定倍数的标准差。
3. 下轨线(Lower Band):中轨线减去一定倍数的标准差。

公式

假设选择的时间周期为N,常用的N值是20,标准差倍数常用2,公式如下:

中轨线(MB):  
  \[
  MB = \text{SMA}(N)
  \]
  其中,SMA表示简单移动平均线。

上轨线(UB):  
  \[
  UB = MB + K \times \text{标准差}(N)
  \]
  
下轨线(LB):  
  \[
  LB = MB - K \times \text{标准差}(N)
  \]

  其中,K通常为2,代表上下轨线的宽度与价格波动匹配的程度。

使用策略

布林带策略常用于识别价格的超买或超卖状态:

1. 买入信号:当资产价格跌破下轨线,市场可能处于超卖状态,价格可能会反弹。此时可以考虑买入。
   
2. 卖出信号:当资产价格突破上轨线,市场可能处于超买状态,价格可能会回调。此时可以考虑卖出。

3. 趋势确认:如果价格在布林带中轨线以上移动,可以看作是价格的强势表现,属于上行趋势;反之亦然。

优缺点

优点:
  - 能直观地表示价格波动带宽。
  - 适用于多种市场和时间框架。
  - 可以结合其他指标改善策略准确性。

缺点:
  - 在极端市场条件下可能会失效,即价格可能长时间在布林带之外徘徊。
  - 过于依赖历史波动率,可能对突发市场事件的反应不够灵敏。

布林带策略的有效性需要结合具体市场环境和其他技术分析工具加以验证和调整。每一笔交易都伴随风险,使用布林带策略时应配合风险管理措施。

二、代码实现

2.1 自己写代码

import numpy as np
import pandas as pddef get_bollinger_bands1(price_data, period=20, std_dev_factor=2):"""计算布林带。:param price_data: (pd.Series) 股票的收盘价历史数据。:param period: (int) 移动均线结果计算的周期数,默认 20。:param std_dev_factor: (float) 标准差倍数,默认 2。:return: (tuple) 中轨、上轨、下轨。"""# 计算简单移动平均线middle_band = price_data.rolling(window=period).mean()# 计算滚动标准差# 注意:Pandas 默认使用样本标准差 ddof=1rolling_std_dev = price_data.rolling(window=period).std(ddof=0)  # TA-Lib 用总体标准差# 计算上轨和下轨upper_band = middle_band + (std_dev_factor * rolling_std_dev)lower_band = middle_band - (std_dev_factor * rolling_std_dev)return upper_band, middle_band, lower_band
# 获取历史价格数据
symbol = '000300.XSHG'
price_data = get_price(symbol, end_date='2025-04-17', count=50, frequency='daily', fields=['close'])
close_prices = price_data['close']# 计算布林带
ub, mb, lb = get_bollinger_bands1(close_prices)
df = pd.DataFrame({'close':close_prices , 'ub': ub, 'mb': mb, 'lb': lb})
df.tail()

 

2.2 调用talib库

import talibdef get_bollinger_bands2(price_data, period=20, std_dev_factor=2):"""使用 TA-Lib 计算布林带。:param price_data: (pd.Series) 股票的收盘价历史数据。:param period: (int) 移动均线结果计算的周期数,默认 20。:param std_dev_factor: (float) 标准差倍数,默认 2。:return: (tuple) 上轨、中轨、下轨。"""# 使用 TA-Lib 计算布林带upper_band, middle_band, lower_band = talib.BBANDS(price_data.values,timeperiod=period,nbdevup=std_dev_factor,nbdevdn=std_dev_factor,matype=0)return upper_band, middle_band, lower_band
# 计算布林带
ub, mb, lb = get_bollinger_bands2(close_prices)
df = pd.DataFrame({'close':close_prices , 'ub': ub, 'mb': mb, 'lb': lb})
df.tail()

可以发现完美一致!

 注意:  
Pandas 的 rolling.std() 默认使用 ddof=1(样本标准差),因为在实际应用中,时间序列数据通常被视为 样本(例如股票价格是无限总体中的一个样本)。  
TA-Lib 的 BBANDS 默认使用 ddof=0(总体标准差),可能是因为其设计更偏向传统金融计算,或为了与其他交易软件兼容。

相关文章:

  • 智能制造中如何进行智能工厂三年规划设计?【附全文阅读】
  • 双指针算法(二)
  • 【系统搭建】DPDK实现两虚拟机基于testpmd和l2fwd的收发包
  • C++之类模板
  • 基于AI大语言模型的历史文献分析在气候与灾害重建领域中的技术应用
  • 对抗生成进化:基于DNA算法的AIGC检测绕过——让AI创作真正“隐形“
  • ubtuntu安装docker拉取iwebsec镜像
  • 智慧矿山数字孪生解决方案:技术剖析与实践
  • Windows快速切换屏幕/桌面
  • java基础练习DEMO
  • zynq7020 ubuntu_base 跟文件系统
  • 深入解析Java Socket服务器实现:从基础到优雅停机
  • ICP 减少的是 不必要 的回表,而不是 所有 回表
  • 《Java 并发编程实践》阅读笔记(一):线程重要性
  • 空洞卷积(膨胀卷积/扩张卷积)本质理解
  • Java 本地缓存的实现:常见的四种方式
  • 逻辑过期怎么设计
  • PclSharp ——pcl的c#nuget包
  • 自己的账号
  • 细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
  • 五大光伏龙头一季度亏损超80亿元,行业冬天难言结束
  • 上海国际咖啡文化节开幕,北外滩集结了超350个展位
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电
  • 外交部:美方应在平等、尊重和互惠的基础上同中方开展对话
  • 美乌总统梵蒂冈会谈,外交部:望有关各方继续通过对话谈判解决危机
  • 黄仁勋访华期间表示希望继续与中国合作,贸促会回应