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

如何在R的quantmod中使用getSymbols自动排除获取失败的股票?

自动排除雅虎财经数据获取失败的股票

问题背景

我需要用yfR和quantmod从雅虎财经提取100只富时指数(FTSE)成分股的日收益率,后续用于计算平均日收益率、协方差并应用于遗传算法。现有实现代码如下:

library(yfR)
library(quantmod)

df_ftse <- yf_index_composition("FTSE")

assets <- sample(df_ftse$ticker, 100)

dailyReturns = lapply(assets, function(sym) {
  dailyReturn(na.omit(getSymbols(sym, from="2021-01-01", to="2022-01-01", auto.assign=FALSE)))
})

但部分股票会出现数据获取失败的情况,抛出如下错误:

Error in getSymbols.yahoo(Symbols = "ABF", env = <environment>, verbose = FALSE,  : 
  Unable to import “ABF”.
attempt to set an attribute on NULL

需要自动排除这些获取失败的股票,之前尝试na.omit无效,寻求可行方案。

解决方案

核心思路是用tryCatch捕获数据获取过程中的错误,跳过失败的股票;同时通过循环采样确保最终能得到100只有效的股票数据。

修改后的完整代码

library(yfR)
library(quantmod)

# 获取富时指数成分股列表
df_ftse <- yf_index_composition("FTSE")
# 存储有效收益率的列表
valid_returns <- list()
# 目标有效股票数量
target_count <- 100

# 循环采样直到凑够目标数量的有效股票
while (length(valid_returns) < target_count) {
  # 筛选出尚未尝试过的股票,避免重复踩坑
  remaining_tickers <- setdiff(df_ftse$ticker, names(valid_returns))
  if (length(remaining_tickers) == 0) {
    message("已无剩余股票可采样,最终有效股票数量:", length(valid_returns))
    break
  }
  
  # 采样当前需要补充的股票数量
  need_count <- target_count - length(valid_returns)
  sample_tickers <- sample(remaining_tickers, need_count)
  
  # 批量处理每只股票,捕获错误
  temp_results <- lapply(sample_tickers, function(sym) {
    tryCatch({
      # 获取股票价格数据
      price_data <- getSymbols(sym, from = "2021-01-01", to = "2022-01-01", auto.assign = FALSE)
      # 检查是否获取到有效数据
      if (is.null(price_data) || nrow(price_data) == 0) {
        message(paste("股票", sym, "无有效价格数据,跳过"))
        return(NULL)
      }
      # 计算日收益率并处理缺失值
      daily_ret <- dailyReturn(na.omit(price_data))
      # 给收益率序列命名,方便后续合并识别
      names(daily_ret) <- sym
      daily_ret
    }, error = function(e) {
      # 打印错误信息,便于排查问题
      message(paste("处理股票", sym, "失败:", e$message))
      NULL
    })
  })
  
  # 过滤掉NULL结果,加入有效列表
  valid_returns <- c(valid_returns, Filter(Negate(is.null), temp_results))
}

# 将有效收益率列表合并为数据框,方便后续计算
returns_dataframe <- do.call(cbind, valid_returns)

关键说明

  • 错误捕获:用tryCatch包裹数据获取和收益率计算的逻辑,遇到错误时返回NULL并打印提示信息,不中断整个流程。
  • 避免重复采样:每次采样只从尚未尝试过的股票中选取,减少重复遇到失败股票的概率。
  • 数据有效性检查:额外检查获取到的价格数据是否为空,避免因数据为空导致后续计算出错。
  • 结果合并:将有效收益率序列合并为数据框,方便后续计算平均日收益率、协方差等指标。

内容的提问来源于stack exchange,提问作者Cal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:15:09