Я пытаюсь разработать модель 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')
Результат
Синяя линия - это реальные тестовые данные, а зеленая линия - прогнозы. Что я сделал не так, что это так неточно? Я пробовал разные заказы, но ничего не работает.
Я действительно надеюсь, что один из вас сможет пролить свет на эту проблему.
Заранее спасибо!