Rolling window 协方差矩阵

Rolling window for co-variance matrix

我有一个 4 年的资产时间序列 returns,我正在尝试执行滚动 window 以估计校准周期为 6 的方差-协方差矩阵个月。

一般来说,将包含 20 天内 5 种资产的 returns 的矩阵视为数据集

data <- matrix(rnorm(100), 20, 5) #data represents the returns of 5 assets over 20 days

我想在 5 天内校准 returns 的协方差矩阵,因此考虑第 1、2、3、4、5 天。然后我想校准另一个协方差矩阵,同时考虑第 4 天, 5, 6, 7, 8. 依此类推,使用滚动 window(我尝试使用循环 for)。

window.size <- 5

但是将 windows 大小设置为 5,对于第一个矩阵,代码考虑第 1、2、3、4、5 天,但对于第二个矩阵,代码考虑第 2、3 天, 4, 5, 6(不是我想要的 4, 5, 6, 7, 8)。这是我的问题。我不知道如何修改代码以便从第 2 天到第 4 天将此 "split" 排序。 我该如何解决这个问题?

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, ], ])
  }
}

扩展 OP 方法的解决方案是使用另一个变量 skip。根据反馈,OP 似乎想为第一个 5 行(1:5)计算 cov,然后想 skip 3 行计算 cov 行( 4:9) 等等。

embed 的使用创建了大小 5 的 window,但跳过了 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,])))