2016-08-02 3 views
3

У меня есть файл .csv, содержащий 5-летние временные ряды, с почасовым разрешением (товарная цена). Исходя из исторических данных, я хочу создать прогноз цен на 6-й год.Прогнозирование с помощью статистических моделей

Я прочитал несколько статей на www об этих типах процедур, и в основном я основывал свой код на коде, размещенном там, поскольку мои знания как в Python (особенно в статистических моделях), так и в статистике наиболее ограничены.

Те ссылки, для тех, кто интересуется:

http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/

http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/

Прежде всего, здесь приведен пример файла .csv. В этом случае данные отображаются с ежемесячным разрешением, это не реальные данные, просто случайным образом выбирают числа, чтобы привести пример здесь (в этом случае я надеюсь, что один год достаточно, чтобы иметь возможность разработать прогноз на 2-й год, а если нет, полный файл CSV доступен):

   Price 
2011-01-31 32.21 
2011-02-28 28.32 
2011-03-31 27.12 
2011-04-30 29.56 
2011-05-31 31.98 
2011-06-30 26.25 
2011-07-31 24.75 
2011-08-31 25.56 
2011-09-30 26.68 
2011-10-31 29.12 
2011-11-30 33.87 
2011-12-31 35.45 

Мой текущий прогресс заключается в следующем:

После прочтения входного файла и установив столбец даты в качестве индекса даты и времени, то follwing сценарий был использован для разработки прогноза для имеющиеся данные

model = sm.tsa.ARIMA(df['Price'].iloc[1:], order=(1, 0, 0)) 
results = model.fit(disp=-1) 
df['Forecast'] = results.fittedvalues 
df[['Price', 'Forecast']].plot(figsize=(16, 12)) 

, wh ич дает следующий результат:

5-year timeseries, hourly resolution data

Теперь, как я уже сказал, я не получил ни одного статистических навыков, и я практически не имею идей, как я попал на этот вывод (в основном, изменение атрибутов порядка внутри первая строка меняет результат), но «фактический» прогноз выглядит неплохо, и я хотел бы продлить его еще на один год (2016 год).

Для того, чтобы сделать это, дополнительные строки создаются в dataframe, следующим образом:

start = datetime.datetime.strptime("2016-01-01", "%Y-%m-%d") 
date_list = pd.date_range('2016-01-01', freq='1D', periods=366) 
future = pd.DataFrame(index=date_list, columns= df.columns) 
data = pd.concat([df, future]) 

Наконец, когда я использую функцию .predict из statsmodels:

data['Forecast'] = results.predict(start = 1825, end = 2192, dynamic= True) 
data[['Price', 'Forecast']].plot(figsize=(12, 8)) 

что я получаю поскольку прогноз - это прямая линия (см. ниже), которая не кажется совсем не прогнозом. Более того, если я продлю диапазон, который теперь с 1825 года по 2192-й день (2016 год), на протяжении всего 6-летнего промежутка времени, линия прогноза является прямой линией на весь период (2011-2016 годы).

Я также попытался использовать метод statsmodels.tsa.statespace.sarimax.SARIMAX.predict, который учитывает сезонные изменения (что имеет смысл в этом случае), но я получаю некоторую ошибку в отношении «модуля», не имеет атрибута «SARIMAX». Но это второстепенная проблема, при необходимости, в деталях.

forecast output

Где-то я теряю хватку, и я понятия не имею, где. Спасибо за прочтение. Ура!

+0

У меня есть аналогичная проблема. Могли ли вы это решить? Спасибо – kthouz

+0

нет, я не решил. Я бросил его в какой-то момент из-за некоторого перерыва в моей работе и никогда не возвращался к этому. – davidr

ответ

3

Похоже, вы используете старую версию статистических моделей, которая не поддерживает SARIMAX. Вы захотите установить последнюю выпущенную версию 0.8.0, см. http://statsmodels.sourceforge.net/devel/install.html.

Я использую Anaconda и устанавливаю через pip.

pip install -U statsmodels 

Класс результатов из модели SARIMAX содержит ряд полезных методов, включая прогноз.

data['Forecast'] = results.forecast(100) 

Будет использовать вашу модель для прогнозирования 100 шагов в будущее.

+1

, если вы хотите прогнозировать выборку, и у вас есть экзогенные переменные, вы должны сначала предоставить прогнозы этих (которые вы можете не иметь). – fccoelho

+0

Крик от Джеффа Д и ФКоэльхо. Язык в документации был путаным. Увидев это, наконец, это имело смысл. – JJFord3

1

ARIMA (1,0,0) - однорежимная авторегрессионная модель. Таким образом, это модель, которая следует за этой формулой:

enter image description here

Что это означает, что значение в период времени Т равна некоторой постоянной (phi_0) плюс величина, определяемая путем подгонки модели ARMA (phi_1), умноженной по значению за предыдущий период r_ (t-1) плюс коэффициент ошибки белого шума (a_t).

Ваша модель имеет только память в 1 период, поэтому текущее предсказание полностью определяется значением 1 предыдущего периода. Это не очень сложная модель; это не делает ничего интересного со всеми предыдущими значениями. Он просто берет вчерашнюю цену, умножая ее на какую-то ценность и добавляя константу. Вы должны ожидать, что он быстро перейдет в равновесие, а затем останется там навсегда.

Причина, по которой прогноз в верхней картине выглядит так хорошо, заключается в том, что он просто показывает вам сотни 1-месячных прогнозов, которые начинаются с каждого нового периода. Это не показывает предсказание на длительный период, как вы, наверное, думаете.

Глядя на ссылке, которую вы послали:

http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/

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

«На первый взгляд кажется, что эта модель работает очень хорошо. Но хотя кажется, что прогнозы действительно близки (линии почти неразличимы в конце концов), помните, что мы использовали серию разрозненных! индекс только колеблется в малом проценте изо дня в день относительно общей абсолютной величины. Мы действительно хотим предсказать первую разницу или повседневные движения. Мы можем либо повторно запустить модель, используя разную серию , или добавить термин «I» в модель ARIMA (в результате получается модель (1, 1, 0)), которая должна выполнить одно и то же. Попробуем использовать разную серию ».

Чтобы сделать то, что вы пытаетесь сделать, вам нужно будет сделать больше исследований в этих моделях и выяснить, как отформатировать ваши данные и какая модель будет уместна. Самое главное - знать, какая информация, по вашему мнению, содержится в данных, которые вы вводите в модель. То, что ваша модель в настоящее время пытается сделать, это сказать: «Сегодня цена составляет 45 долларов. Какова будет цена завтра?» Вот и все. У него нет никакой информации о импульсе, волатильности и т. Д. Это не так много, чтобы уйти.

Смежные вопросы