我有一个大格式的矩阵,每天以宽格式返回,我想在时变窗口[-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
但我还没弄清楚如何将它应用到矩阵中。
高度赞赏任何帮助(也许矢量化都有效?)来加快这个过程。
编辑:如果我们能够坚持基础R,那就太好了。
答案 0 :(得分:0)
扩展评论。
rollapply(...)
非常方便,但速度不是很快。 <{1}}包中的roll_sd(...)
要快得多。
RccpRoll