Python 计算股票布林线(BOLL)指标完整实战教程

📅 2026/7/18 20:46:47 👁️ 阅读次数 📝 编程学习
Python 计算股票布林线(BOLL)指标完整实战教程

一、布林线指标基础原理

布林线(Bollinger Bands,简称BOLL)是由约翰·布林格发明的经典趋势波动率指标,核心依托移动平均线+标准差构建三条轨道线,直观反映股价波动区间、支撑压力位与超买超卖状态。

三条轨道计算公式

  1. 中轨线(MB):N周期收盘价简单移动平均线,常规参数N=20
    MB=MA20=Close1+Close2+...+Close2020MB = MA_{20} = \frac{Close_1+Close_2+...+Close_{20}}{20}MB=MA20=20Close1+Close2+...+Close20
  2. 上轨线(UP):中轨 + N倍收盘价标准差,默认倍数K=2
    UP=MB+2×σUP = MB + 2 \times \sigmaUP=MB+2×σ
  3. 下轨线(DN):中轨 - N倍收盘价标准差
    DN=MB−2×σDN = MB - 2 \times \sigmaDN=MB2×σ

σ\sigmaσ:20周期收盘价标准差,代表股价波动率。

基础交易逻辑

  1. 股价触碰上轨:短期超买,回调概率提升;
  2. 股价触碰下轨:短期超卖,反弹概率提升;
  3. 轨道收窄:波动率缩小,预示即将突破行情;
  4. 轨道扩张:波动加大,单边趋势行情延续。

二、环境依赖准备

本次实战使用三大核心库:

  • tushare:免费获取A股股票历史行情数据
  • pandas:数据清洗、均线、标准差批量计算
  • matplotlib:可视化绘制布林线K线走势图
  • numpy:数值计算辅助

安装依赖命令

pipinstalltushare pandas numpy matplotlib

三、完整代码实现:获取行情+计算布林指标

3.1 步骤说明

  1. 初始化Tushare接口,拉取单只股票日线数据;
  2. 基于收盘价计算20日均线、标准差;
  3. 代入公式生成上轨、中轨、下轨三条布林线;
  4. 数据校验,剔除空值;
  5. Matplotlib绘制股价与布林轨道对比图。

完整可运行源码

importtushareastsimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt# ---------------------- 1. 初始化Tushare(需自行官网注册获取token) ----------------------# Tushare官网:https://tushare.pro/ 注册后获取个人tokents.set_token("你的Tushare Token")pro=ts.pro_api()# ---------------------- 2. 获取股票日线行情数据 ----------------------defget_stock_data(stock_code,start_date,end_date):""" 获取A股日线数据 :param stock_code: 股票代码 如600036.SH :param start_date: 起始日期 YYYYMMDD :param end_date: 结束日期 YYYYMMDD :return: 处理后DataFrame """df=pro.daily(ts_code=stock_code,start_date=start_date,end_date=end_date)# 按交易日期升序排序(接口默认倒序,必须反转才能正确计算均线)df=df.sort_values("trade_date").reset_index(drop=True)# 日期格式转换,用于绘图横轴展示df["trade_date"]=pd.to_datetime(df["trade_date"])returndf# ---------------------- 3. 核心函数:计算布林线BOLL指标 ----------------------defcalc_boll(df,n=20,k=2):""" 计算布林带上中下轨 :param df: 股票行情DataFrame,必须包含close收盘价列 :param n: 均线周期,默认20 :param k: 标准差倍数,默认2 :return: 新增boll_mb、boll_up、boll_dn三列的df """# 中轨:N周期简单移动平均df["boll_mb"]=df["close"].rolling(window=n).mean()# 计算N周期收盘价标准差std=df["close"].rolling(window=n).std()# 上轨 = 中轨 + k倍标准差df["boll_up"]=df["boll_mb"]+k*std# 下轨 = 中轨 - k倍标准差df["boll_dn"]=df["boll_mb"]-k*stdreturndf# ---------------------- 4. 布林线可视化绘图函数 ----------------------defplot_boll(df,stock_name):plt.rcParams["font.sans-serif"]=["SimHei"]# 解决中文乱码plt.rcParams["axes.unicode_minus"]=False# 解决负号显示异常fig,ax=plt.subplots(figsize=(14,7))# 绘制收盘价走势ax.plot(df["trade_date"],df["close"],color="#222222",linewidth=1.2,label="收盘价")# 布林中轨(蓝色)ax.plot(df["trade_date"],df["boll_mb"],color="#0066cc",linewidth=1.5,label="BOLL中轨(MB)")# 布林上轨(红色)ax.plot(df["trade_date"],df["boll_up"],color="#cc2222",linewidth=1,linestyle="--",label="BOLL上轨(UP)")# 布林下轨(绿色)ax.plot(df["trade_date"],df["boll_dn"],color="#229922",linewidth=1,linestyle="--",label="BOLL下轨(DN)")# 填充上下轨区间,半透明灰色ax.fill_between(df["trade_date"],df["boll_up"],df["boll_dn"],color="#dddddd",alpha=0.3)ax.set_title(f"{stock_name}布林线BOLL指标走势图",fontsize=15,pad=15)ax.set_xlabel("交易日期")ax.set_ylabel("股价(元)")ax.legend(loc="best")ax.grid(alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()# ---------------------- 主程序执行入口 ----------------------if__name__=="__main__":# 配置参数stock_ts_code="600036.SH"# 招商银行stock_short_name="招商银行"start="20250101"end="20251231"# 1. 获取行情stock_df=get_stock_data(stock_ts_code,start,end)# 2. 计算布林线stock_df=calc_boll(stock_df,n=20,k=2)# 3. 打印前30行数据查看指标结果print("股票行情+布林指标数据预览:")print(stock_df[["trade_date","close","boll_mb","boll_up","boll_dn"]].head(30))# 4. 绘制布林线图表plot_boll(stock_df,stock_short_name)

四、代码分段详细解析

4.1 数据获取模块关键点

Tushare接口返回数据默认是日期倒序,如果不执行sort_values排序,滚动均线计算会完全失真,这是新手最容易踩坑的问题。
行情核心字段说明:

  • trade_date:交易日期
  • close:当日收盘价(布林线唯一计算数据源)
  • open/high/low:开盘、最高、最低价(拓展可用于K线绘制)

4.2 BOLL指标计算核心逻辑

pandas.rolling(window=n)滑动窗口是计算均线、标准差的核心:

  1. 窗口大小20代表每次取连续20根日线;
  2. mean()计算窗口均值即中轨;
  3. std()计算窗口内收盘价标准差,衡量波动幅度;
  4. 上下轨仅在中轨基础上±2倍标准差,参数k可自定义(短线用1.8,长线用2.2)。

4.3 绘图模块优化点

  1. 配置SimHei黑体解决Matplotlib中文乱码;
  2. 上下轨使用虚线区分,轨道区间填充半透明底色,视觉分层清晰;
  3. 自动旋转X轴日期标签,避免日期文字重叠。

五、拓展优化方案

5.1 本地CSV行情离线计算(无需Tushare)

如果没有Tushare账号,可导入本地存储的股票CSV文件计算布林线:

# 本地csv格式至少包含 trade_date, close 两列df=pd.read_csv("stock_data.csv")df["trade_date"]=pd.to_datetime(df["trade_date"])df=df.sort_values("trade_date").reset_index(drop=True)df=calc_boll(df)

5.2 增加布林带宽指标(判断轨道收缩扩张)

布林带宽衡量轨道宽窄,用于捕捉突破行情前兆:
BandWidth=UP−DNMBBandWidth = \frac{UP-DN}{MB}BandWidth=MBUPDN
新增代码:

df["boll_bandwidth"]=(df["boll_up"]-df["boll_dn"])/df["boll_mb"]

带宽持续走低代表震荡缩量,即将出现大行情。

5.3 超买超卖标记

增加标记列,识别股价突破轨道的信号:

df["signal"]=0df.loc[df["close"]>=df["boll_up"],"signal"]=1# 上轨超买df.loc[df["close"]<=df["boll_dn"],"signal"]=-1# 下轨超卖

六、实战使用注意事项

  1. 参数适配:A股短线交易可调整n=13,k=1.9;长线持有默认20、2;
  2. 停牌处理:数据中停牌无收盘价行会导致标准差失真,需提前过滤空值;
  3. 单边行情缺陷:持续大涨/大跌行情中,股价会长期贴紧上/下轨,单纯触碰轨道反向操作容易踏空;
  4. 指标组合:实战建议搭配MACD、成交量使用,单独布林线信号可靠性较低。

七、总结

本文通过Python+pandas完整复现布林线指标数学公式,实现了行情获取、指标批量计算、可视化绘图全流程。核心难点在于滑动窗口的顺序处理与标准差公式落地,代码封装成独立函数后可快速嵌入量化回测、自动化选股系统。
基于这套框架可继续拓展:布林线金死叉策略回测、多股票批量遍历计算、实时行情分钟线布林指标等进阶量化功能。