移动平均线计算不正确

时间:2019-04-16 16:52:27

标签: python pandas time-series moving-average rolling-computation

我正在使用从Quandl中提取的数据对Microsoft股票进行时间序列分析。我想绘制收盘价和移动平均线。当我绘制移动平均线时,它们不会一直走到图表的右侧。

我认为有一个缺口是有道理的(例如200天移动平均线要到200天才能开始),但我担心缺口在右边。这意味着它是从最近的日期开始的(这很有意义,因为最近的日期在时间序列中排在第一位),显然这不是正确的方法。

我可以颠倒序列(新数据框升序而不是降序),但是我相信这样一来,就可以绘制从最近日期开始的图形,这显然是不可接受的。

#calculate moving averages for Microsoft

roll100 = MSFT_data['Adj. Close'].rolling(100).mean()
roll200 = MSFT_data['Adj. Close'].rolling(200).mean()
roll50 = MSFT_data['Adj. Close'].rolling(50).mean()
roll10 = MSFT_data['Adj. Close'].rolling(10).mean()


roll200.plot(label = '200 Day Moving Average')
roll50.plot(label = '50 Day Moving Average')
roll100.plot(label = '100 Day Moving Average')
MSFT_data['Adj. Close'].plot(label = 'MSFT Closing Price', color = 'blue')
plt.legend(loc = 'upper left')

由于移动平均线应始终从最早的日期开始计算,因此我假设我缺少执行此操作的简单命令。

更新:建议将移动平均线作为原始数据框的一部分(假设它们与日期索引相关联),但结果相同:


MSFT_data['roll100'] = MSFT_data['Adj. Close'].rolling(100).mean()
MSFT_data['roll200'] = MSFT_data['Adj. Close'].rolling(200).mean()
MSFT_data['roll50'] = MSFT_data['Adj. Close'].rolling(50).mean()
MSFT_data['roll10'] = MSFT_data['Adj. Close'].rolling(10).mean()

#plot Microsoft Price along with moving averages

fig = plt.figure()
fig.set_figheight(8)
fig.set_figwidth(10)

MSFT_data['roll200'].plot(label = '200 Day Moving Average')
MSFT_data['roll50'].plot(label = '50 Day Moving Average')
MSFT_data['roll100'].plot(label = '100 Day Moving Average')
MSFT_data['Adj. Close'].plot(label = 'MSFT Closing Price', color = 'blue')
plt.legend(loc = 'upper left')

Graph

另外,如果我使用以下方法检查列:

MSFT_data['roll10'].head(12)

Date
2017-12-29       NaN
2017-12-28       NaN
2017-12-27       NaN
2017-12-26       NaN
2017-12-22       NaN
2017-12-21       NaN
2017-12-20       NaN
2017-12-19       NaN
2017-12-18       NaN
2017-12-15    85.796
2017-12-14    85.711
2017-12-13    85.674
Name: roll10, dtype: float64

我可以看到最近的9个值是NaN。相反,如果我创建一个新的数据框并尝试重新索引升序,则尾部的最后9个值为NaN。

2 个答案:

答案 0 :(得分:1)

我不确定这是否能为您提供帮助,但是如果我尝试重现此内容,则右边没有任何缝隙。我认为您的问题是您没有将MA添加到原始df中。这是我的代码

%matplotlib inline
import pandas as pd
import numpy as np
N = 400
dates = pd.date_range(start='2018-01-01', periods=N, freq="T")
df = pd.DataFrame({"Date":dates, "Adj. Close":np.random.rand(N)})
for ma in [10,50, 100,200]:
    df["MA{}".format(ma)] = df["Adj. Close"].rolling(ma).mean()

df.plot(x="Date").legend(bbox_to_anchor=(1, 1));

答案 1 :(得分:0)

I'm not sure this is 100% an answer but it had something to do with the data frame being created from most recent to least and then indexed. By resetting the index, sorting in ascending order, and re-indexing back to date I got it to work.

MSFT1 = MSFT_data.sort_index(ascending = True)
MSFT1 = MSFT1.reset_index()
MSFT1 = MSFT1.set_index('Date')