statsmodel拟合的Arima模型的样本外仿真

时间:2019-05-05 04:06:53

标签: python time-series arima

问题

我的目的是模拟未来某个特定位置(例如东京)的每日温度的多种情况,并观察动态。 为此,我在删除原始数据的趋势和季节性之后尝试了 statsmodels.tsa.arima_model.ARMAResults.forecast 函数,通过KPSS测试和ADF测试确认了剩余数据的平稳性,并搜索了正确的顺序。 ARMA模型,通过 statsmodels.tsa.arima_model.ARIMA.fit(method ='mle',trend ='nc')对该模型进行了拟合。 但是,结果不是我想要的。预测的每日温度为单一温度,因此很快收敛到零(即[0.04579973,-0.35632123、0.27349546,-0.14268638,-0.01815464,          0.06129577,-0.01736912,-0.03543152、0.04223661,-0.01285459,         -0.01444013、0.01744708,-0.00351766,-0.0083289、0.00844778 ....]),尽管它为我提供了机密间隔信息。 有人会告诉我如何模拟温度闪烁的发展吗?

环境

Python版本:3.6.7 统计模型版本:0.9.0 环境:Google Colab

代码

下面的

TS是已除去趋势和季节性的时间序列数据(pd.Series)。 ADF / KPSS测试已经确认了平稳性。

print(sm.tsa.arma_order_select_ic(TS, ic='aic', trend='nc'))
#(4, 1)
arima_mdl = smt.ARIMA(TS, order=(4,0,1)).fit(method='mle', trend='nc')
arima_mdl.summary()

#                        coef  std err     z    P>|z|  [0.025   0.975]
#ar.L1.residual_base    1.4031  0.013   104.805 0.000   1.377   1.429
#ar.L2.residual_base    -0.4380 0.017   -25.640 0.000   -0.471  -0.405
#ar.L3.residual_base    0.0433  0.017   2.621   0.009   0.011   0.076
#ar.L4.residual_base    -0.0243 0.010   -2.375  0.018   -0.044  -0.004
#ma.L1.residual_base    -0.9187 0.009   -98.722 0.000   -0.937  -0.900
#Roots
#        Real   Imaginary   Modulus Frequency
#AR.1   1.0290  -0.0000j    1.0290  -0.0000
#AR.2   2.0195  -0.0000j    2.0195  -0.0000
#AR.3   -0.6329 -4.4078j    4.4530  -0.2727
#AR.4   -0.6329 +4.4078j    4.4530  0.2727
#MA.1   1.0885  +0.0000j    1.0885  0.0000


以及下面的预测代码:

arima_mdl.forecast(steps=200,alpha=0.05)
#array([-8.56316155e-01, -4.25869289e-01, -2.84155971e-01, -2.06066070e-01, -1.62323717e-01, -1.39464719e-01, -1.26609792e-01, -1.18587231e-01,-1.13033412e-01, -1.08753068e-01, -1.05144590e-01, -1.01910598e-01,-9.89029729e-02, -9.60471132e-02, -9.33049505e-02, -9.06565532e-02,-8.80909949e-02, -8.56018380e-02, -8.31848964e-02, -8.08371274e-02,...

1 个答案:

答案 0 :(得分:0)

我发现 sm.tsa.arma_generate_sample 功能可以帮助我完成以下操作。

arparams = np.array([1.4031,-0.4380,0.0433,-0.0243])
maparams = np.array([-0.9187])
ar = np.r_[1, -arparams] # add zero-lag and negate
ma = np.r_[1, maparams] # add zero-lag
arimasim = sm.tsa.arma_generate_sample(ar, ma, 3)
arimasim

上面的代码生成了3天的单个场景。 通过包装逻辑并将其映射几次,我可以观察动态。