为了账号安全,请及时绑定邮箱和手机立即绑定

移动平均线计算不正确

移动平均线计算不正确

波斯汪 2022-01-11 20:16:59
我正在使用从 Quandl 提取的数据对 Microsoft 股票进行时间序列分析。我想根据移动平均线绘制收盘价。当我绘制移动平均线时,它们不会一直到图表的右侧。我认为有差距是有道理的(例如 200 日移动平均线要到 200 日才能开始),但我担心差距在右侧。这意味着它从最近的日期开始(这是有道理的,因为最近的日期是时间序列中的第一个),这显然不是正确的方法。我可以反转系列(新数据框升序而不是降序),但我相信它也会从最近的日期开始绘制图表,这显然是不可接受的。#calculate moving averages for Microsoftroll100 = 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 averagesfig = 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)Date2017-12-29       NaN2017-12-28       NaN2017-12-27       NaN2017-12-26       NaN2017-12-22       NaN2017-12-21       NaN2017-12-20       NaN2017-12-19       NaN2017-12-18       NaN2017-12-15    85.7962017-12-14    85.7112017-12-13    85.674Name: roll10, dtype: float64我可以看到最近的 9 个值是 NaN。相反,如果我创建一个新数据框并尝试重新索引升序,我在尾部的最后 9 个值是 NaN。
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

我不确定这是否可以帮助您,但是如果我尝试重现此内容,则右侧没有任何间隙。我认为您的问题是您没有将 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));


查看完整回答
反对 回复 2022-01-11
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


MSFT1 = MSFT_data.sort_index(ascending = True)

MSFT1 = MSFT1.reset_index()

MSFT1 = MSFT1.set_index('Date')


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信