我获得了4年的资产回报时间序列,我正在尝试执行滚动窗口以估计方差 - 协方差矩阵,校准周期为6个月。
一般而言,将数据集视为一个矩阵,其中包括20天内5个资产的回报
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, ], ])
}
}
答案 0 :(得分:1)
通过扩展OP方法的解决方案是使用另一个变量skip
。根据反馈,似乎OP想要计算cov
行(5
)的1:5
,然后想要skip
3行来计算行cov
( 4:9
)等等。
使用embed
创建的大小为5
的窗口,但跳过1
。我们可以跳过行来查找行索引的selected_windows
,然后应用cov
函数。
window.size <- 5
skip <- 3
windows <- embed(1:nrow(data), window.size)
selected_windows <- windows[(1:nrow(windows) %% 3) == 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,])))