如何用Pandas正确计算布林带?我的20窗口2倍标准差计算结果错误
正确计算布林带的方法
你的代码错误根源是公式逻辑错误:布林带的上轨是「滚动均值 + 标准差倍数×滚动标准差」,下轨是「滚动均值 - 标准差倍数×滚动标准差」,而你把倍数2直接乘到了「均值+标准差」的总和上,完全偏离了正确公式。
以下是完整的正确计算流程:
- 先创建滚动窗口对象,避免重复计算窗口数据提升效率
- 基于滚动窗口分别计算均值(中轨)和总体标准差(注意
ddof=0) - 代入布林带公式计算上轨、下轨
完整代码:
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
相关产品推荐
相关产品推荐

