在大熊猫的每日股票市场数据中找到52周高点

时间:2016-07-22 23:09:47

标签: python pandas

这似乎是一个简单的问题(和答案),但我遇到了麻烦。

问题:

我有一个充满OHLC数据的熊猫数据框。我希望在整个数据框架中找到52周的高点。

我的数据集来自雅虎。您可以使用以下代码提取相同的数据以获取每日数据:

import pandas.io.data as web
df = web.DataReader('SPX', 'yahoo', start, end)

数据尾部给出了以下输出:

                 Open        High         Low       Close     Volume  
Date                                                                    
2016-07-15  216.779999  217.009995  215.309998  215.830002  107155400   
2016-07-18  215.970001  216.600006  215.669998  216.410004   58725900   
2016-07-19  215.919998  216.229996  215.630005  216.190002   54345700   
2016-07-20  216.190002  217.369995  216.190002  217.089996   58159500   
2016-07-21  216.960007  217.220001  215.750000  216.270004   66070000 

要获得52周高点(滚动),我可以执行以下操作:

df["52weekhigh"] = pd.rolling_max(df.High, window=200, min_periods=1)

我得到以下内容(一些col:

                 High  52weekhigh
Date                              
2016-07-15  217.009995  217.009995
2016-07-18  216.600006  217.009995
2016-07-19  216.229996  217.009995
2016-07-20  217.369995  217.369995
2016-07-21  217.220001  217.369995

这给了我一个52周高点的值,因为新的高点进来,但我不是在这里使用200的粉丝。应该是200或201还是220(一年中“约”200个交易日)?

我可以将数据重新采样到每周以获取值,但之后我无法轻松恢复到我原来的每日数据(或者我可以吗?)。

所以......这是问题:

有没有办法在pandas数据帧上运行rolling_max并将窗口设置为'52周'或类似的东西?如果没有,有人能想到比上述更好的方法吗?

1 个答案:

答案 0 :(得分:5)

如果您的数据有工作日频率,那么每周应该有大约5行。 所以52周大致相当于window=52*5

当然,由于假期,可能还有其他几天失踪。更多 准确的说,您可以使用asfreq('D')来更改工作日的频率 到实际的日子。然后,您可以使用大小为52*7的滚动窗口:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(2016)

N = 1000
index = pd.date_range('2000-1-1', periods=N, freq='B')
data = (np.random.random((N, 1))-0.5).cumsum(axis=0)
df = pd.DataFrame(data, index=index, columns=['price'])
# result = pd.rolling_max(df.asfreq('D'), window=52*7, min_periods=1)   # for older versions of Pandas
result = df.asfreq('D').rolling(window=52*7, min_periods=1).max()
result = result.rename(columns={'price':'rolling max'})

ax = df.plot()
result.plot(ax=ax)
plt.show()

enter image description here