среда, 3 февраля 2016 г.

Работа с финансовыми временными рядами в R. Часть 7. Представление временных рядов в виде объектов класса zoo


Класс ts имеет ограниченные возможности, особенно при представлении нерегулярных финансовых данных. Например, класс ts не подходит для работы с дневными котировками, так как они имеются в наличии только для рабочих дней, а выходные необходимо пропускать. Такие данные, разделенные нерегулярными интервалами, не могут быть представлены с помощью класса ts. Для работы с такими данными подходит очень гибкий класс zoo, доступный в одноименном пакете на CRAN. Класс zoo разработан для обработки временных рядов с произвольно заданным временным показателем. Он может представлять собой последовательность дат с одинаковыми промежутками, с неодинаковыми промежутками, или числовой индекс. Класс zoo по существу связывает информацию о дате, хранимую в векторе, с временными данными, хранимыми в матрице.

Для создания объекта zoo нам нужен временной индекс и данные. Временной индекс должен содержать то же количество строк, что и объект данных. Обычно временной индекс представляет собой объект класса Date, POSIXct, yearmon, yearqtr или  timeDate.
Создадим объекты класса zoo, содержащие месячные данные по индексам РТС и ММВБ за период с января 2013 года по январь 2015 года, хранящиеся в объектах rtsi.df и micex.df класса  data.frame. Сначала создадим временной индекс класса Date с помощью функции seq().

> td = seq(as.Date("2013/1/1"), as.Date("2015/1/1"), "months")
> class(td)
[1] "Date"
> head(td)
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01"

Также временной индекс можно создать путем приведения символьных строк дат в столбце Date файла rtsi.df к типу Date.

> td2 = as.Date.character(rtsi.df$X.DATE, format="%Y%m%d")
> head(td2)
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01"

Теперь, имея временной индекс, мы можем создать объект zoo путем объединения временного индекса с числовыми данными, используя функцию zoo().

> rtsi.z = zoo(x=rtsi.df$X.CLOSE, order.by=td)
> micex.z = zoo(x=micex.df$X.CLOSE, order.by=td)
> class(rtsi.z)
[1] "zoo"
> str(rtsi.z)
‘zoo’ series from 2013-01-01 to 2015-01-01
 Data: num [1:25] 1622 1534 1460 1407 1331 ...
 Index:  Date[1:25], format: "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" ...
> head(rtsi.z)
2013-01-01 2013-02-01 2013-03-01 2013-04-01 2013-05-01 2013-06-01
  1622.13    1534.41    1460.04    1407.21    1331.43    1275.44

Временной индекс и данные можно извлечь с помощью функций index() и coredata().

> index(rtsi.z)
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01"
[9] "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
[17] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01"
[25] "2015-01-01"
> coredata(rtsi.z)
[1] 1622.13 1534.41 1460.04 1407.21 1331.43 1275.44 1313.38 1290.96 1422.49 1480.42 1402.93 1442.73 1301.02
[14] 1267.27 1226.10 1155.70 1295.75 1366.08 1219.36 1190.23 1123.72 1091.44  974.27  790.71  737.35

С объектами zoo также работают функции start() и end().
> start(rtsi.z)
[1] "2013-01-01"
> end(rtsi.z)
[1] "2015-01-01"

Преимуществом объектов zoo является возможность извлечения данных по временному индексу. Например, для извлечения данных для марта 2013 и марта 2014 года используется функция:
> rtsi.z[as.Date(c("2013/3/1", "2014/3/1"))]
2013-03-01 2014-03-01
  1460.04    1226.10
Функция  window() также работает с объектами zoo:
> window(rtsi.z, start=as.Date("2013/3/1"), end=as.Date("2014/3/1"))
2013-03-01 2013-04-01 2013-05-01 2013-06-01 2013-07-01 2013-08-01 2013-09-01 2013-10-01 2013-11-01 2013-12-01
  1460.04    1407.21    1331.43    1275.44    1313.38    1290.96    1422.49    1480.42    1402.93    1442.73
2014-01-01 2014-02-01 2014-03-01
  1301.02    1267.27    1226.10

Извлечение дат в zoo несколько затруднительно. Оно более распространено в объектах xts, которые являются расширением zoo. Расчет временной задержки и разницы делается также, как для объектов ts.

Объединение объектов zoo

Для объединения rtsi.z и micex.z в один объект используется функция cbind() или merge().
> rtsimicex.z = cbind(rtsi.z, micex.z)
> class(rtsimicex.z)
[1] "zoo"
> head(rtsimicex.z)
           rtsi.z micex.z
2013-01-01 1622.13 1547.18
2013-02-01 1534.41 1487.46
2013-03-01 1460.04 1440.02
2013-04-01 1407.21 1386.69
2013-05-01 1331.43 1343.99
2013-06-01 1275.44 1331.24

Используйте cbind() для объединения объектов zoo с одним и тем же временным индексом, а merge() для объединения объектов с разными индексами. Обратите внимание, что вы можете объединять только объекты zoo с временными индексами одного класса.

Визуализация объектов zoo
Для построения графиков можно использовать функцию plot(), и ее синтаксис похож на plot(), используемую с объектами ts.

> # строим график одной серии и добавляем легенду
> plot(micex.z, col="blue", lty=1, lwd=2, ylim=c(700,1600))
> lines(rtsi.z, col="red", lty=2, lwd=2)
> legend(x="bottomleft", legend=c("MICEX","RTSI"), col=c("blue","red"), lty=1:2)

Rplot1.png

> # строим графики нескольких серий сразу
> plot(rtsimicex.z, plot.type="single", col=c("blue","red"), lty=1:2, lwd=2)
> legend(x="bottomleft", legend=c("MICEX","RTSI"), col=c("blue","red"), lty=1:2)

Rplot2.png

Комментариев нет:

Отправить комментарий