提取多个代码时出现 getSplits (Quantmod) 错误

getSplits (Quantmod) error when pulling multiple tickers

当尝试 运行 所有标准普尔 500 指数代码中的 getSplits 函数时,我收到以下错误“open.connection(file, “rt”) 中的错误:HTTP 错误 404)”

如果我对所提供的代码进行子集化并且仅 运行 其中的一部分,我就能够 运行 该功能。有没有办法编写一行代码来绕过任何可能导致 HTTP 错误的代码?

library(tidyverse)
library(BatchGetSymbols)
library(quantmod)

tickers <- GetSP500Stocks()

split_env <- lapply(tickers, function(x) getSplits(x))

您可以使用try()来防止它损坏:

library(tidyverse)
library(BatchGetSymbols)
library(quantmod)

tickers <- GetSP500Stocks()[1:20,]

split_env = lapply(tickers$Tickers,function(x)try(getSplits(x)))
names(split_env) = tickers$Tickers

如果我没记错的话,你可以得到没有错误的

head(split_env[sapply(split_env,is.xts)])
$MMM
           MMM.spl
1972-06-16     0.5
1987-06-16     0.5
1994-04-11     0.5
2003-09-30     0.5

$ABT
           ABT.spl
1981-06-01  0.5000
1986-06-02  0.5000
1990-06-01  0.5000
1992-06-01  0.5000
1998-06-01  0.5000
2004-05-03  0.9356
2013-01-02  0.4798

$ABMD
           ABMD.spl
2000-10-02      0.5

$ACN
           ACN.spl
2011-12-30     0.1

$ATVI
            ATVI.spl
2001-11-21 0.6666667
2003-06-09 0.6666667
2004-03-16 0.6666667
2005-03-23 0.7500000
2005-10-25 0.7500000
2008-09-08 0.5000000

$ADBE
           ADBE.spl
1987-03-12      0.5
1988-11-23      0.5
1993-08-11      0.5
1997-07-29      1.0
1997-10-29      1.0
1999-10-27      0.5
2000-10-25      0.5
2005-05-24      0.5

安装 quantmod v. 0.4.17.2 及更高版本; CRAN还没有这个版本,所以直接从github安装devtools::install_github("joshuaulrich/quantmod") 因为新版本可以处理多个连接和句柄(检查this),你需要这个来向雅虎推送多个请求。

以下函数使用多核。因此,如果需要,可以将 %dopar% 替换为 %do%

RawData.Splits <- function(stocks, from)
{
  x <- foreach(ticker = stocks, .combine = bind_rows
               , .errorhandling = "remove", .inorder = F, .multicombine = T
               ) %dopar%
              {
                x <- tryCatch({suppressWarnings(
                                quantmod::getSplits(ticker, from, envir = .GlobalEnv)
                                )},
                              error = function(e) {data.frame()})

            if(xts::is.xts(x))
            {
              names(x) <- c("split.ratio")
              x <- as.data.frame(x) %>% mutate(split.ds = rownames(.), ticker) %>%
                select(ticker, split.ds, split.ratio)
              
              cat(paste0(ticker, "; "))
            }
            else {x <- data.frame()}
            
            rm(ticker)
            return(x)
          }

  if(nrow(x) > 0) 
  { x <- x %>% mutate(split.ds = as.Date(split.ds), updated.on = Sys.Date()) }
  
  rm(stocks, from)
  return(x)
}