You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas正确计算布林带?我的20窗口2倍标准差计算结果错误

正确计算布林带的方法

你的代码错误根源是公式逻辑错误:布林带的上轨是「滚动均值 + 标准差倍数×滚动标准差」,下轨是「滚动均值 - 标准差倍数×滚动标准差」,而你把倍数2直接乘到了「均值+标准差」的总和上,完全偏离了正确公式。

以下是完整的正确计算流程:

  1. 先创建滚动窗口对象,避免重复计算窗口数据提升效率
  2. 基于滚动窗口分别计算均值(中轨)和总体标准差(注意ddof=0)
  3. 代入布林带公式计算上轨、下轨

完整代码:

import pandas as pd

# 定义参数
window_size = 20
std_multiplier = 2

# 创建复用的滚动窗口对象
rolling_window = series.rolling(window=window_size)

# 计算中轨(滚动均值)
middle_band = rolling_window.mean()
# 计算滚动总体标准差(ddof=0对应总体标准差,符合布林带标准计算)
rolling_std = rolling_window.std(ddof=0)

# 计算上轨和下轨
upper_band = middle_band + std_multiplier * rolling_std
lower_band = middle_band - std_multiplier * rolling_std

如果需要把三个轨整合到一个DataFrame中方便查看或后续处理,可以添加:

bollinger_df = pd.DataFrame({
    'Middle Band': middle_band,
    'Upper Band': upper_band,
    'Lower Band': lower_band
})

关键说明

  • 复用rolling_window对象:多次调用series.rolling(20)会重复执行窗口切片和计算,复用同一个对象能减少冗余计算,尤其是处理大数据集时更明显
  • ddof=0的作用:pandas的std()方法默认ddof=1(样本标准差,分母为n-1),而标准布林带计算使用总体标准差(分母为n),所以必须显式指定ddof=0才能得到正确的带宽

内容的提问来源于stack exchange,提问作者Asclepius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:25:17