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

在R中计算数据框收益率列与多风险参数列的年度协方差

批量计算收益率与多风险参数的年度协方差

方法一:Tidyverse 整洁数据流方案

这种方法通过将宽格式数据转为长格式,批量处理所有风险参数列,代码简洁易读:

单个数据框处理示例

library(tidyverse)

# 处理单个数据框
processed_single_df <- your_dataframe %>%
  # 提取年份(无需保留月份)
  mutate(year = format(date, "%Y")) %>%
  group_by(year) %>%
  # 将所有风险参数列转为长格式,统一处理
  pivot_longer(
    cols = -c(date, ret, year),
    names_to = "risk_parameter",
    values_to = "param_value"
  ) %>%
  # 按年份+参数计算协方差
  summarise(
    covariance = cov(ret, param_value),
    .groups = "drop"
  ) %>%
  # 转回宽格式,方便查看每年度各参数的协方差结果
  pivot_wider(
    names_from = "risk_parameter",
    values_from = "covariance"
  )

扩展到数据框列表

用purrr::map()遍历整个列表:

# 批量处理所有数据框
processed_df_list <- map(your_df_list, function(df) {
  df %>%
    mutate(year = format(date, "%Y")) %>%
    group_by(year) %>%
    pivot_longer(
      cols = -c(date, ret, year),
      names_to = "risk_parameter",
      values_to = "param_value"
    ) %>%
    summarise(
      covariance = cov(ret, param_value),
      .groups = "drop"
    ) %>%
    pivot_wider(
      names_from = "risk_parameter",
      values_from = "covariance"
    )
})

方法二:基础R循环方案(针对你之前尝试失败的场景)

如果更习惯基础R语法,这里给出明确可运行的循环实现:

定义处理函数

process_single_df <- function(df) {
  # 提取年份
  df$year <- format(df$date, "%Y")
  # 获取所有风险参数列名(排除date、ret、year)
  param_cols <- setdiff(colnames(df), c("date", "ret", "year"))
  # 获取唯一年份
  unique_years <- unique(df$year)
  
  # 初始化结果数据框
  result_df <- data.frame(year = unique_years)
  
  # 循环计算每个参数与ret的年度协方差
  for (param in param_cols) {
    # 按年份计算协方差,同时过滤缺失值
    cov_values <- sapply(unique_years, function(y) {
      subset_data <- df[df$year == y, ]
      valid_rows <- !is.na(subset_data$ret) & !is.na(subset_data[[param]])
      cov(subset_data$ret[valid_rows], subset_data[[param]][valid_rows])
    })
    result_df[[param]] <- cov_values
  }
  
  return(result_df)
}

遍历数据框列表

# 批量处理列表
processed_df_list <- lapply(your_df_list, process_single_df)

补充说明

  • 如果数据存在缺失值,cov()会返回NA,上述两种方案都加入了缺失值过滤逻辑
  • 确保所有数据框的列名一致(尤其是ret列和风险参数列),避免因列名不匹配导致报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:20:25