Thursday, September 1, 2011

И снова о коинтеграции временных рядов

В недавнем посте про сравнение временных рядов я начал рассказ о таком явлении, как коинтеграция. Настал день продолжить этот рассказ. Прежде всего, стоит все-таки определить, что такое коинтеграция. Существует точное математическое определение коинтеграции:
Если некоторая линейная комбинация двух временных рядов имеет порядок интегрирования меньший чем порядок интегрирования каждого из рядов, то говорят, что временные ряды коинтегрированы.

На мой взгляд, определение в таком виде тяжеловато для осмысления, а кроме того, оно является слишком общим для большинства практических задач. Разберем определение по частям, но для начала, немного теории.

Что такое стационарный временной ряд? Если совсем просто, то это временной ряд свойства которого не меняются во времени. Т.е. если мы возьмем некий его отрезок, посчитаем стандартные статистические характеристики, такие как математическое ожидание или дисперсию, мы должны получить одинаковые величины, в пределах погрешности, естественно.

Рассмотрим пример на языке программирования R:
data <- rnorm(50)
plot(data, type='l')
Стационарный временной ряд имеет порядок интегрирования 0. Обратное не верно, но нам не очень то и нужно. Возьмем теперь стационарный ряд X1, X2... Xn, и преобразуем его в следующий ряд: Y1 = X1, Y2 = Y1 + X2, ... Yn = Yn-1 + Xn получившийся ряд имеет порядок интегрирования 1. Если вернуться к определению, то временной ряд имеет порядок интегрирования 1 если ряд его приращений имеет порядок интегрирования 0. Аналогично можно определить более высокие порядки интегрирования. Рассмотрим пример ряда, интегрированого с порядком 1:
data <- cumsum(rnorm(100))
plot(data, type='l')
Классическое случайное блуждание как раз является примером такого ряда. В некотором приближении, цены на акции тоже можно считать примером временного ряда с порядком интегрирования 1. Теперь мы можем переформулировать определение коинтеграции в применении для цен. Два временных ряда цен коинтегрированы если мы можем найти такую их линейную комбинацию, которая является стационарным временным рядом. Классическим примером коинтеграции является соотношение цен на золото GLD и индекс акций золотодобывающих компаний GDX. Оба доступны на yahoo.finance.com для скачивания, но мы воспользуемся R чтобы упростить себе жизнь
library(tseries)
library(quantmod)

#сначала скачаем данные
from <- "2006-05-23"
to <- "2008-07-23"
getSymbols("GLD", from=from, to=to)
getSymbols("GDX", from=from, to=to)

#Очень важный момент в исследованиях на коинтеграцию, выплаты дивидендов, ребалансировки индекса все должно быть учетно. В случае GLD все просто, золото оно и есть золото. В случае GDX следует взять adjusted данные.
data <- cbind(Cl(GLD), GDX$GDX.Adjusted)
data <- data[complete.cases(data)]

names(data) <- c("GLD", "GDX")

#проводим линейную регрессию для определения правильного соотношения
model <- lm(GLD~GDX+0, data)

#вычисляем разницу цен (спред)
spread <- data$GLD - coef(model)[1]*data$GDX

#проводим тест Дики-Фуллера на стационарность
adf.test(as.vector(spread), k=0)

Тест Дики-Фуллера это далеко не единственный тест на стационарность, но в данном примере мы используем именного его. Результат:
Augmented Dickey-Fuller Test

data:  as.vector(spread) 
Dickey-Fuller = -3.8556, Lag order = 0, p-value = 0.01622
alternative hypothesis: stationary 
Видим, что. p-value мал, и отсюда можем утверждать, что действительно GLD и GDX коинтегрированы. Что подтверждается визуально на графике:
plot(as.vector(Cl(GLD)), col='blue', type='l', main='Коинтеграция GLD и GDX', ylab='price')
lines(as.vector(GDX$GDX.Adjusted*coef(model)[1]), col='red', type='l')
Красиво? Безусловно, если не знать о том, что в 2008, когда цены на нефть взлетели, на мир обрушился финансовый кризис, этот спред развалился и более не является стационарным. Изменим в нашей программе значение переменной to на "2011-09-01" и получим:
Augmented Dickey-Fuller Test

data:  as.vector(spread) 
Dickey-Fuller = -2.9022, Lag order = 0, p-value = 0.1964
alternative hypothesis: stationary 
Большое значение p-value уже не позволяет нам говорить о стационарности спреда, а значит и о коинтеграции двух цен, и график только подтверждает это:

Тем не менее, никто не отменял возможности восстановления стационарности спреда по мере стабилизации на рынке в будущем. И никто не отменял более сложных комбинаций инструментов, например золото, золотодобывающие компании и нефть.

3 comments:

  1. Коинтеграция безусловно очень интересная тема) Но сложная.

    Расказываю об стационарности, наверное стоит написать хотя бы пример: x(t)=a*x(t-1)+u (u-i.i.d N(0,1)). если Abs(a)<1, то стационарный, если Abs(a)==1, нестационарный, больше нуля не рассматривается из-за того, что такое почти не встречается.

    Если a==1, то ряд x(t)=1*x(t-1)+u можно продиффиринцировать: dx(t)=x(t)-x(t-1) => dx(t)=u - стационарный.

    Есть два вида рядов нестационарных: это DS и TS. Ранее приведённый - DS, то есть если продиффиринцировать, то будет стационарный. TS - стационарыне возле тренда. x(t)=0.5*x(t-1)+t+u - стационарный возле тренда.

    Коинтеграционный вектор кстати может тоже иметь тренд. То есть a2*x(t)+a1*y(t)+t - стационарный. Проблема тогда в том, что тут нужен свой Дикки Фулер (критические значения свои).

    А ещё очень интересно - это сезонные единиченые корни и дробнокоинтегрированные вектора)

    А в вашем примерезе про золото стоит учитывать излом. Если его учесть, то возможно ряды остануться коинтегрированны (проверяется, например, тестом Перрона)

    У вас классный блог, мнго чего интересно есть. Я просто как раз изучая немного R, много нового у вас узнал)

    ReplyDelete
  2. Что значит "adjusted данные"?
    Спасибо.

    ReplyDelete
  3. Какие есть подходы к нахождению моментов времени, когда коинтеграция ломается? Я попытался применить тест Kejriwal and Perron для поиска таких cointegration breakpoints. Но у меня получилось,что данный тест для поиска cointegration breakpoint использовать нельзя

    ReplyDelete