滚动窗口计算协方差矩阵

3
我得到了一份为期4年的资产回报时间序列,并试图执行滚动窗口,以估计具有6个月校准期的方差-协方差矩阵。
通常情况下,将5种资产在20天内的回报收集到一个矩阵中作为数据集。
data <- matrix(rnorm(100), 20, 5) #data represents the returns of 5 assets over 20 days

我希望能够校准5天内的收益协方差矩阵,考虑到第1、2、3、4、5天。然后,我想要校准另一个协方差矩阵,考虑到第4、5、6、7、8天。以此类推,使用滚动窗口(我已经尝试使用循环来实现这一点)。

window.size <- 5

但是,将窗口大小设置为5时,对于第一个矩阵,代码考虑了1、2、3、4、5天,但对于第二个矩阵,代码只考虑了2、3、4、5、6天(而不是我想要的4、5、6、7、8)。这就是我的问题。我不知道如何修改代码以便从第2天到第4天进行“分割”。
我该如何解决这个问题?
window.size <- 5 #set the size of the window equal to 5 days
windows <- embed(1:nrow(data), window.size)
forApproach <- function(data, windows) {
  l <- vector(mode="list", length=nrow(windows))
  for (i in 1:nrow(data)) {
    l[[i]] <- cov(data[windows[i, ], ])
  }
}

两件事。1)你的基于far-loop的代码似乎不起作用。2)你希望如何展示结果? - MKR
我想要一个列表(代码中的l变量),其中包含6个方差协方差矩阵。这些矩阵应该从1:5、4:8、7:11、10:14、13:17、16:20(行/天)计算,考虑所有列。但是,上面的代码计算矩阵时只考虑了1:5、2:6、3:7(行),等等。 - Rfun2018
我想要一个列表(代码中的l变量),其中包含6个方差协方差矩阵。这些矩阵应该从1:5、4:8、7:11、10:14、13:17、16:20(行/天)计算,考虑所有列。但是,上面的代码计算矩阵时只考虑了1:5、2:6、3:7(行),等等。@ MKR - Rfun2018
1个回答

2
通过扩展OP的方法,可以使用另一个变量skip。根据反馈,似乎OP想要计算前5行(1:5)的cov,然后跳过3行来计算行(4:9)的cov等等。
使用embed创建了大小为5但跳过了1的窗口。我们可以跳过行来找到selected_windows的行索引,然后应用cov函数。
window.size <- 5
skip  <- 3
windows <- embed(1:nrow(data), window.size)
selected_windows <- windows[(1:nrow(windows) %% skip) == 1, ]

#       [,1] [,2] [,3] [,4] [,5]
# [1,]    5    4    3    2    1
# [2,]    8    7    6    5    4
# [3,]   11   10    9    8    7
# [4,]   14   13   12   11   10
# [5,]   17   16   15   14   13
# [6,]   20   19   18   17   16


#One can use for-loop or apply to calculate "cov" on group of rows and get the result
apply(selected_windows, 1, function(x)list(cov(data[x,])))

有兴趣问一下,您知道为什么 embed 会按降序(而不是升序)提取行索引吗? - rwb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接