Я хотел бы знать "параметр SARIMA (statsmodels)" [порядок] и [сезонная_заказ].как мне выбрать? - PullRequest
1 голос
/ 11 июля 2019

мои данные (time-seriese) содержат данные за два года. (Значение / день, строка = 360 * 2)

Теперь я пытаюсь использовать модель SARIMA из statsmodels. Я выбрал параметр (порядок и сезонный порядок) случайно. заказ = (1,0,1), сезонный порядок = (0,1,0,360) Это было очень подходит для моих данных.

но я не понял по существу. как выбрать параметр (p, d, q)? порядок = (P, D, Q), сезонный порядок = (p, d, q, s = 360?) могу ли я прочитать это из рис ACF или PACF? или AIC, BIC из резюме?

(я пытался выбрать его из «модели наименьшей AIC», но она не сработала)


import statsmodels.api as sm
SARIMA_1_0_1_010 = sm.tsa.SARIMAX(t3, order=(1,0,1), seasonal_order=(0,1,0,300)).fit()
print(SARIMA_1_0_1_010.summary())

residSARIMA = SARIMA_1_0_1_010.resid
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(residSARIMA.values.squeeze(), lags=100, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(residSARIMA, lags=100, ax=ax2)


pred = SARIMA_1_0_1_010.predict(700, 1200)
plt.figure(figsize=(22,10))
plt.plot(t3)
plt.plot(pred, "r")


и


max_p = 3
max_q = 3
max_d = 1
max_sp = 0
max_sq = 0
max_sd = 0

pattern = max_p*(max_q + 1)*(max_d + 1)*(max_sp + 1)*(max_sq + 1)*(max_sd + 1)
modelSelection = pd.DataFrame(index=range(pattern), columns=["model", "aic"])

season = 360

num = 0

for p in range(1, max_p + 1):
    for d in range(0, max_d + 1):
        for q in range(0, max_q + 1):
            for sp in range(0, max_sp + 1):
                for sd in range(0, max_sd + 1):
                    for sq in range(0, max_sq + 1):
                        sarima = sm.tsa.SARIMAX(
                            t3, order=(p,d,q), 
                            seasonal_order=(sp,sd,sq,360), 
                            enforce_stationarity = False, 
                            enforce_invertibility = False
                        ).fit()
                        modelSelection.ix[num]["model"] = "order=(" + str(p) + ","+ str(d) + ","+ str(q) + "), season=("+ str(sp) + ","+ str(sd) + "," + str(sq) + ")"
                        modelSelection.ix[num]["aic"] = sarima.aic
                        modelSelection.ix[num]["bic"] = sarima.bic

                        num = num + 1

modelSelection[modelSelection.aic == min(modelSelection.aic)]

Это плохо предсказывалось ....

1 Ответ

0 голосов
/ 11 июля 2019

Основная проблема здесь в том, что SARIMAX не очень хорошая модель для использования, когда сезонный эффект очень длинный (см., Например, https://stats.stackexchange.com/questions/117953/very-high-frequency-time-series-analysis-seconds-and-forecasting-python-r/118050#118050).

В целом, выбор порядка модели (например, p, q и P, Q) с помощью информационных критериев является хорошей идеей, но не стоит выбирать таким образом порядок разности (d или D).

Пакет python, который может помочь автоматизировать выбор модели при использовании модели SARIMAX: https://github.com/tgsmith61591/pmdarima.

Однако я должен повторить, что это обычно не будет хорошо работать для моделей с продолжительностью сезона 360.

...