我无法在 R 中始终如一地导入股票数据

I can't import stock data consistently in R

以下是我使用的代码:

library(quantmod)
library(timetk)
library(dplyr)
library(tibble)
library(tidyr)

# Start date: mdate => character
mdate <- "2015-10-30"

# End date: edate => character
edate <- "2016-01-07"

tickers <- c("VYM","WELL","WM","WMB","WMC","WRB","XLG","XLV","XPO","XRX","YUM","ZSL","AA","ACC","ACM","ACN","ADS","ADX","AEE","AEP","AFG","AI","AIG","AIT","AIV","AJG","ALEX","ALK","AMP","AMRC","AON","ASH","AXP","BDC","BDN","BHLB","BIG","BK","BOE","BRO","BTE","BTO","BYD",
             "CAH","CAPE","CBRE","CBU","CEE","CHK","CHT","CHU","CIA","CNI","COF","CPAC","CSD","CSL","CXO","CYH","CZA","DCI","DFS","DGZ","DHR","DLB","DNR","DPG","DRI","DRN","DSI","DTO","DTQ","DVA","EFC","EIX","EMR","EPD","EQL","ERJ","ERUS","ERX","ES","ETN","ETR","EUO",
             "EUSA","EW","EWI","EWT","EWZ","EZM","FDS","FENG","FFA","FIS","FLR","FMX","FPX","FVL","FXH","FXL","FXR","GAM","GDOT","GE","GEF","GF","GFI","GGB","GGG","GLW","GNRC","GPM","GRA","GS","HBM","HCA","HCI","HE","HLX","HQL","HSC","HUM","IAK","IBN","IDA","IGA","IGD",
             "IGM","IHF","IJH","IJJ","IJK","IRM","IT","ITOT","ITT","IVOG","IVOO","IWF","IWN","IWP","IWR","IWY","IXN","IYC","IYF","IYW","JCI","JJM","JKE","JKG","JKH","JKK","JNJ","JTA","KAI","KAR","KBE","KEY","KOP","KRG","L","LEG","LGI","LH","LLY","MDP","MDY","MDYV","MEI",
             "MFC","MGK","MLM","MN","MNR","MOS","MRO","MSCI","MSM","MTB","MTZ","NC","NE","NGVC","NIE","NMR","NTZ","NVS","ODC","OMI","OXY","PEG","PEI","PFS","PHI","PIN","PJP","PNR","PNW","POR","PPA","PSJ","PSX","RBS","RFP","RGI","ROK","ROP","RPG","RPM","RWJ","RWK","RYT",
             "RZG","RZV","SCHA","SCHM","SCS","SF","SFUN","SHW","SIG","SLB","SLYG","SLYV","SMM","SNE","SNN","SPHB","SPHQ","SSD","STAG","STN","STT","SYK","SZC","TFX","TRC","TSM","TSU","TTC","TY","UA","UAA","UBA","UFS","UGE","UMC","USA","USB","UTI","VAL","VB","VBK","VCR",
             "VFH","VGT","VIS","VLO","VMC","VOT","VUG","WAB","WBK","WFC","WHR","WMT","WNS","WRE","XLF","XLI","XLK","XLY","XOP","XSW","XTL","XYL","ZBH","AAN","AAP","AB","ABM","ACCO","AEO","AGN","AL","ALSN","AME","ANF","APH","APTV","ARC","AWI","AZN","BA","BAC","BAH","BAL",
             "BBD","BBW","BBY","BGY","BITA","BKD","BKE","BLX","BOIL","BVN","BXS","C","CALX","CATO","CE","CEO","CFR","CHA","CHS","CLB","CLR","CM","CMI","CNO","CO","CODI","CRI","CRK","CURE","CW","CZZ","DAC","DAL","DDM","DDS","DHI","DK","DKL","DKS","DRH","DY","DZZ","EBS",
             "EDU","EE","EGY","ELP","ENS","EOD","EPI","ESE","ESI","ETH","EV","EVC","EXP","FAS","FHN","FICO","FIX","FL","FLS","FNB","GBX","GCAP","GCO","GFF","GLL","GME","GNC","GNE","GPC","GWW","HBI","HEIa","HFC","HI","HIG","HJV","HNI","HNP","HOG","HOV","HPQ","HRC","HRL",
             "HTH","IIF","INCO","ITUB","IYG","JBL","JBN","JCP","JJC","JKJ","JNPR","JPM","JWN","KBR","KCE","KMF","KMT","KNL","KNX","KRE","KSS","KTP","KW","KWR","LAZ","LB","CMU","CXE","DBL","DJCI","DNP","DSM","E","ECON","EMLC","EWV","FMY","FUD","FXB","GEO","GSC","HYB",
             "HYMB","IBND","IGI","IVR","JPI","JRO","LTPZ","MAC","MEN","MRC","MYD","NIB","NLSN","NPV","NR","NXP","OIA","ORN","PAI","PFD","PFN","PFO","PKI","PMT","RJA","RNR","RZA","SAM","SCJ","SKT","SLV","STIP","TDTT","TEF","TIPZ","TMO","TOT","UNF","USL","VVR","VZ","WD",
             "WIP","EVRG","A","AGZ","ASEA","AXE","BLV","BOX","CTS","DAR","EC","EOG","ET","EWM","EWS","EXD","FAN","FLRN","FLY","FTI","FUN","FXA","GDO","HYS","HYT","IBA","IGT","K","KSA","KT","LIT","LQD","MHN","MIC","MINT","MIY","MNE","MSA","NUW","NWN","NXR","OMC","PAA",
             "PAC","PCY","PGF","PRGO","PSP","RBC","RSG","RWT","SAN","SEM","SOR","SPG","SRF","TBX","TCP","TNK","VCV","XLE","XME","ASR","CNA","CSU","CVA","DHF","DHS","DHX","DVYE","DZK","ECNS","EPHE","EPP","EWG","FCX","FE","FXN","GAL","GTY","GXF","HIW","HMN","HTA","IDT",
             "INN","JLL","JMP","KSU","MAA","MGA","MMC","NYT","OXM","PAG","PHG","PIM","PKG","PPG","PPL","PST","RNP","SAP","SCHE","SJR","SPE","STON","SXT","TDS","TEI","TEX","TTT","UDR","VDC","WEC","WU","CNC","DIA","EGP","EPS","FBC","FCF","FDN","FFG","FIF","FLT","FXD","GDV",
             "GGT","GIB","GPK","HEDJ","HT","IAI","IAT","IDE","IHD","IHE","IVW","IVZ","IWB","IWL","JDD","JKL","KFY","LM","LNN","LRN","MDYG","MET","MGU","MTOR","MTW","NBHC","NHF","NLS","NOA","NOC","NOV","NX","ORI","OSK","PBD")


dlist <- vector("list", length(unique(tickers)))

# Use quatmod api to retrieve stock data from yahoo finance, dlist => list of xts objects
dlist <- lapply(seq_along(unique(tickers)), function(i){
  res <- NULL
  try_var <- try(getSymbols(tickers[i], from = mdate, to = edate, auto.assign = FALSE))
  if(inherits(try_var, "try-error")) {
    i <- i + 1
  } else{
    res <- getSymbols(tickers[i], from = mdate, to = edate, auto.assign = FALSE)   
  }
  return(res)
}
)

问题是有时我可以获得 500 个代码的数据,但有时是 200 个。当我尝试导入少量代码时,导入数据没有问题。 我应该怎么做才能解决这个问题?

尝试每 n 次自动收报机添加一些睡眠时间(比如 3 秒)。

library(quantmod)

dlist <- lapply(seq_along(unique(tickers)), function(i){
    if(i %% 10 == 0)  Sys.sleep(3)
    try_var <- try(getSymbols(tickers[i],
                    from = mdate, to = edate, auto.assign = FALSE))
    if(inherits(try_var, "try-error")) {
       i <- i + 1
    } else{
      res <- getSymbols(tickers[i], 
                        from = mdate, to = edate, auto.assign = FALSE)   
    }
      return(res)
})

您可以 increase/decrease n 从 10 到任何适合您的数字,使用反复试验。

使用 TTR 和来自纳斯达克网站的一些 csv 文件,我们可以确定股票代码是否有效(仅考虑某些市场),这将有助于缓解无限循环,我们将环绕原始迭代API查询代码:

# Install pacakges if they are not already installed: necessary_packages => character vector
necessary_packages <- c("quantmod", "TTR")

# Create a vector containing the names of any packages needing installation:
# new_pacakges => character vector
new_packages <- necessary_packages[!(necessary_packages %in% installed.packages()[, "Package"])]

# If the vector has more than 0 values, install the new pacakges
# (and their) associated dependencies: varied => stdout
if(length(new_packages) > 0){install.packages(new_packages, dependencies = TRUE)}

# Initialise the packages in the session: bool => stdout
lapply(necessary_packages, require, character.only = TRUE)

# Start date: mdate => character
mdate <- "2015-10-30"

# End date: edate => character
edate <- "2016-01-07"

# store character vectors of all tickers to query: tickers => character vector
tickers <- c("VYM","WELL","WM","WMB","WMC","WRB","XLG","XLV","XPO","XRX","YUM","ZSL","AA","ACC","ACM","ACN","ADS","ADX","AEE","AEP","AFG","AI","AIG","AIT","AIV","AJG","ALEX","ALK","AMP","AMRC","AON","ASH","AXP","BDC","BDN","BHLB","BIG","BK","BOE","BRO","BTE","BTO","BYD",
             "CAH","CAPE","CBRE","CBU","CEE","CHK","CHT","CHU","CIA","CNI","COF","CPAC","CSD","CSL","CXO","CYH","CZA","DCI","DFS","DGZ","DHR","DLB","DNR","DPG","DRI","DRN","DSI","DTO","DTQ","DVA","EFC","EIX","EMR","EPD","EQL","ERJ","ERUS","ERX","ES","ETN","ETR","EUO",
             "EUSA","EW","EWI","EWT","EWZ","EZM","FDS","FENG","FFA","FIS","FLR","FMX","FPX","FVL","FXH","FXL","FXR","GAM","GDOT","GE","GEF","GF","GFI","GGB","GGG","GLW","GNRC","GPM","GRA","GS","HBM","HCA","HCI","HE","HLX","HQL","HSC","HUM","IAK","IBN","IDA","IGA","IGD",
             "IGM","IHF","IJH","IJJ","IJK","IRM","IT","ITOT","ITT","IVOG","IVOO","IWF","IWN","IWP","IWR","IWY","IXN","IYC","IYF","IYW","JCI","JJM","JKE","JKG","JKH","JKK","JNJ","JTA","KAI","KAR","KBE","KEY","KOP","KRG","L","LEG","LGI","LH","LLY","MDP","MDY","MDYV","MEI",
             "MFC","MGK","MLM","MN","MNR","MOS","MRO","MSCI","MSM","MTB","MTZ","NC","NE","NGVC","NIE","NMR","NTZ","NVS","ODC","OMI","OXY","PEG","PEI","PFS","PHI","PIN","PJP","PNR","PNW","POR","PPA","PSJ","PSX","RBS","RFP","RGI","ROK","ROP","RPG","RPM","RWJ","RWK","RYT",
             "RZG","RZV","SCHA","SCHM","SCS","SF","SFUN","SHW","SIG","SLB","SLYG","SLYV","SMM","SNE","SNN","SPHB","SPHQ","SSD","STAG","STN","STT","SYK","SZC","TFX","TRC","TSM","TSU","TTC","TY","UA","UAA","UBA","UFS","UGE","UMC","USA","USB","UTI","VAL","VB","VBK","VCR",
             "VFH","VGT","VIS","VLO","VMC","VOT","VUG","WAB","WBK","WFC","WHR","WMT","WNS","WRE","XLF","XLI","XLK","XLY","XOP","XSW","XTL","XYL","ZBH","AAN","AAP","AB","ABM","ACCO","AEO","AGN","AL","ALSN","AME","ANF","APH","APTV","ARC","AWI","AZN","BA","BAC","BAH","BAL",
             "BBD","BBW","BBY","BGY","BITA","BKD","BKE","BLX","BOIL","BVN","BXS","C","CALX","CATO","CE","CEO","CFR","CHA","CHS","CLB","CLR","CM","CMI","CNO","CO","CODI","CRI","CRK","CURE","CW","CZZ","DAC","DAL","DDM","DDS","DHI","DK","DKL","DKS","DRH","DY","DZZ","EBS",
             "EDU","EE","EGY","ELP","ENS","EOD","EPI","ESE","ESI","ETH","EV","EVC","EXP","FAS","FHN","FICO","FIX","FL","FLS","FNB","GBX","GCAP","GCO","GFF","GLL","GME","GNC","GNE","GPC","GWW","HBI","HEIa","HFC","HI","HIG","HJV","HNI","HNP","HOG","HOV","HPQ","HRC","HRL",
             "HTH","IIF","INCO","ITUB","IYG","JBL","JBN","JCP","JJC","JKJ","JNPR","JPM","JWN","KBR","KCE","KMF","KMT","KNL","KNX","KRE","KSS","KTP","KW","KWR","LAZ","LB","CMU","CXE","DBL","DJCI","DNP","DSM","E","ECON","EMLC","EWV","FMY","FUD","FXB","GEO","GSC","HYB",
             "HYMB","IBND","IGI","IVR","JPI","JRO","LTPZ","MAC","MEN","MRC","MYD","NIB","NLSN","NPV","NR","NXP","OIA","ORN","PAI","PFD","PFN","PFO","PKI","PMT","RJA","RNR","RZA","SAM","SCJ","SKT","SLV","STIP","TDTT","TEF","TIPZ","TMO","TOT","UNF","USL","VVR","VZ","WD",
             "WIP","EVRG","A","AGZ","ASEA","AXE","BLV","BOX","CTS","DAR","EC","EOG","ET","EWM","EWS","EXD","FAN","FLRN","FLY","FTI","FUN","FXA","GDO","HYS","HYT","IBA","IGT","K","KSA","KT","LIT","LQD","MHN","MIC","MINT","MIY","MNE","MSA","NUW","NWN","NXR","OMC","PAA",
             "PAC","PCY","PGF","PRGO","PSP","RBC","RSG","RWT","SAN","SEM","SOR","SPG","SRF","TBX","TCP","TNK","VCV","XLE","XME","ASR","CNA","CSU","CVA","DHF","DHS","DHX","DVYE","DZK","ECNS","EPHE","EPP","EWG","FCX","FE","FXN","GAL","GTY","GXF","HIW","HMN","HTA","IDT",
             "INN","JLL","JMP","KSU","MAA","MGA","MMC","NYT","OXM","PAG","PHG","PIM","PKG","PPG","PPL","PST","RNP","SAP","SCHE","SJR","SPE","STON","SXT","TDS","TEI","TEX","TTT","UDR","VDC","WEC","WU","CNC","DIA","EGP","EPS","FBC","FCF","FDN","FFG","FIF","FLT","FXD","GDV",
             "GGT","GIB","GPK","HEDJ","HT","IAI","IAT","IDE","IHD","IHE","IVW","IVZ","IWB","IWL","JDD","JKL","KFY","LM","LNN","LRN","MDYG","MET","MGU","MTOR","MTW","NBHC","NHF","NLS","NOA","NOC","NOV","NX","ORI","OSK","PBD")

# URLs containing tickers for different exchanges: 
urls <- c("https://old.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download", 
          "https://old.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=amex&render=download", 
          "https://old.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nyse&render=download")

# Function to retrieve tickers from nasdaq.com: ticker_retriever => function: 
# Parameter character vector or urls, Returned object character vector of tickers
ticker_retriever <- function(urls){ 
      unique(unlist(lapply(seq_along(urls), function(i){
        as.character(read.csv(urls[i])[,c("Symbol"), drop = TRUE])
        }
      )
    )
  )
}


# Store unique and valid tickers: valid_tickers => character vector: 
stock_symbols <- unique(c(as.character(stockSymbols()$Symbol), ticker_retriever(urls)))

# Store unique ticker values from the ticker vector: unique_tickers => character vector
unique_tickers <- unique(tickers)

# Subset the unique_tickers to only contain those tickers also present 
# in the stock_symbols vector: valid_tickers => character vector 
valid_tickers <- unique_tickers[unique_tickers %in% stock_symbols]

# Copy the valid_tickers vector to iterate through in the loop:
# valid_tickers => character vector: 
current_tickers <- valid_tickers

# Create an empty list to store xts objects: dlist => list 
dlist <- setNames(vector("list", length(valid_tickers)), valid_tickers)

# POSIXct scalar used in calc to break the loop if run over time: start_time => POSIXct
start_time <- Sys.time() 

# POSIXct scalar used to break the loop if run over time
run_time <- as.numeric(0)

# Use quatmod API to defensively retrieve stock data from Yahoo Finance, dlist => list of xts objects
while(length(current_tickers) > 0 || run_time <= 10){ 
  # Subset out the tickers we have data for: current_tickers => character vector
  current_tickers <- current_tickers[sapply(dlist[current_tickers], is.null)]
  # Store the yahoo-finance xts objects into the list elements still requiring data: 
  # dlist => list of xts objects
  dlist[current_tickers] <- lapply(seq_along(current_tickers), function(i){
    # Reset res object to the default value NULL: res => NULL object
    res <- NULL
    # Try to retrieve OHLCAV values from Yahoo finance for date range: try_var => try object
    try_var <- try(getSymbols(current_tickers[i], from = mdate, to = edate, auto.assign = FALSE))
    # If there is an error retrieving the data increment the iterator i by 1: i integer scalar
    if(inherits(try_var, "try-error")) {
      i <- i + 1
      # Otherwise retrieve the xts object for the current ticker: res => xts
    } else{
      res <- getSymbols(current_tickers[i], from = mdate, to = edate, auto.assign = FALSE)
    }
    # POSIXct scalar used in calc to break the loop if run over time: end_time => POSIXct 
    end_time <- Sys.time() 
    # Loop breaking object: 
    run_time <- as.numeric(difftime(end_time, start_time, units = "mins"))
    # Return res object and store it in the list: Res => dlist list of xts objects 
    return(res)
    }
  )
}

# Column bind all xts objects in the list: data => xts
data <- do.call("cbind", dlist)



 # Transpose data.frame: td_data => data.frame
td_data <- within(data.frame(price_var = row.names(t(data)), t(data), row.names = NULL), 
                  {
                    ticker_cd <- as.factor(gsub("[.].*", "", gsub("[.]\d$", "", price_var)))
                    price_var <- as.factor(gsub(".*[.]", "", gsub("[.]\d$", "", price_var))) 
                  }
)

# Re-order vectors; keep complete cases: td_data_o => data.frame
td_data_o <- td_data[complete.cases(td_data), 
                     c(names(td_data)[sapply(td_data, is.factor)],  
                       names(td_data)[sapply(td_data, function(x){!is.factor(x)})])]

# Reshape: abc => data.frame
abc4 <- do.call("cbind", split(td_data_o, td_data_o$price_var))