По мотивам поста
Применение ARIMA для предсказания цены на RIM6 на R
Итак, я добавил в ARIMA для RIM6 внешний регрессор — цену на нефть BRN6. И проверил — действительно ли это улучшает модель. Теоретически, должно, так как цена на нефть должна опережать РТС. Сначала меняется мировой спрос на нефть — затем уже меняется спрос на рос. активы.
И действительно — это улучшило модель. Критерий AIC, характеризующий качество модели, уменьшился, несмотря на то, что 1 параметром в модели стало больше. Кроме этого, ошибки модели стали меньше. В усовершенствованной версии диапазон (-100, 100), а в простой — (-200, 200).
Гистограммы остатков моделей
Здесь на верхнем графике ошибки (остатки) модели с дополнительным регрессором fit.arima.reg, а на нижнем — обычной ARIMA fit.arima.
По всем параметрам модель с регрессором fit.arima.reg лучше.
В предсказаниях отклонение цены для модели с регрессором 79.6, а для обычной модели 109.6.
Характеристики моделей
> fit.arima
Series: cl.RIM6
ARIMA(0,1,0)
sigma^2 estimated as 12012: log likelihood=-984.25
AIC=1970.51 AICc=1970.53 BIC=1973.59
> fit.arima.reg
Series: cl.RIM6
ARIMA(0,1,0)
Coefficients:
BRN6.Close
1321.0798
s.e. 109.7654
sigma^2 estimated as 6337: log likelihood=-932.6
AIC=1869.19 AICc=1869.27 BIC=1875.36
Код на R
#install.packages("forecast")
#install.packages("tseries")
#install.packages("quantmod")
#install.packages("rusquant", repos="http://R-Forge.R-project.org")
# Установка пакетов. Она не требуется, если уже все установлено.
library(tseries)
library(quantmod)
library(rusquant)
library(forecast)
library(arfima)
# Подключение библиотек. ARFIMA и quantmod пока не используются.
tickers = c("RIM6", "BRN6")
getSymbols(tickers, src = "Finam", from = Sys.Date()-1, period = "5min")
# Получение данных
cl.RIM6 <- Cl(RIM6)
cl.BRN6 <- Cl(BRN6)
# Цены закрытия
print("Best ARIMA Model")
fit.arima <- auto.arima(cl.RIM6)
print(fit.arima)
# Лучшая простая модель
print("Best ARIMA Model with Externeous regressor")
fit.arima.reg <- auto.arima(cl.RIM6, xreg=cl.BRN6)
print(fit.arima.reg)
# Лучшая модель с дополнительным регрессором
residuals.arima <- residuals(fit.arima)
residuals.arima.reg <- residuals(fit.arima.reg)
# Ошибки (остатки) моделей
par(mfrow=c(2,1))
# Создаем график с 2 строками и 1 столбцом
hist(residuals.arima.reg, breaks=100, col = "green", border = "black")
hist(residuals.arima, breaks=100, col = "green", border = "black")
# Гистограммы
print(predict(fit.arima, n.ahead = 1))
# Предсказание простой модели
lastPredictorValue = cl.BRN6[length(cl.BRN6)]
print(predict(fit.arima.reg, newxreg=c(lastPredictorValue)))
print("last predictor value =")
print(lastPredictorValue)
# Предсказание модели с регрессором для след. момента времени при цене на нефть 51.82
Использованные источники
1.
Exogeneous regressors in auto.arima and using them in forecast function in R
2.
ARIMA and external regressors in SAS and R
3.
ARIMA models with regressors
4.
Arima {forecast}
— берем n возможных предикторов (нефть, мировые индексы, eurusd, usdjpy, audjpy (тогда еще работало!:); ряд индикаторов долгового и межбанковского рынка и т.п.);
— оцениваем текущее действие каждого на целевой параметр в каком-то окне (m последних баров)
— выбираем наиболее сильные
— включаем их в auto AR модель (неважно какую из них, пофигу)
— процесс повторяется постоянно
данный вид наглого оверфиттинга кстати как ни странно работал но потом пришел кажется то ли 2006-й то ли 2007й г. с тотальным ростом emerging markets и какими-то местными процессами связанными сначала с либерализацией Газпрома, потом с РАО ЕЭС, в общем приток инвестиций, и все дело поломалось :) Потом еще раз поломалось убившись в какой-то момент волатильностью 2008-2009 г. выпуска :)