【发布时间】:2015-09-22 12:57:35
【问题描述】:
我有一个大矩阵,其中包含宽格式的每日收益,我想计算其在时变窗口 [-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]))
但我还没有弄清楚如何将其应用于矩阵。
非常感谢任何帮助(也许矢量化也有效?)以加快该过程。
编辑:如果我们能坚持使用基础 R,那就太好了。
【问题讨论】:
-
查看
roll_sd(...)包中的RccpRoll。这应该更快。
标签: r loops vectorization