问题描述
您好,为此道歉,因为我认为这个问题的变体已经回答了很多次,但是我似乎无法将其应用于我的特定问题。
我有很多类似这样的公司的大量股票回报时间序列
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,j]),by.column=FALSE,fill = NA)
}
但这不会像我希望的那样用包含相关性的新列替换每一列。
我也希望保持输出像现在这样垂直放置,以提高可读性。我的理想结果是创建一个数据帧/时间序列列表,每个数据帧包含一列与所有其他列的相关性,然后我可以进一步进行操纵(每日中位数等)。
解决方法
这将为每个日期提供展开成行的相关性矩阵。会有n * n列,其中ts有n列:
rollapplyr(ts,63,cor,fill = NA,by.column = FALSE)
否则将仅显示下部三角形,并具有choice(n,2)列:
ccor <- function(x) { cc <- cor(x); cc[lower.tri(cc)] }
rollapplyr(X,ccor,by.column = FALSE)