Почему моя модель ARMA не может предсказать набор данных? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь разработать модель ARMA для прогнозирования SPX. Я перепробовал все, я прочитал много информации во многих местах, чтобы иметь возможность придумать свой код, но по какой-то причине мой код не работает. Кто-нибудь знает, что я делаю не так? Мои прогнозы не совсем точны.

from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
from numpy import log
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error
import itertools as itt

spxf = pd.read_csv('SPX.csv', index_col = 0)
spxf.index = pd.to_datetime(spxf.index, format= '%d/%m/%Y')
spxf

    Last Price
Date    
2020-03-17  2403.16
2020-02-28  2954.22
2020-01-31  3225.52
2019-12-31  3230.78
2019-11-29  3140.98
... ...
2014-04-30  1883.95
2014-03-31  1872.34
2014-02-28  1859.45
2014-01-31  1782.59
2013-12-31  1848.36

Затем я понял, что мои данные не являются стационарными, и попытался сделать их стационарными.

spxfd = spxf.diff(periods=1)
spxfd = spxfd[1:]
spxfd.plot()
spxf.plot()

Стационарные данные

Необработанные данные

sm.graphics.tsa.plot_acf(spxf, lags=12)
plt.xlabel('# Lags')
plt.show()

sm.graphics.tsa.plot_acf(spxfd, lags=12)
plt.xlabel('# Lags')
plt.title('Autocorrelation Stationary')
plt.show()

sm.graphics.tsa.plot_pacf(spxf, lags=12)
plt.xlabel('# Lags')
plt.show()

sm.graphics.tsa.plot_pacf(spxfd, lags=12)
plt.xlabel('# Lags')
plt.title('Partial Autocorrelation Stationary')
plt.show()

Автокорреляция необработанных данных

Автокорреляция стационарных данных

Частичные необработанные данные Автокорреляция

Частичная автокорреляция стационарных данных

Затем я разбил свой набор данных на набор данных поезда и набор тестовых данных с последними 15 наблюдениями в качестве теста.

data_train = spxfd.values[15:]
data_test = spxfd.values[0:15]
data_test

array([[ 551.06],
       [ 271.3 ],
       [   5.26],
       [ -89.8 ],
       [-103.42],
       [ -60.82],
       [ -50.28],
       [  53.92],
       [ -38.62],
       [-189.7 ],
       [ 193.77],
       [-111.43],
       [ -49.91],
       [ -80.39],
       [-197.25]])
In [392]:
data_train

array([[ 253.32],
       [ -48.43],
       [ 202.24],
       [ -12.46],
       [ -85.23],
       [ -97.92],
       [ -13.1 ],
       [ -57.22],
       [  -7.18],
       [  72.96],
       [ 109.98],
       [-150.2 ],
       [ -26.03],
       [ -72.32],
       [ -55.9 ],
       [ -47.71],
       [  -1.35],
       [ -46.89],
       [ -11.61],
       [ -27.6 ],
       [ -21.48],
       [   0.92],
       [ -84.77],
       [ -40.04],
       [ -40.02],
       [ -72.66],
       [  42.12],
       [   2.68],
       [   2.65],
       [ -74.74],
       [  -1.9 ],
       [ -31.66],
       [  -5.56],
       [-127.51],
       [   8.01],
       [ 103.7 ],
       [  36.47],
       [  -1.05],
       [-159.33],
       [  52.15],
       [ 131.66],
       [ -40.73],
       [  44.28],
       [ -21.88],
       [ -17.62],
       [  36.61],
       [-109.51],
       [  63.91],
       [   8.66],
       [ -49.51],
       [ -45.76],
       [  31.08],
       [ -72.7 ],
       [  29.56],
       [ -36.66],
       [ -39.62],
       [ -11.61],
       [ -12.89],
       [ -76.86],
       [  65.77]])
ARMA_model = ARIMA(data_train, order = (12,0,2))
ARMA_model_fit = ARMA_model.fit()
predictions = ARMA_model_fit.forecast(steps = 15)[0]

plt.plot(data_test)
plt.plot(predictions, color = 'g')

Результат

Синяя линия - это реальные тестовые данные, а зеленая линия - прогнозы. Что я сделал не так, что это так неточно? Я пробовал разные заказы, но ничего не работает.

Я действительно надеюсь, что один из вас сможет пролить свет на эту проблему.

Заранее спасибо!

...