Ошибка при попытке понять размеры таймсерий

Я пытаюсь рассчитать скользящие дневные корреляции для двух цен акций (тип xts), AGL и BIL (данные OHLC ниже):

library(RODBC)
library(quantmod)
library(xts)
library(TTR)



dput(my.AGL)
structure(c(28500, 27800, 28699, 28440, 28569, 28600, 26650, 
27250, 26910, 27450, 28814, 27950, 28950, 28740, 29250, 28765, 
27429, 27584, 27534, 28072, 27122, 27050, 28406, 28030, 28211, 
27349, 26618, 26509, 26560, 27200, 27203, 27900, 28665, 28694, 
28836, 27698, 27090, 26600, 27079, 27206), .Dim = c(10L, 4L), .Dimnames = list(
    NULL, c("days.Open", "days.High", "days.Low", "days.Close"
    )), index = structure(c(1312988460, 1313074860, 1313420460, 
1313506860, 1313593260, 1313679660, 1314025260, 1314111660, 1314198060, 
1314284460), tzone = "", tclass = c("POSIXt", "POSIXct")), class = c("xts", 
"zoo"), .indexCLASS = c("POSIXt", "POSIXct"), .indexTZ = "", tclass = c("POSIXct", 
"POSIXt")) 

my.AGL
                    days.Open days.High days.Low days.Close
2011-08-10 17:01:00     28500     28814    27122      27203
2011-08-11 17:01:00     27800     27950    27050      27900
2011-08-15 17:01:00     28699     28950    28406      28665
2011-08-16 17:01:00     28440     28740    28030      28694
2011-08-17 17:01:00     28569     29250    28211      28836
2011-08-18 17:01:00     28600     28765    27349      27698
2011-08-22 17:01:00     26650     27429    26618      27090
2011-08-23 17:01:00     27250     27584    26509      26600
2011-08-24 17:01:00     26910     27534    26560      27079
2011-08-25 17:01:00     27450     28072    27200      27206

Затем я создаю серию, используя ROC:

my.AGL.roc <- ROC(my.AGL[,4])

Из приведенных ниже отзывов я понял, что ROC несовместим с 2.13.1, поэтому для создания возвращаемых журналов я заменил функцию ROC на:

my.AGL.lret <- log(my.AGL[,4]) - log(lag(my.AGL[,4], 1)

заменяя первое наблюдение NA на:

my.AGL.lret[ is.na(my.AGL.lret) ] <- 0 

 my.AGL.lret
                      days.Close
2011-08-10 17:01:00  0.000000000
2011-08-11 17:01:00  0.025299427
2011-08-15 17:01:00  0.027050178
2011-08-16 17:01:00  0.001011175
2011-08-17 17:01:00  0.004936565
2011-08-18 17:01:00 -0.040264398
2011-08-22 17:01:00 -0.022195552
2011-08-23 17:01:00 -0.018253440
2011-08-24 17:01:00  0.017847304
2011-08-25 17:01:00  0.004679017

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

> rollapply(my.AGL.lret, 30, mean)
Error in `colnames<-`(`*tmp*`, value = "days.Close") : 
  attempt to set colnames on object with less than two dimensions
> rollmean(my.AGL.lret, 30)
Error in `colnames<-`(`*tmp*`, value = "days.Close") : 
  attempt to set colnames on object with less than two dimensions

Я уверен, что делаю что-то глупое, но я был бы признателен, если бы кто-нибудь мог объяснить, как обрабатываются размеры? Обладая ограниченными знаниями, я создал серию результатов, которая все еще является временным рядом.

dim(my.AGL.roc)
[1] 406   1

Заранее спасибо Эд


r xts
person E.D.    schedule 29.08.2011    source источник
comment
Ваш вопрос немного запутан. my.AGL объект класса xts?   -  person Andrie    schedule 29.08.2011
comment
Если ROC действительно из пакета TTR, мой ответ должен помочь.   -  person Anatoliy    schedule 29.08.2011
comment
Пожалуйста, сделайте ваш вопрос воспроизводимым. 1) включить правильные library операторы. 2) Используйте dput, чтобы воспроизвести структуру my.AGL. См. stackoverflow.com/q/5963269/602276, чтобы узнать, как это сделать.   -  person Andrie    schedule 29.08.2011


Ответы (2)


Нет ничего плохого в TTR::ROC под R-2.13.1. Вы можете использовать TTR::runCor для расчета скользящей корреляции между двумя вашими ценовыми сериями.

library(quantmod)
my.AGL <-
structure(c(32020L, 32810L, 33000L, 33394L, 33650L, 34205L, 34140L, 
33400L, 34300L, 32975L, 33179L, 33450L, 33700L, 34180L, 35000L, 
34140L, 33600L, 34300L, 32020L, 32460L, 32811L, 33157L, 33599L, 
34205L, 33299L, 33155L, 33106L, 32850L, 33020L, 33400L, 33539L, 
34000L, 34461L, 33480L, 33400L, 33250L), .Dim = c(9L, 4L), .Dimnames = list(
    NULL, c("days.Open", "days.High", "days.Low", "days.Close"
    )), index = structure(c(1262646025, 1262732404, 1262818810, 
1262905220, 1262991623, 1263250801, 1263337207, 1263423608, 1263510020
), tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", 
"POSIXt"), .indexTZ = "", class = c("xts", "zoo"))

my.AGL.roc <- ROC(Cl(my.AGL))
my.BIL.roc <- ROC(Op(my.AGL))  # since OP didn't provide BIL data
runCor(x=my.AGL.roc,y=my.BIL.roc,n=3)
#                              [,1]
# 2010-01-04 17:00:25            NA
# 2010-01-05 17:00:04            NA
# 2010-01-06 17:00:10            NA
# 2010-01-07 17:00:20 -0.6614544157
# 2010-01-08 17:00:23 -0.8643698058
# 2010-01-11 17:00:01  0.0001661546
# 2010-01-12 17:00:07  0.8768496736
# 2010-01-13 17:00:08  0.3459987310
# 2010-01-14 17:00:20  0.0289108044

ОБНОВИТЬ:

zoo rollapply не работает с объектами xts в этом случае из-за фундаментальной разницы в конструкции между объектами xts и zoo. Объекты xts всегда имеют атрибут dim, тогда как объекты zoo могут быть векторными. Вычисление rollapply «падает» до самого низкого измерения, что уменьшает входной объект xts до вектора, и вы не можете установить имена столбцов для вектора.

Добавление методов xts rollapply было в моем списке дел, и это не будет проблемой, когда они станут доступны.

person Joshua Ulrich    schedule 29.08.2011
comment
спасибо, Джошуа, это работает, как я ожидал. Знаете ли вы, почему функция rollmean не рассматривает одну серию возвращаемых ценных бумаг в качестве действительных входных данных? - person E.D.; 29.08.2011

Первое наблюдение в my.AGL.roc, вероятно, NA.

Из ?rollmean:

Метод rollmean по умолчанию не обрабатывает входные данные, содержащие NA. В таких случаях используйте вместо этого rollapply.

rollapply(my.AGL.roc, 30, mean)

person Anatoliy    schedule 29.08.2011
comment
спасибо, Antoliy, я заменил функцию ROC на my.AGL.lret ‹- log (my.AGL [, 4]) - log (lag (my.AGL [, 4], 1), но проблема не исчезла - person E.D.; 29.08.2011
comment
Вы пробовали rollapply, который я предоставил? Первое наблюдение NA не является ошибкой, которую нужно исправлять, поскольку, очевидно, нет скорости изменения для самого первого значения. Изменить: я вижу, вы пробовали, еще раз проверю себя. - person Anatoliy; 29.08.2011
comment
Проверил еще раз, rollmean() возвращает ту же ошибку, что и у вас, но rollapply() у меня работает. Не могли бы вы попробовать rollapply() на my.AGL.roc? - person Anatoliy; 29.08.2011
comment
Текс, Анатолий, я обнаружил: rollapply, похоже, работает с результатами функции ROC, но не с ручным вычислением, показанным выше. rollmean, кажется, работает, если я объединяю 2 серии возврата (AGL и BIL). Я нахожу это странным, поскольку функция работает только в том случае, если временной ряд содержит более 1 столбца. - person E.D.; 29.08.2011