移动平均线计算不正确

Posted

技术标签:

【中文标题】移动平均线计算不正确【英文标题】:Moving average not calculating properly 【发布时间】:2019-09-06 20:21:24 【问题描述】:

我正在使用从 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')

另外,如果我检查该列,例如:

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。

【问题讨论】:

在我看来,您实际上并没有在绘制 MAs @rpanai 我希望从 Jupyter 笔记本中剪切和粘贴输出更容易,但我可以向您保证它们在那里。前 4 行代码计算它们,然后 .plot 命令绘制它们。为什么你会认为他们没有被策划? 真的很奇怪。你有日期作为索引吗?您为什么不按照我的回答中的建议尝试绘制MSFT_data.plot().legend(loc = 'upper left') 有更多的列,所以我使用了这个MSFT_data[['roll200', 'roll50', 'Adj. Close']].plot().legend(loc = 'upper left'),但结果相同。 您介意显示MSFT_data.head()吗? 【参考方案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));

【讨论】:

【参考方案2】:

我不确定这是 100% 的答案,但它与从最近到最少创建然后编入索引的数据框有关。通过重置索引,按升序排序,并重新索引到日期,我让它工作了。

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

【讨论】:

以上是关于移动平均线计算不正确的主要内容,如果未能解决你的问题,请参考以下文章

计算移动平均线 MySQL?

PySpark:计算指数移动平均线

计算移动平均线

在 C++ 中计算移动平均线

在python中计算指数移动平均线

计算时间加权移动平均线