Pandas 滚动标准差

17

有其他人在pandas的新rolling.std()中遇到问题吗?弃用的方法是rolling_std()。新方法可以正常运行,但产生的数字是恒定的,不随时间序列滚动。

以下是示例代码。如果您交易股票,可能会认出Bollinger带的公式。我从rolling.std()得到的输出按日跟踪股票,并且显然不会滚动。

这是pandas 0.19.1版。任何帮助都将不胜感激。

import datetime
import pandas as pd
import pandas_datareader.data as web

start = datetime.datetime(2012,1,1)
end = datetime.datetime(2012,12,31)
g = web.DataReader(['AAPL'], 'yahoo', start, end)
stocks = g['Close']
stocks['Date'] = pd.to_datetime(stocks.index)
stocks['AAPL_LO'] = stocks['AAPL'] - stocks['AAPL'].rolling(20).std() * 2
stocks['AAPL_HI'] = stocks['AAPL'] + stocks['AAPL'].rolling(20).std() * 2
stocks.dropna(axis=0, how='any', inplace=True)

你能添加你期望的实际输出吗? - Julien Marrec
3
stocks['AAPL'].rolling(20).std() 的输出结果与 pd.rolling_std(stocks['AAPL'], window=20) 完全相同。 - Julien Marrec
3
我无法在这里重现:你好像是在说 stocks['AAPL'].rolling(20).std() 是恒定的,但我看到的是一个非恒定的随时间变化的结果。例如,通过绘图,我发现在2012年7月左右的波段比2012年4月左右的波段要狭窄得多。 - Mark Dickinson
感谢您展示std()的正确工作。我本来期望20天的回溯会更加平滑,但看来我还需要使用mean()。 - Mark
1个回答

21
import pandas as pd
from pandas_datareader import data as pdr
import numpy as np
import datetime

end = datetime.date.today()
begin=end-pd.DateOffset(365*10)
st=begin.strftime('%Y-%m-%d')
ed=end.strftime('%Y-%m-%d')


data = pdr.get_data_yahoo("AAPL",st,ed)

def bollinger_strat(data, window, no_of_std):
    rolling_mean = data['Close'].rolling(window).mean()
    rolling_std = data['Close'].rolling(window).std()

    df['Bollinger High'] = rolling_mean + (rolling_std * no_of_std)
    df['Bollinger Low'] = rolling_mean - (rolling_std * no_of_std)     

bollinger_strat(data,20,2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接