如何用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)
代码说明
- 数据筛选:先保留
symbol、Category、date、close四列,只保留后续计算必需的数据。 - 宽格式转换:按类别分组后用
pivot_wider转换格式,确保同一日期下的不同股票收盘价在同一行,方便计算相关性。 - 组合生成:用
group_split拆分不同类别的数据,再通过combn生成每个类别内股票的所有两两组合(避免重复计算,比如只生成TWTR-FB而非FB-TWTR)。 - 相关性计算:用
cor函数计算每对股票收盘价的相关性,use = "complete.obs"用于自动忽略缺失值。 - 结果整合:通过
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
相关产品推荐
相关产品推荐

