大型面板数据的每日回报波动性

时间:2015-09-22 12:57:36

标签: r loops vectorization

我有一个大格式的矩阵,每天以宽格式返回,我想在时变窗口[-1; -251]中计算每日波动率。

我使用以下代码:

/*If you dont have a category ID use this: 
*       $category_ID = get_queried_object()->term_id;
* This will get you the current category_ID 
*/

$termid = get_term($category_ID, 'product_cat' );
    if($termid->parent > 0) 
    {                       // get the parent's hierarchy.
        $cat_hierachy = get_ancestors( $category_ID, 'product_cat' );  
        return end($cat_hierachy); // returns the Level-1 category_ID
    }
    return $category_ID; // Has no parent so return THIS category_ID  Level-1

然而,这需要太长时间:

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

我的原始数据需要15​​分钟。

我发现以下一段代码我认为执行得更快:

Time difference of 8.242027 secs

on Moving variance in R

但我还没弄清楚如何将它应用到矩阵中。

高度赞赏任何帮助(也许矢量化都有效?)来加快这个过程。

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

1 个答案:

答案 0 :(得分:0)

扩展评论。

rollapply(...)非常方便,但速度不是很快。 <{1}}包中的roll_sd(...)要快得多。

RccpRoll