R 使用跳过的值循环…或者是否有一种矢量化的方法从每日数据获取每周std dev?

R 使用跳过的值循环…或者是否有一种矢量化的方法从每日数据获取每周std dev?,r,R,我有一个5天返回数据矩阵(数据集跳过周末)。我想用前52周的标准差创建一个新的矩阵。这需要我从5天返回数据(我称之为lrets5)中选择52个值,方法是获取当前值,然后向后跳过52周中的每一周的5个值 我想要一个每天52周标准偏差的新值 我可以使用seq()找到我想要计算标准偏差的行,但是我还没有找到一个好方法从lrets5中提取这些值来计算标准偏差 这是我的最新尝试: weeklysd <- matrix(nrow=(nrow(lrets5)),ncol=20) #pre alloca

我有一个5天返回数据矩阵(数据集跳过周末)。我想用前52周的标准差创建一个新的矩阵。这需要我从5天返回数据(我称之为lrets5)中选择52个值,方法是获取当前值,然后向后跳过52周中的每一周的5个值

我想要一个每天52周标准偏差的新值

我可以使用seq()找到我想要计算标准偏差的行,但是我还没有找到一个好方法从lrets5中提取这些值来计算标准偏差

这是我的最新尝试:

weeklysd <- matrix(nrow=(nrow(lrets5)),ncol=20)  #pre allocate matrix 

for (i in 2:21){          #skip the date column
  x <- numeric()
  vec <- (as.numeric(lrets5[,i]))
  for (i in 256:nrow(lrets5)){
    v52 <- seq(from = i, to = (i-255), by = -5)
    x <- as.numeric(sd(vec[v52]))
  }
       weeklysd[,(k-1)] <- x
}
所有工作日都包含在数据集中,即使是在假日,市场也会受到影响
关闭我只是对计算前52周收益率的标准差感兴趣,忽略了一个事实,即有时一周内没有5天的交易。

我算出了!我使用seq()生成了所需的行号,并将值存储在列表中

weeklylist <- list() 
 x <- numeric()
for (i in 256:nrow(lrets5)){         
  x <- numeric()
  x <- seq(from = i, to = (i-255), by = -5)      #generates the 52 row numbers
  weeklylist[[i]] <- x       
  }

#-----------------------


weeklyvol <- matrix(nrow=(nrow(lrets5)),ncol=20)   

for (i in 2:21){          
  abc <- numeric()
  for (j in 256:nrow(lrets5)){
      x <- as.vector(weeklylist[[j]])
      abc <- sd(lrets5[(x[1:52]),i])

      weeklyvol[j,(i-1)] <- abc *sqrt(52)     #multiply by sqrt(52) to get volatility
}
}

weeklylist如果要在看起来像矩阵的东西上使用聚合,它可能只是

aggregate(mtx[,-1], 
          cut(1:nrow(mtx), seq(0,nrow(mtx)+4,by=5), right=TRUE, include.lowest=TRUE),
          sd)
使用您使用的数据列,我得到:

 aggregate(mtx, 
           list(wk=cut(1:nrow(mtx), seq(0,nrow(mtx)+4,by=5), right=TRUE, include.lowest=TRUE)),
           sd)
#--------
     wk    ALLIANZ       BASF      BAYER        BMW     COBANK
1 [0,5] 0.03812483 0.02985568 0.03189135 0.02692465 0.02204558

考虑<代码>周期的组合。从XTS包中应用和端点< /代码>函数。<代码> TpEp> <代码> >代码>索引=格式(日期,%u)。或者,如果它们真的不是日期,那么只需
%/%5
(除法模5),但我认为假期周会使其容易出错。(如果您发布一个适当复杂的数据集,您会得到更好的答案。@DWin,我刚刚添加了一些示例数据。我正在阅读xts包上的文档。
 aggregate(mtx, 
           list(wk=cut(1:nrow(mtx), seq(0,nrow(mtx)+4,by=5), right=TRUE, include.lowest=TRUE)),
           sd)
#--------
     wk    ALLIANZ       BASF      BAYER        BMW     COBANK
1 [0,5] 0.03812483 0.02985568 0.03189135 0.02692465 0.02204558