移动平均线计算不正确

2024-09-30 16:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Quandl提供的数据对微软股票进行时间序列分析。我想画出收盘价和移动平均线的对比图。当我绘制移动平均线时,它们不会一直到图的右侧。你知道吗

我相信有一个差距是有道理的(例如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。你知道吗


Tags: closedataplotnanmeanlabelaverageday
2条回答

我不确定这是否可以帮助你,但如果我试图复制这个,我没有任何差距的权利。我认为您的问题是没有将MAs添加到原始的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));

我不确定这是否是100%的答案,但它与从最新到最新创建的数据帧,然后索引有关。通过重置索引,按升序排序,然后重新索引到最新的位置,我使它开始工作。你知道吗

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

相关问题 更多 >