Моделирование аримы вне выборки, установленное statsmodel - PullRequest
0 голосов
/ 05 мая 2019

Вопрос

Моя цель состояла в том, чтобы смоделировать несколько сценариев суточной температуры определенного места (скажем, Токио) в будущем и наблюдать за динамикой.Для этого я попытался 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 Версия Statsmodel: 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 голосов
/ 05 мая 2019

Я нашел 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 дня. Обернув логику и отобразив ее несколько раз, я мог наблюдать динамику.

...