滚动窗口估计协方差矩阵:R代码修正求助
搞定滚动窗口方差-协方差矩阵的R代码修正方案
嘿,我来帮你捋清楚这个问题!你提到的4年期数据用6个月滚动窗口估计协方差矩阵,核心问题出在代码的不完整和几个细节错误上,我给你整理了完整的修正方案:
1. 补全并修正核心代码框架
你的forApproach函数没写完,而且用普通向量存储协方差矩阵是错误的(毕竟矩阵是二维对象,得用列表来存储)。假设你的data是每行代表一个观测日/月,每列对应一个资产收益率的矩阵或数据框,修正后的代码如下:
# 假设data是你的收益率时间序列数据 window.size <- 180 # 如果是月度数据,把这里改成6就行 # 生成滚动窗口的索引:注意embed默认生成的窗口是倒序的,得反转过来 window_indices <- embed(1:nrow(data), window.size) window_indices <- apply(window_indices, 2, rev) # 让窗口按时间正序滚动 # 初始化列表来存储每个窗口的协方差矩阵(不能用普通vector!) cov_matrices <- vector("list", nrow(window_indices)) # 定义滚动计算函数 roll_cov <- function(data, window_indices) { for (i in 1:nrow(window_indices)) { # 提取当前窗口的子数据 current_window <- data[window_indices[i, ], ] # 计算协方差矩阵,加use参数处理可能的缺失值 cov_matrices[[i]] <- cov(current_window, use = "complete.obs") } return(cov_matrices) } # 运行函数得到结果 result <- roll_cov(data, window_indices) # 查看生成的矩阵数量,应该等于 总观测数 - 窗口大小 + 1 length(result)
2. 你之前代码的几个关键错误点
- 存储容器错误:协方差矩阵是二维对象,不能用普通
vector()存储,必须用vector("list", 长度)创建列表来装载每个矩阵。 - 窗口索引顺序反了:
embed()生成的窗口是从时间序列末尾往前计算的,比如第一个窗口是最后180行,所以得用apply(..., rev)反转,让窗口从序列开头开始滚动。 - 缺失值未处理:如果数据里有NA,
cov()会直接返回NA矩阵,加use = "complete.obs"可以自动剔除含缺失值的观测(你也可以根据需求替换成其他缺失值处理参数)。
3. 更简洁的替代方案:用zoo包偷懒
要是不想自己写循环,用zoo包的rollapply()函数更省心,代码更简洁:
library(zoo) window.size <- 180 # 按行滚动,每次取window.size行计算协方差矩阵 result <- rollapply(data, width = window.size, FUN = function(x) cov(x, use = "complete.obs"), by.column = FALSE) # 这个参数必须设为FALSE,不然会按列单独计算 # 把三维数组转成列表(方便查看单个矩阵) cov_list <- lapply(1:dim(result)[3], function(i) result[,,i]) length(cov_list)
另外你提到理论上应该得到40个矩阵,要是用月度数据的话,4年48个月,48-6+1=43个,差3个可能是数据开头或结尾有缺失,你可以检查下nrow(data)的实际数量哦~
内容的提问来源于stack exchange,提问作者Rfun2018
相关产品推荐
相关产品推荐

