将股票数据导入 r 时出现错误
I got an error when to import stock data into r
以下是我使用的代码:
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 之间不存在。
导入股票数据时如何跳过不存在的代码?
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))
以下是我使用的代码:
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 之间不存在。 导入股票数据时如何跳过不存在的代码?
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))