2016-08-15 2 views
3

У меня есть объект xts с именем data, который содержит 5 минут возврата за период с 2015-01-01 17:00:00 до 2015-12-31 17:00:00. Каждый торговый день начинается в 17:00:00 и заканчивается на следующий день в то же время в общей сложности 288 ежедневных возвращений [(24 часа * 60 минут)/5 минут = 288 внутридневных возвратов]. Отдача обозначаются как Элементы sum xts в строке списка по строке

head(data, 5) 
          DPRICE 
2015-01-01 17:00:00 0.000000e+00 
2015-01-01 17:05:00 9.797714e-05 
2015-01-01 17:10:00 2.027022e-04 
2015-01-01 17:15:00 2.735798e-04 
2015-01-01 17:20:00 7.768653e-05 

tail(data, 5) 
          DPRICE 
2015-12-31 16:40:00 0.00
2015-12-31 16:45:00 0.0001272704 
2015-12-31 16:50:00 0.0010186764 
2015-12-31 16:55:00 0.0006841370 
2015-12-31 17:00:00 0.0002481227 

Я пытаюсь стандартизировать данные по их среднему абсолютному значению для каждого 5-минутного внутридневного интервала по Макмиллан и Спейт Daily FX волатильности прогнозы (2012).

Математическая формула: enter image description here

Мой * код

library(xts) 
std_data = abs(data) #create absolute returns 
D <- split(std_data, "days") #splits data to days 
mts.days <- lapply(seq_along(D) - 1, function(i) { 
    if (i > 0) rbind(D[[i]]["T17:00:00/T23:55:00"], D[[i + 1]]["T00:00:00/T16:55:00"]) 
}) #creates a list with 365 elements each containing 288 unique returns 
dummy = mapply(sum, mts.days) #add the first,second... observations from each element 

С помощью этого кода я создаю список с 365 XTS элементов каждый из которых имеет размеры

> dim(mts.days[[2]]) 
[1] 288 1 

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

+0

Так что вы хотите верните вектор длиной 365 * 288? Если это так, я бы использовал манипуляции с агрегациями, используя либо dplyr, либо data.table –

+0

Значение фиктивного объекта возвращает числовой массив [1: 365], в то время как я хочу добавить первые наблюдения каждого элемента в список 'mts.days' , например, возвращение 17:00:00 за каждый день, 17:05:00 за каждый день и так далее. Я думаю, что 'mapply' суммирует все наблюдения для каждого элемента отдельно, как' lapply'. Я хочу вернуть вектор из 288 строк по 1 столбцу (я думаю). Затем я хочу использовать std_data/dummy и стандартизировать возвращаемые данные. – Greconomist

+0

@AllenWang Я не совсем уверен, как использовать dplyr или data.table, поскольку я новичок в R. Извините, что – Greconomist

ответ

1

Я не понимаю вашего запроса, но тем не менее даст ему шанс.

## generate bogus data 
library(quantmod) 
set.seed(123) 
ndays <- 3 
ndatperday <- 288 
data <- cumsum(do.call("rbind", lapply(13:15, function(dd){ 
    xts(rnorm(ndatperday)/1e4, 
     seq(as.POSIXct(paste0("2016-08-",dd," 17:00:00")), 
      length = ndatperday, by = 300)) 

}))) 
colnames(data) <- "DPRICE" 

## calculate percentage returns 
ret <- ROC(data, type="discrete") 

## this is probably not what you need: returns divided by the overall mean 
ret/mean(abs(ret), na.rm=T) 

## I suspect indeed that you need returns divided by the daily mean return 
library(dplyr) 
ret.df <- data.frame(ret) 
## create a factor identifying the 3 days of bogus data 
ret.df$day <- rep(paste0("2016-08-",13:15),each=ndatperday) 
## compute daily mean return 
dail <- ret.df %>% 
    group_by(day) %>% 
    summarise(mean=mean(abs(DPRICE), na.rm=TRUE)) 
## attach daily mean returns to the days they actually are associated to 
ret.df <- ret.df %>% left_join(dail) 
## normalize 
ret.df$DPRICE <- ret.df$DPRICE/ret.df$mean 

%%%%%%%%%

Второй выстрел: после прочтения бумаги (http://onlinelibrary.wiley.com/doi/10.1002/for.1222/full) Я мог бы понять, что вы после:

library(quantmod) 
library(dplyr) 
set.seed(123) 

## generate bogus 5-min series 
ndays <- 365 
ndatperday <- 288 
data <- as.xts(zoo(0.1+cumsum(rt(ndays*ndatperday, df=3))/1e4, 
        seq(as.POSIXct("2015-01-01 17:00"), 
         as.POSIXct("2015-12-31 17:00"), by=300))) 
colnames(data) <- "DPRICE" 

## calculate 5-min percentage returns 
ret <- ROC(data, type="discrete") 

## create a factor identifying the 5-minute intra-day interval 
ret.df <- as.data.frame(ret) 
ret.df$intra5 <- strftime(index(ret), format="%H:%M") 

## compute mean returns (over the year) for each of the 288 5-minute intra-day intervals 
dail <- ret.df %>% 
    group_by(intra5) %>% 
    summarise(mean=mean(abs(DPRICE), na.rm=TRUE)) 

## attach mean returns to each datapoint 
ret.df <- ret.df %>% left_join(dail) 

## normalize 
ret.df$DPRICE <- ret.df$DPRICE/ret.df$mean 
+0

Спасибо за внимание. Этот ответ заставляет меня вернуться к фактической работе Андерсена и Боллерслева, чтобы дважды проверить, понял ли я определение стандартизации возвратов. Одна ошибка: «суммировать (среднее значение = среднее значение (abs (DPRICE), na.rm = TRUE)), поскольку 1/T равно 1/365, поэтому может быть что-то вроде« суммировать (среднее значение = среднее значение (abs (DPRICE) »* (1/365), na.rm = TRUE)) '. – Greconomist

+1

'sumize (mean = sum (abs (DPRICE)/365, na.rm = TRUE))'; Кроме того, неясно, откуда берет «T = 1128». –

+0

Извините 1128 - это количество дней T, выполненных оригинальной бумагой. Я должен это исправить. – Greconomist

Смежные вопросы