【问题标题】:Daily return volatility in large panel data大型面板数据中的每日收益波动率
【发布时间】: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]))

Moving variance in R

但我还没有弄清楚如何将其应用于矩阵。

非常感谢任何帮助(也许矢量化也有效?)以加快该过程。

编辑:如果我们能坚持使用基础 R,那就太好了。

【问题讨论】:

  • 查看roll_sd(...) 包中的RccpRoll。这应该更快。

标签: r loops vectorization


【解决方案1】:

扩展评论。

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 

【讨论】:

  • 它不是base R,但我喜欢这个函数的速度。谢谢!
猜你喜欢
  • 2021-02-08
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2014-03-21
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多