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

统计股票分月度正收益占比与平均收益,修复代码报错问题

问题修复与实现方案

一、修复现有代码的报错

你的代码报错核心原因是: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:45:54