R - 每列与其他列的滚动相关性

R - Rolling correlation of each column with each other column

你好,很抱歉问这个问题,因为我认为这个问题的变体已经回答了很多次,但我似乎无法将这些应用于我的具体问题。

我有很多不同公司的大量股票时间序列 returns,看起来像这样

library(tidyquant)
library(PerformanceAnalytics)

df = data.frame(tq_get("AAPL"))

ts = df[ , 3:8] %>%
     xts(order.by = as.Date(df[ , 2], "%Y-%m-%d")) %>%
     Return.calculate()

现在我需要对我的时间序列中的每一列与其他列进行滚动关联。 对于仅两列,以下内容完美无缺

rollcor = rollapply(ts, 63, function(x) cor(x[ , 1],x[ , 2]), by.column=FALSE)

但是我无法让它在列上与 apply() 一起工作,所以我尝试了一个 for 循环来至少将第一列与所有其他列相关联

rollcors = data.frame(ts)
for(j in ncol(rollcors)) {
  rollcors[ , j] = rollapply(rollcors, 63, function(x) cor(x[ , 1],x[ , j]), by.column=FALSE, fill = NA)
}

但这并没有像我希望的那样用包含相关性的新列替换每一列。

为了更好的可读性,我也更喜欢像现在这样保持输出垂直方向。我的完美结果将是 dataframes/time 系列的列表,每个系列包含一个列与所有其他列的相关性,然后我可以进一步操作(每日中位数等)。

这提供了为每个日期分解成一行的相关矩阵。将有 n*n 列,其中 ts 有 n 列:

r1 <- rollapplyr(ts, 63, cor, fill = NA, by.column = FALSE)

或者这将只显示下三角并且将有 choose(n, 2) 列:

ccor <- function(x) { cc <- cor(x); cc[lower.tri(cc)] }
r2 <- rollapplyr(X, 63, ccor, fill = NA, by.column = FALSE)

如果需要,这可用于分配列名。

paste_ <- function(...) paste(..., sep = "_")
names_mat <- do.call("outer", list(names(ts), names(ts), paste_))
names(r1) <- names_mat
names(r2) <- names_mat[lower.tri(names_mat)]