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

如何用R的dplyr包计算同类别分组内各股票的相关性?

用dplyr实现按类别分组计算股票两两相关性

核心思路

要实现按类别分组计算股票两两相关性,需先把数据转换成宽格式(日期为行、股票为列),再针对每个类别生成股票的所有两两组合,最后计算每对组合的相关性并整理成目标格式。

针对股票数据集的实现代码

library(tidyverse)
library(tidyquant)

# 原始数据准备
Category = c("Social","Social","Internet","Technology",
             "Technology","Internet","Internet")
symbol = c("TWTR","FB","GOOG","TSLA","NOK","AMZN","AAPL")
A = tibble(Category,symbol)
B = tq_get(symbol, from = "2021-01-01", to = "2022-01-01")
BA = left_join(B,A,by="symbol") %>% select(symbol, Category, date, close)

# 核心处理步骤
result <- BA %>%
  # 按类别分组,转成宽格式:日期为行,股票代码为列,值为收盘价
  group_by(Category) %>%
  pivot_wider(names_from = symbol, values_from = close) %>%
  ungroup() %>%
  # 按类别拆分数据框
  group_split(Category) %>%
  # 逐个处理每个类别的数据
  map_dfr(function(df) {
    current_cat <- df$Category[1]
    # 提取当前类别下的所有股票列
    stock_cols <- df %>% select(-Category, -date) %>% colnames()
    # 生成所有不重复的两两股票组合
    stock_pairs <- combn(stock_cols, 2, simplify = FALSE)
    # 对每个组合计算相关性并整理成数据框
    map_dfr(stock_pairs, function(pair) {
      cor_value <- cor(df[[pair[1]]], df[[pair[2]]], use = "complete.obs")
      tibble(
        Category = current_cat,
        Stock1 = pair[1],
        Stock2 = pair[2],
        cor = round(cor_value, 4)
      )
    })
  })

# 查看最终结果
print(result)

代码说明

  1. 数据筛选:先保留symbol、Category、date、close四列,只保留后续计算必需的数据。
  2. 宽格式转换:按类别分组后用pivot_wider转换格式,确保同一日期下的不同股票收盘价在同一行,方便计算相关性。
  3. 组合生成:用group_split拆分不同类别的数据,再通过combn生成每个类别内股票的所有两两组合(避免重复计算,比如只生成TWTR-FB而非FB-TWTR)。
  4. 相关性计算:用cor函数计算每对股票收盘价的相关性,use = "complete.obs"用于自动忽略缺失值。
  5. 结果整合:通过map_dfr把所有类别的计算结果合并成一个统一的数据框,完全匹配你需要的输出格式。

用测试数据验证

如果用你提供的测试数据data2,可以套用相同逻辑实现:

# 测试数据处理
test_result <- data2 %>%
  group_by(group2) %>%
  pivot_wider(names_from = var2, values_from = y2) %>%
  ungroup() %>%
  group_split(group2) %>%
  map_dfr(function(df) {
    current_grp <- df$group2[1]
    var_cols <- df %>% select(-group2) %>% colnames()
    var_pairs <- combn(var_cols, 2, simplify = FALSE)
    map_dfr(var_pairs, function(pair) {
      cor_value <- cor(df[[pair[1]]], df[[pair[2]]], use = "complete.obs")
      tibble(
        group2 = current_grp,
        Var1 = pair[1],
        Var2 = pair[2],
        cor = round(cor_value, 4)
      )
    })
  })

print(test_result)

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:45:35