首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >大熊猫滚动活动行为

大熊猫滚动活动行为
EN

Stack Overflow用户
提问于 2020-03-11 10:48:59
回答 1查看 786关注 0票数 1

我正在使用Pandas计算Bollinger波段的证券价格。我使用20天的平均收盘价和两个标准差+/-那个值来计算带。

在使用.rolling().std()时,我注意到了计算值与第三方数据提供者报告的值之间的差异;在“手动”计算stdev (逐步)后,我能够再现与第三方站点一致的值,并且与在相同数据上使用.rolling.std()计算的值类似。

下面是数据的一个子集,包括两组计算:“手册”和熊猫“滚动”。我的代码中有什么东西导致熊猫滚动数据的变化吗?

代码语言:javascript
运行
AI代码解释
复制
close_values = {'close': [88.64, 87.02, 88.7, 89.89, 90.93, 90.4, 90.21, 90.16, 90.94, 91.93, 
                          90.26, 85.5, 81.89, 82.18, 78.31, 75.65, 79.61, 76.55, 80.41, 77.87]}
df = pd.DataFrame(close_values)

df['period_mean'] = df['close'].mean()
df['abs_^2_var'] = (np.abs(df['close'] - df['period_mean'])) ** 2
df['stdev_man'] = np.sqrt(df['abs_^2_var'].rolling(20).mean())
df['stdev_roll'] = df['close'].rolling(20).std()

df['BolU_man'] = round(df['period_mean'] + (df['stdev_man'] * 2), 4)
df['BolL_man'] = round(df['period_mean'] - (df['stdev_man'] * 2), 4)

df['BolU_roll'] = round(
    df['close'].rolling(20).mean() + (2 * (df['close'].rolling(20).std())), 4)
df['BolL_roll'] = round(
    df['close'].rolling(20).mean() - (2 * (df['close'].rolling(20).std())), 4)

print(df)

这是以上内容的输出:

代码语言:javascript
运行
AI代码解释
复制
    close  period_mean  abs_^2_var  stdev_man  stdev_roll  BolU_man  BolL_man  \
0   88.64      85.3525   10.807656        NaN         NaN       NaN       NaN   
1   87.02      85.3525    2.780556        NaN         NaN       NaN       NaN   
2   88.70      85.3525   11.205756        NaN         NaN       NaN       NaN   
3   89.89      85.3525   20.588906        NaN         NaN       NaN       NaN   
4   90.93      85.3525   31.108506        NaN         NaN       NaN       NaN   
5   90.40      85.3525   25.477256        NaN         NaN       NaN       NaN   
6   90.21      85.3525   23.595306        NaN         NaN       NaN       NaN   
7   90.16      85.3525   23.112056        NaN         NaN       NaN       NaN   
8   90.94      85.3525   31.220156        NaN         NaN       NaN       NaN   
9   91.93      85.3525   43.263506        NaN         NaN       NaN       NaN   
10  90.26      85.3525   24.083556        NaN         NaN       NaN       NaN   
11  85.50      85.3525    0.021756        NaN         NaN       NaN       NaN   
12  81.89      85.3525   11.988906        NaN         NaN       NaN       NaN   
13  82.18      85.3525   10.064756        NaN         NaN       NaN       NaN   
14  78.31      85.3525   49.596806        NaN         NaN       NaN       NaN   
15  75.65      85.3525   94.138506        NaN         NaN       NaN       NaN   
16  79.61      85.3525   32.976306        NaN         NaN       NaN       NaN   
17  76.55      85.3525   77.484006        NaN         NaN       NaN       NaN   
18  80.41      85.3525   24.428306        NaN         NaN       NaN       NaN   
19  77.87      85.3525   55.987806   5.495136     5.63789   96.3428   74.3622   

    BolU_roll  BolL_roll  
0         NaN        NaN  
1         NaN        NaN  
2         NaN        NaN  
3         NaN        NaN  
4         NaN        NaN  
5         NaN        NaN  
6         NaN        NaN  
7         NaN        NaN  
8         NaN        NaN  
9         NaN        NaN  
10        NaN        NaN  
11        NaN        NaN  
12        NaN        NaN  
13        NaN        NaN  
14        NaN        NaN  
15        NaN        NaN  
16        NaN        NaN  
17        NaN        NaN  
18        NaN        NaN  
19    96.6283    74.0767  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-11 10:57:22

看起来Pandas 轧制标准差函数在默认情况下应用贝塞尔校正

Series.std中使用的默认ddof 1与numpy.std中的默认ddof 0不同。

您可以通过传递ddof=0来修改这种行为

代码语言:javascript
运行
AI代码解释
复制
df['stdev_roll'] = df['close'].rolling(20).std(ddof=0)

这给出了与手工计算相同的结果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60642691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档