【问题标题】:I got an error when to import stock data into r将股票数据导入 r 时出现错误
【发布时间】:2020-06-04 05:22:35
【问题描述】:

这是我使用的代码:

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


mdate <- "2015-10-30"
edate <- "2016-01-07"
tickers4 <- c("RTL","RTM")

data <- do.call("cbind", lapply(seq_along(tickers4), function(i){
  try_var <- try(getSymbols(tickers4[i], from = mdate, to = edate, auto.assign = FALSE))
  if(inherits(try_var, "try-error")) {
    i <- i + 1
  } else{
    getSymbols(tickers4[i], from = mdate, to = edate, auto.assign = FALSE)   
  }
}
)
)

# 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("[.].*", "", price_var))
                    price_var <- as.factor(gsub(".*[.]", "", 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))

当我运行这些代码时,abc4 必须有 288 个变量,但会创建 336 个变量。 第 289 和第 290 的值为“X2”。从第 300 个开始,所有其他值都是“2”。 我发现它是由ticker4中的“RTL”引起的。 mdate 和 edate 之间不存在此代码的值。 导入股票数据时如何跳过不存在的代码?

【问题讨论】:

    标签: r stock


    【解决方案1】:
     library(quantmod)
    # Start date: mdate => character
    mdate <- "2015-10-30"
    
    # End date: edate => character
    edate <- "2016-01-07"
    
    # tickers4 => character vector: 
    tickers4 <- c("RTL","RTM","RTM","RYN","RYU","SAH","SBS","SCCO","SCHC","SCM","SHO","SJI","SLX","SNA","SWN","SWZ","TCO","TDF","THG")
    
    # Create empty list to store xts objects: dlist => list
    dlist <- vector("list", length(unique(tickers4)))
    
    # Use quatmod api to retrieve stock data from yahoo finance, dlist => list of xts objects
    dlist <- lapply(seq_along(unique(tickers4)), function(i){
            res <- NULL
            try_var <- try(getSymbols(tickers4[i], from = mdate, to = edate, auto.assign = FALSE))
            if(inherits(try_var, "try-error")) {
              i <- i + 1
            } else{
              res <- getSymbols(tickers4[i], from = mdate, to = edate, auto.assign = FALSE)   
            }
          return(res)
        }
      )
    
    # Filter out null values from the list, column bind the results: data => xts object
    data <- do.call("cbind", Filter(Negate(is.null), 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))
    

    【讨论】:

    • 再次感谢您。不幸的是,我在使用时遇到了另一个错误: "tickers4
    • @DongchulPark 试试上面的代码。他们使用您的原始示例代码进行工作。当您更改基础数据时,这是一个新问题。最大的问题是您的ticker4 向量中有重复的代码。这会导致名称附加 .1 或 .2。现在这不会是问题。试试上面的代码,如果它符合您的要求,请投票并接受它。
    • @DongchulPark 现在对你有用吗?这段代码应该对丢失的数据,甚至对你的股票向量中的重复是健壮的。
    • 天啊。真的行!非常感谢。你真的是个东西。无论它是否有效,我都会赞成你所有的答案。再次感谢您的宝贵时间和出色的工作。
    • 大声笑,谢谢,抱歉花了一些时间才得到您需要的答案。如果您还有问题,请告诉我。现在您需要做的就是分析数据;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多