【问题标题】:getSplits (Quantmod) error when pulling multiple tickers拉多个代码时出现 getSplits (Quantmod) 错误
【发布时间】:2020-12-20 05:04:25
【问题描述】:

尝试在所有 S&P 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))

【问题讨论】:

    标签: r quantmod


    【解决方案1】:

    安装 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)
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用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
      

      【讨论】:

      • 我不知道 try() 包装函数!感谢您的解决方案
      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      相关资源
      最近更新 更多