Monday, August 29, 2011

Сравнение временных рядов

Огромное количество данных в data mining вообще и в финансах в частности приходит к нам в виде временных рядов. Это не удивительно, ведь очень часто нас интересуют какие-то события или показатели изменяющиеся во времени. При этом, огромный пласт классической математики веками создавался для работы с множествами чисел. В результате, одним из самых популярных подходов к работе с такого рода данными был отказ от оси времени как полноценной оси координат и переход к простым множествам данных. Действительно, все алгоритмы, что я до сих пор рассматривал в серии data mining с примерами на R работают с наборами данных и игнорируют время.

Даже когда мы говорим о такой простой и знакомой вещи как корреляция, следует помнить, что она тоже определяется без учета времени. Меж тем, корреляцию цен очень часто используют как аргумент в пользу совершения сделки в трейдинге.

С математической точки зрения, фраза "корреляция цен" не имеет особого смысла. Честно говоря, я вообще не понимаю что это такое может быть. Т.е. чисто формально мы можем посчитать эту корреляцию для определенного набора данных, которые являются ценами. Но полученное значение не будет сходиться ни к какой определенной величине с увеличением размера набора данных - свойство, которое ожидается от любой измеряемой величины.

Поэтому, обычно, когда говорят о корреляции цен, имеют в виду корреляцию изменений цен за какой-то промежуток времени, например за день. Т.е. в каждой точке мы рассматриваем не само значение временного ряда, а его приращение. Тем самым мы преобразуем нестационарный временной ряд в стационарный (на самом деле, существует термин order of integration, и, строго говоря стационарность нам не требуется). Но значит ли высокая корреляция в таком случае, что цены будут двигаться вместе? Это значит лишь то, что большую часть временных интервалов цены будут двигаться в одном направлении. Но при этом они вполне могут расходиться дальше и дальше друг от друга.

Рассмотрим пример:

По бесконечно широкой улице идет два абсолютно пьяных человека. Каждый шаг пьяного человека случаен. Он может шагнуть как вправо, так и влево. Корреляция шагов алкоголиков нулевая и, в таком случае, никому не надо доказывать, что они вскоре разойдутся очень далеко.

mean <- 0
std <- 0.01 

res1 <- cumsum(rnorm(1000, mean=mean, sd=std))     
res2 <- cumsum(rnorm(1000, mean=mean, sd=std))     

plot(res1, type="l", col="red", ylim=range(res1, res2), main="Два случайных блуждания", ylab='Y')      
lines(res2, col="blue") 
Усложним наш пример. На каждой стороне улицы стоят вино-водочные магазины и заманивают наших пьянчуг к себе. На каждый шаг, пьянчуги слышат рекламу одного из магазинов и с некоторой вероятностью шагают в его сторону. Следующий шаг они могут услышать рекламу другого магазина и пойти в другую сторону. Теперь их движения, хоть все еще и являются случайными, но уже сильно коррелируют друг с другом.
library(MASS)   

mean <- 0
std <- 0.01 
cor <- 0.8  

covmat <- (std^2) * matrix(c(1, cor, cor, 1), nrow=2)
res <- mvrnorm(1000, c(mean, mean), covmat)  

res1 <- cumsum(res[,1])
res2 <- cumsum(res[,2])   

plot(res1, type="l", col="red", ylim=range(res1, res2), main="Два случайных блуждания с корреляцией", ylab='Y')      
lines(res2, col="blue")  
Если запустить этот код несколько раз, то становится очевидно, что несмотря на то, что их отдельные шаги очень сильно коррелируют, и иногда действительно кажется, что они идут вместе. Их интегральная сумма шагов может со временем расходиться.
Какая здесь аналогия с финансами? Непосредственная, предположим что мы нашли две акции, изменения цен которых сильно коррелируют. Значит ли это, что если вдруг, в какой-то момент времени одна стала стоить существенно дешевле чем другая, то мы можем купить дешевую, продать дорогую и ждать когда цена сойдется? Нет, не значит. Цена может не сойтись никогда. Вернемся к нашим алкоголикам, предположим теперь, что они знают друг друга и на каждый шаг кричат: эй, дружище, ты где? Услышав такой крик, они оценивают направление и расстояние друга до друга и стараются шагнуть в нужном направлении.
library(xts)
mean <- 0
std <- 0.01
coint <- 0.02

x <- 0 
y <- 0
for (i in 1:1000) {
  px <- last(x)
  py <- last(y)  
  x <- c(x,  px + (coint * (py - px)) + rnorm(1, mean=mean, sd=std))  
  y <- c(y,  py + (coint * (px - py)) + rnorm(1, mean=mean, sd=std))  
}  

ylim <- range(x, y)  
plot(x, ylim=ylim, type="l", col="red", main="Два коинтегрированных случайных блуждания")  
lines(y, col="blue")  
 

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

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

2 comments:

  1. Полезная статья, спасибо

    ReplyDelete
  2. вообщето при количестве шагов -> к бесконечности, расстояние между алконавтами будет стремиться к изначальному... так как шагания абсолютно случайны и мат ожидание отхода от начального состояния = 0.

    ReplyDelete