如何在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
相关产品推荐
相关产品推荐

