2015-09-22 3 views
0

У меня есть большая матрица с ежедневной доходностью в широком формате, для которой я хочу вычислить ежедневную волатильность в изменяющемся во времени окне [-1; -251].Волатильность дневной доходности в больших панельных данных

Я использую следующий код:

n=1000 
m=500 
ret=matrix(rnorm(n*m,mean=0,sd=1), n, m) 
vola=matrix(0, n, m) 
start.time = Sys.time() 

for (j in 1: ncol(ret)){ 
    for (i in 251:nrow(ret)){ 
    vola[i,j]=sd(ret[(i-1):(i-251+1),j])*sqrt(251)} 
} 
end.time = Sys.time() 
time.taken = end.time - start.time 
time.taken 

Тем не менее, занимает слишком много времени:

Time difference of 8.242027 secs 

Мои исходные данные занимает 15 минут.

Я нашел следующий кусок кода, который я считаю, чтобы работать быстрее:

my.rollapply <- function(vec, width, FUN) 
    lapply(1:nrow(vec), 
     function(i) if (i < width) NA else FUN(vec[(i-1):(i-width+1),1])) 

на Moving variance in R

, но я не понял, как применить его к матрице.

Любая помощь (возможно, векторизация работает также?), Чтобы ускорить процесс, высоко ценится.

EDIT: Было бы здорово, если бы мы могли придерживаться основывают R.

+0

Посмотрите на 'roll_sd (...)' в пакете 'RccpRoll'. Это должно быть быстрее. – jlhoward

ответ

0

Опираться на комментарии.

rollapply(...) очень удобно, но не очень быстро. roll_sd(...) от пакета RccpRoll намного быстрее.

library(RcppRoll) 
df <- as.data.frame(ret) 
system.time(result<- sapply(df, function(x) roll_sd(x,n=251))) 
# user system elapsed 
# 0.94 0.00 0.95 
+0

Это не база R, но мне нравится скорость функции. Благодаря! – fuji2015

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