Как получить интервалы прогнозирования с помощью моделей временных рядов statsmodels? - PullRequest
0 голосов
/ 17 февраля 2019

Существует ли API statsmodels для получения интервалов прогнозирования из моделей временных рядов statsmodels?

В настоящее время я вручную рассчитываю интервалы прогнозирования, используя:

enter image description here

Вот мой код.Сначала получите образцы данных ...

! python -c 'import datapackage' || pip install datapackage

%matplotlib inline

import datapackage

from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.api import SimpleExpSmoothing
import statsmodels.api as sm
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def get_data():
    # data licensed for non-commercial use only - https://datahub.io/core/bond-yields-uk-10y
    data_url = 'https://datahub.io/core/bond-yields-uk-10y/datapackage.json'

    resources = datapackage.Package(data_url).resources

    quarterly_csv_url = [pkg for pkg in resources if pkg.name == 'quarterly_csv'][0].descriptor['path']
    data = pd.read_csv(quarterly_csv_url)
    data = data.set_index('Date', drop=True).asfreq('Q')
    return data

Затем создайте прогноз и рассчитайте интервалы:

data = get_data()
data = data[ data.index > '2005/']

fit = SimpleExpSmoothing(data).fit()
fcast = fit.forecast(1).rename('Forecast')
xhat = fcast.get_values()[0]

z = 1.96
sse = fit.sse
predint_xminus = xhat - z * np.sqrt(sse/len(data))
predint_xplus  = xhat + z * np.sqrt(sse/len(data))

Постройте интервалы ...

plt.rcParams["figure.figsize"] = (20,5)

ax = data.plot(legend=True, title='British Goverment Bonds - 10y')
ax.set_xlabel('yield')

#
# 1-Step Prediction
#
prediction = pd.DataFrame( 
    data  = [ data.values[-1][0],  xhat ], 
    index = [ data.index[-1],      data.index[-1] + 1 ],
    columns = ['1-Step Predicted Rate']
)
_ = prediction.plot(ax=ax, color='black')

#
# upper 95% prediction interval
#
upper_pi_data = pd.DataFrame( 
    data  = [ xhat,           predint_xplus ], 
    index = [ data.index[-1], data.index[-1] + 1 ]
)
_ = upper_pi_data.plot(ax=ax, color='green', legend=False) 

#
# lower 95% prediction interval
#
lower_pi_data = pd.DataFrame( 
    data  = [ xhat,           predint_xminus ], 
    index = [ data.index[-1], data.index[-1] + 1 ]
)
_ = lower_pi_data.plot(ax=ax, color='green', legend=False) 

enter image description here

Я нашел похожие вопросы, но не для моделей временных рядов:

1 Ответ

0 голосов
/ 18 февраля 2019

Пока вы проверяете предположение, что невязки не коррелированы, и вы не идете дальше, чем на шаг вперед, я думаю, что ваш интервал прогнозирования действителен.Примечание: я бы использовал стандартное отклонение от остатков.См. Раздел 3.5 в Принципы и практика прогнозирования .

Я уверен, что нам нужно поместить модель, которую мы используем, в форму пространства состояний в соответствии с Принципами и практикой прогнозирования для многоэтапного прогнозирования.интервалы.См. Главу 7.5 по экспоненциальному сглаживанию. Моделирование пространства состояний для локального линейного тренда в statsmodels предоставляет рабочий пример.Не похоже, что есть что-то из коробки, чтобы произвести эти интервалы в statsmodels.Я лично решил использовать R для получения интервалов прогнозирования, поскольку пакет прогнозирования предоставляет их без особых дополнительных усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...