У меня есть большая матрица с ежедневной доходностью в широком формате, для которой я хочу вычислить ежедневную волатильность в изменяющемся во времени окне [-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]))
, но я не понял, как применить его к матрице.
Любая помощь (возможно, векторизация работает также?), Чтобы ускорить процесс, высоко ценится.
EDIT: Было бы здорово, если бы мы могли придерживаться основывают R.
Посмотрите на 'roll_sd (...)' в пакете 'RccpRoll'. Это должно быть быстрее. – jlhoward