我试图测试ARMA模型,并完成此处提供的示例:
http://www.statsmodels.org/dev/examples/notebooks/generated/tsa_arma_0.html
我无法判断是否有一种简单的方法可以在训练数据集上训练模型,然后在测试数据集上进行测试。在我看来,你必须在整个数据集上拟合模型。然后,您可以进行样本内预测,使用与训练模型相同的数据集。或者您可以进行样本预测,但必须从训练数据集的末尾开始。我想要做的是将模型拟合到训练数据集上,然后在完全不同的数据集上运行模型,该数据集不是训练数据集的一部分,并且获得一系列提前一步的预测。
为了说明这个问题,这里是上面链接的缩写代码。您可以看到该模型适合1700-2008的数据,然后预测1990-2012。我遇到的问题是,1990-2008已经是用于拟合模型的数据的一部分,所以我认为我在预测和训练相同的数据。我希望能够获得一系列不具有前瞻性偏见的一步预测。
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
dta = sm.datasets.sunspots.load_pandas().data
dta.index = pandas.Index(sm.tsa.datetools.dates_from_range('1700', '2008'))
dta = dta.drop('YEAR',1)
arma_mod30 = sm.tsa.ARMA(dta, (3, 0)).fit(disp=False)
predict_sunspots = arma_mod30.predict('1990', '2012', dynamic=True)
fig, ax = plt.subplots(figsize=(12, 8))
ax = dta.ix['1950':].plot(ax=ax)
fig = arma_mod30.plot_predict('1990', '2012', dynamic=True, ax=ax, plot_insample=False)
plt.show()
答案 0 :(得分:1)
问了这个问题以来的16个月里,我了解了更多关于statsmodels中的ARIMA建模的知识,并且我认为ARMA或ARIMA模型不支持我要查找的行为,但是在SARIMAX模型中受支持。基于statsmodels.org的示例,请参见以下代码。绿线表示从1700-1990年开始训练的ARIMA(10,0,0)模型(或AR(10))模型,然后从1990-2012年进行动态预测。
https://www.statsmodels.org/dev/examples/notebooks/generated/statespace_sarimax_stata.html
import pandas
import matplotlib.pyplot as plt
import statsmodels.api as sm
dta = sm.datasets.sunspots.load_pandas().data
dta.index = pandas.Index(sm.tsa.datetools.dates_from_range('1700', '2008'))
dta = dta.drop('YEAR', 1)
arma_mod30 = sm.tsa.ARMA(dta, (3, 0)).fit(disp=False)
predict_sunspots = arma_mod30.predict('1990', '2012', dynamic=True)
fig, ax = plt.subplots(figsize=(12, 8))
ax = dta.ix['1950':].plot(ax=ax)
fig = arma_mod30.plot_predict('1990', '2012', dynamic=True, ax=ax, plot_insample=False)
# Fit the model
mod = sm.tsa.statespace.SARIMAX(dta.loc[:'1990'], order=(10, 0, 0))
fit_res = mod.fit(disp=False)
# Create new model, but instead of fit, copy the params from the first model
mod = sm.tsa.statespace.SARIMAX(dta, order=(10, 0, 0))
res = mod.filter(fit_res.params)
# Dynamic predictions
predict_dy = res.get_prediction(dynamic='1990', end='2012')
predict_dy = predict_dy.predicted_mean
predict_dy['1990':].plot(ax=ax)
plt.show()
答案 1 :(得分:0)
您可以将数据切成两个数据集。例如,使训练数据直到去年1月1日为止都是原始数据的一部分,而使测试数据从去年1月到年底一直为原始数据的一部分。然后,根据拟合模型预测测试集的长度。