stats模型预测

2024-04-28 04:13:46 发布

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

我有一个包含5年时间序列的.csv文件,每小时分辨率(商品价格)。根据历史数据,我想建立一个第六年的价格预测。

我在www上读过几篇关于这类过程的文章,我的代码基本上是基于发布在那里的代码,因为我在Python(特别是statsmodels)和statistic方面的知识最多是有限的。

这些是链接,对于那些感兴趣的人:

http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/

http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/

首先,这里是.csv文件的一个示例。数据是以月分辨率显示的。在这种情况下,它不是真实的数据,只需随机选择数字来给出一个例子(在这种情况下,我希望一年足以为第二年制定一个预测;如果不是,则提供完整的csv文件):

              Price
2011-01-31    32.21
2011-02-28    28.32
2011-03-31    27.12
2011-04-30    29.56
2011-05-31    31.98
2011-06-30    26.25
2011-07-31    24.75
2011-08-31    25.56
2011-09-30    26.68
2011-10-31    29.12
2011-11-30    33.87
2011-12-31    35.45

我目前的进展如下:

在读取输入文件并将date列设置为datetime索引之后,使用以下脚本为可用数据开发一个预测

model = sm.tsa.ARIMA(df['Price'].iloc[1:], order=(1, 0, 0))  
results = model.fit(disp=-1)  
df['Forecast'] = results.fittedvalues  
df[['Price', 'Forecast']].plot(figsize=(16, 12))  

,它提供以下输出:

5-year timeseries, hourly resolution data

现在,正如我所说,我没有统计技能,我几乎不知道我如何得到这个输出(基本上,更改第一行中的order属性会更改输出),但“实际”预测看起来相当不错,我想再延长一年(2016年)。

为此,将在数据帧中创建其他行,如下所示:

start = datetime.datetime.strptime("2016-01-01", "%Y-%m-%d")
date_list = pd.date_range('2016-01-01', freq='1D', periods=366)
future = pd.DataFrame(index=date_list, columns= df.columns)
data = pd.concat([df, future])

最后,当我使用statsmodels的.predict函数时:

data['Forecast'] = results.predict(start = 1825, end = 2192, dynamic= True)  
data[['Price', 'Forecast']].plot(figsize=(12, 8))

我得到的预测是一条直线(见下文),它看起来一点也不像预测。此外,如果我将范围(现在是1825到2192天(2016年))扩展到整个6年时间跨度,则预测线是整个期间(2011-2016年)的直线。

我也尝试过使用'statsmodels.tsa.statespace.sarimax.sarimax.predict'方法,该方法解释了季节性变化(在本例中这是有意义的),但是我得到了一些关于'module'没有'sarimax'属性的错误。但这是第二个问题,如果需要的话会更详细。

forecast output

在某个地方我失去了控制,我不知道在哪里。谢谢你的阅读。干杯!


Tags: 文件csv数据dfdatadatetimedatemodel
2条回答

ARIMA(1,0,0)是一个单周期自回归模型。所以这个模型遵循这个公式:

enter image description here

这意味着时间段t中的值等于某个常数(phi_0)加上通过拟合ARMA模型(phi_1)确定的值乘以前一个时间段r_(t-1)中的值,再加上白噪声误差项(a_t)。

您的模型只有1个周期的内存,因此当前预测完全由前一个周期的1值决定。它不是一个非常复杂的模型;它没有对所有先前的值做任何花哨的事情。它只是取昨天的价格,乘以某个值,再加上一个常数。你应该期望它很快达到平衡,然后永远保持在那里。

顶部图片中的预测看起来如此之好的原因是它只是向您显示了数百个一个周期的预测,这些预测在每个新的周期开始时都是新的。它并不像你想象的那样显示出一个长期的预测。

查看您发送的链接:

http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/

阅读他讨论的部分,为什么这个模型没有给你想要的东西。

“所以乍一看,这款车型的表现似乎相当不错。但是,尽管看起来这些预测非常接近(毕竟这些线几乎无法区分),请记住,我们使用的是无差异序列!该指数相对于总绝对值的每日波动率很小。我们真正想要的是预测第一个差异,或者说是每天的变化。我们可以使用差分级数重新运行模型,或者在ARIMA模型中添加一个“I”项(产生一个(1,1,0)模型),它应该完成相同的任务。让我们尝试使用差分级数。”

要做你想做的事情,你需要对这些模型做更多的研究,找出如何格式化你的数据,以及什么模型是合适的。最重要的是知道你相信哪些信息包含在你输入到模型中的数据中。你的模型目前正在尝试做的是说,“今天的价格是45美元。明天的价格是多少?”就这样。它没有任何关于动量、波动性等的信息,这是不太可能的。

听起来您使用的是不支持SARIMAX的旧版本statsmodels。您需要安装最新发布的版本0.8.0请参见http://statsmodels.sourceforge.net/devel/install.html

我用的是水蟒,是通过pip安装的。

pip install -U statsmodels

SARIMAX模型的results类有许多有用的方法,包括forecast。

data['Forecast'] = results.forecast(100)

将使用您的模型预测未来的100步。

相关问题 更多 >