求合并PerformanceAnalytics包table.CalendarReturns生成的两张业绩表的可行方案
合并PerformanceAnalytics业绩日历表的可行方案
嘿,我来帮你搞定合并两张table.CalendarReturns生成的业绩表的问题~首先得明确,这个函数输出的是矩阵格式的表格,行是年份、列是月份,值对应各时段的收益率。下面我给你两种常用的合并思路,附完整代码:
第一步:先搞出模拟数据(方便你测试)
先构造投资组合和基准的月度收益数据,再生成对应的业绩日历表:
require(PerformanceAnalytics) set.seed(1) # 生成6年的投资组合月度收益率(xts格式是PerformanceAnalytics的标准输入) port_returns <- xts( sample(-6:14, 72, replace = TRUE)/10, # 72个月=6年,收益率范围-60%到140% order.by = seq(as.Date("2018-01-01"), as.Date("2023-12-01"), by = "month") ) # 生成对应的基准收益率 bench_returns <- xts( sample(-5:15, 72, replace = TRUE)/10, order.by = seq(as.Date("2018-01-01"), as.Date("2023-12-01"), by = "month") ) # 生成两张目标业绩日历表 port_calendar <- table.CalendarReturns(port_returns) bench_calendar <- table.CalendarReturns(bench_returns)
第二步:两种合并方式任你选
方式1:同一年份的业绩并排展示(按列合并)
这种方式适合对比同一年份里,组合和基准每个月的表现,操作很简单:
# 给两个表的列名加上标识,避免重名 colnames(port_calendar) <- paste(colnames(port_calendar), "组合", sep = "_") colnames(bench_calendar) <- paste(colnames(bench_calendar), "基准", sep = "_") # 按行对齐合并(自动匹配年份行) merged_table <- cbind(port_calendar, bench_calendar) # 查看合并后的结果 merged_table
方式2:把两个表堆叠起来(按行合并)
如果想把组合和基准的所有年份数据放在同一列维度下,方便后续分析,可以转成数据框再合并:
# 把矩阵转成数据框,同时添加年份和组别列 port_df <- as.data.frame(port_calendar) port_df$Year <- rownames(port_calendar) # 提取行名作为年份列 port_df$Group <- "投资组合" bench_df <- as.data.frame(bench_calendar) bench_df$Year <- rownames(bench_calendar) bench_df$Group <- "基准" # 堆叠两个数据框 merged_df <- rbind(port_df, bench_df) # 调整列顺序,把年份和组别放在最前面,看着更清晰 merged_df <- merged_df[, c("Year", "Group", colnames(port_calendar))] # 查看结果 merged_df
一些小提醒
- 如果两张表的年份范围不一样,合并前可以先筛选出共同年份,避免出现NA值:
common_years <- intersect(rownames(port_calendar), rownames(bench_calendar)) merged_table <- cbind(port_calendar[common_years, ], bench_calendar[common_years, ]) table.CalendarReturns默认会生成"Annual"合计行,如果不需要,生成表格时可以加个参数annualized = FALSE,或者合并后手动删掉那一行。
内容的提问来源于stack exchange,提问作者Daniel_D
相关产品推荐
相关产品推荐

