量化交易 - 布林带(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(总体标准差),可能是因为其设计更偏向传统金融计算,或为了与其他交易软件兼容。