You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中计算行业间3个月滚动相关性并保留日期列

解决滚动相关性计算的日期匹配问题

核心思路

通过将数据转换为zoo对象利用其索引特性保留日期,自定义两两相关计算函数,结合rollapply的参数设置,直接生成带节点日期的结果DataFrame。

完整代码示例

# 加载依赖包
library(zoo)
library(dplyr)

# 1. 模拟交易日度行业收益率数据(替换为你的真实数据)
set.seed(123)
dates <- seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "day")
industry_returns <- data.frame(
  Date = dates,
  Tech = rnorm(length(dates), 0.001, 0.02),
  Finance = rnorm(length(dates), 0.0005, 0.015),
  Energy = rnorm(length(dates), 0.0008, 0.025),
  Consumer = rnorm(length(dates), 0.0007, 0.018),
  Healthcare = rnorm(length(dates), 0.0009, 0.016)
) %>% filter(!weekdays(Date) %in% c("Saturday", "Sunday")) # 过滤周末交易日

# 2. 自定义两两行业相关系数计算函数
calc_pairwise_cor <- function(x) {
  # 计算相关矩阵,忽略缺失值
  cor_mat <- cor(x, use = "pairwise.complete.obs")
  # 提取上三角(避免重复计算对称对)并生成带命名的向量
  upper_tri_vals <- cor_mat[upper.tri(cor_mat)]
  names(upper_tri_vals) <- combn(colnames(x), 2, paste, collapse = "-")
  upper_tri_vals
}

# 3. 转换为zoo对象(自动绑定日期索引)
returns_zoo <- zoo(industry_returns[, -1], order.by = industry_returns$Date)

# 4. 计算60天滚动相关性,align="right"取窗口最后一天为节点日期
roll_cor_results <- rollapply(
  returns_zoo,
  width = 60,
  FUN = calc_pairwise_cor,
  align = "right",
  by.column = FALSE # 必须设为FALSE,确保处理整个矩阵而非单列
)

# 5. 转换为标准DataFrame,保留日期列
final_df <- data.frame(
  Date = index(roll_cor_results),
  coredata(roll_cor_results)
) %>% na.omit() # 移除窗口不足60天的初始行

关键参数说明

  • align="right":指定用每个滚动窗口的最后一天作为结果对应的节点日期,完全匹配需求
  • by.column=FALSE:禁用默认的按列处理逻辑,让rollapply把窗口内的所有行业收益率作为一个矩阵传入自定义函数
  • zoo对象的索引特性:自动将窗口结束日期绑定到计算结果,无需手动匹配

结果说明

最终的final_df中:

  • Date列:每个60天窗口的结束日期(即你要的3个月节点日期)
  • 其余列:以行业A-行业B命名的两两滚动相关性数值,无重复计算对

内容的提问来源于stack exchange,提问作者dsafdsfsdf777sdfh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:30:54