统计股票分月度正收益占比与平均收益,修复代码报错问题
问题修复与实现方案
一、修复现有代码的报错
你的代码报错核心原因是:names(stock)[1]提取的是类似AA.Open的列名,拼接出的positive_name和实际的正收益列名(比如AA.Return.Positive)不匹配,同时xts对象的索引处理也容易出现逻辑问题。修复后的代码如下:
library(stringi) positive_stocks <- list() for (i in seq_along(all_stocks)) { stock <- all_stocks[[i]] # 正确提取股票代码 ticker <- stri_extract(names(stock)[1], regex = "^[A-Z]+") positive_name <- paste0(ticker, ".Return.Positive") # 检查列是否存在,同时处理NA值 if (positive_name %in% colnames(stock) && all(stock[, positive_name], na.rm = TRUE)) { positive_stocks[[ticker]] <- stock } } positive_stock_names <- names(positive_stocks) print(positive_stock_names)
二、实现分月份业绩概览的最优方案
推荐用dplyr+lubridate+purrr的组合来处理,逻辑更清晰,结果更结构化。步骤如下:
首先安装并加载依赖包(如果未安装):
install.packages(c("dplyr", "lubridate", "purrr", "scales")) library(dplyr) library(lubridate) library(purrr) library(scales) library(stringi)
然后编写批量处理函数,生成每只股票的分月份业绩概览:
# 单只股票的分月份业绩计算函数 monthly_performance <- function(stock_data) { # 提取股票代码 ticker <- stri_extract(names(stock_data)[1], regex = "^[A-Z]+") # 将xts数据转为数据框,提取日期和月份 df <- as.data.frame(stock_data) %>% mutate( date = index(stock_data), month = month(date, label = TRUE, abbr = FALSE) # 提取月份全称,如"一月" ) %>% select(date, month, contains(".Return"), contains(".Positive")) # 按月份分组计算核心指标 perf_summary <- df %>% group_by(month) %>% summarise( 平均收益 = mean(!!sym(paste0(ticker, ".Return")), na.rm = TRUE), 正收益占比 = mean(!!sym(paste0(ticker, ".Return.Positive")), na.rm = TRUE) * 100, 统计年份数 = n(), .groups = "drop" ) %>% mutate( 平均收益 = percent(平均收益, accuracy = 0.1), # 转为百分比格式 正收益占比 = paste0(round(正收益占比, 1), "%") ) # 添加股票代码标识 perf_summary <- perf_summary %>% relocate(股票代码 = ticker, .before = month) return(perf_summary) } # 批量处理所有股票,得到结果列表 all_monthly_perf <- map(all_stocks, monthly_performance) # 示例:查看特斯拉(TSLA)的分月份业绩 print(all_monthly_perf$TSLA)
运行后,all_monthly_perf就是你需要的列表,每个元素对应一只股票的分月份业绩数据,包含股票代码、月份、平均收益、正收益占比和统计年份数,格式清晰易读。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

