SciFi
SciFi личный блог
10 июня 2016, 03:33

Добавление и оценка влияния внешнего регрессора BRN6 в модель ARIMA для RIM6 на R

По мотивам поста Применение ARIMA для предсказания цены на RIM6 на R

Итак, я добавил в ARIMA для RIM6 внешний регрессор — цену на нефть BRN6. И проверил — действительно ли это улучшает модель. Теоретически, должно, так как цена на нефть должна опережать РТС. Сначала меняется мировой спрос на нефть — затем уже меняется спрос на рос. активы.

И действительно — это улучшило модель. Критерий AIC, характеризующий качество модели, уменьшился, несмотря на то, что 1 параметром в модели стало больше. Кроме этого, ошибки модели стали меньше. В усовершенствованной версии диапазон (-100, 100), а в простой — (-200, 200).  

Гистограммы остатков моделей

Добавление и оценка влияния внешнего регрессора BRN6 в модель ARIMA для RIM6 на R

Здесь на верхнем графике ошибки (остатки) модели с дополнительным регрессором 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}


6 Комментариев
  • speculair
    10 июня 2016, 05:10
    оч давно идея была:
    — берем n возможных предикторов (нефть, мировые индексы, eurusd, usdjpy, audjpy (тогда еще работало!:); ряд индикаторов долгового и межбанковского рынка и т.п.);
    — оцениваем текущее действие каждого на целевой параметр в каком-то окне (m последних баров) 
    — выбираем наиболее сильные
    — включаем их в auto AR модель (неважно какую из них, пофигу)
    — процесс повторяется постоянно

    данный вид наглого оверфиттинга кстати как ни странно работал но потом пришел кажется то ли 2006-й то ли 2007й г. с тотальным ростом emerging markets и какими-то местными процессами связанными сначала с либерализацией Газпрома, потом с РАО ЕЭС, в общем приток инвестиций, и все дело поломалось :) Потом еще раз поломалось убившись в какой-то момент волатильностью 2008-2009 г. выпуска :)
  • Для большого количества регрессоров нужны VAR/VECM модели, чтобы понимать, где хвост собакой виляет, а где собака — хвостом.
    • speculair
      10 июня 2016, 19:55
      Бобровский Дмитрий, идея была намного проще: из всех выбиралось 2-3 наиболее плотно связанных и все.
  • А что использовалось в качестве меры связи?
    • speculair
      11 июня 2016, 02:49
      Бобровский Дмитрий, просто чистый профит алгоритма, с неким примитивным учетом стабильности. тупо перебирались все возможные комбинации без повторений по 2,3,4,5 из примерно 15 регрессоров в качестве вводных для модели, каждый алгоритм прогонялся на 1000 последних 15 минутных баров в последовательных окнах по 100, 200, 500 баров, выкидывались модели превышающие заданный размер дродауна хотя бы единожды, и из оставшихся  выбиралась дающая на ближайшей истории наилучший профит (все это автоматически). Просто постоянный (ежедневный) тупой механический перебор и все. 
      • speculair, да, как вариант. Единственный минус — скорость. Представляю, какие вычислительные мощности у Вас были... 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн