У меня возникла ошибка при запуске кода в R Studio - PullRequest
2 голосов
/ 30 мая 2020

Вот коды, которые я использую

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


mdate <- "2015-10-30"
edate <- "2016-01-05"

tickers <- c("ABG","ACH","ADM","AEG","AEM","AGQ","AGRO","AKOb","APO")


data <- do.call(cbind.data.frame, lapply(tickers, function(x) 
  getSymbols(x, from = mdate, to = edate, auto.assign = F)))


# Transpose 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))
                  }
)
# Reshape: 
abc <- do.call("cbind", split(td_data, td_data$price_var))

Когда я их запустил, я получил:

Ошибка в data.frame (..., check.names = FALSE): arguments подразумевают разное количество строк: 44, 38 Дополнительно: Предупреждение: AKOb содержит пропущенные значения. Некоторые функции не будут работать, если объекты содержат пропущенные значения в середине ряда. Рассмотрите возможность использования na.omit (), na.approx (), na.fill (), et c, чтобы удалить или заменить их.

Я обнаружил, что эта ошибка была вызвана «AKOB». Данные за первый и шестой дни пустые, поэтому первый день «AKOB» начался 9 ноября 2015 года, что отличается от других биржевых данных. Я нашел способ бегать по одному и сравнивать их различия. Когда бы это ни происходило, это очень неэффективный способ.

Я хочу пропустить, если у акции нет данных в моих настройках (с даты начала до даты окончания) Как я могу это сделать?

1 Ответ

1 голос
/ 31 мая 2020
library(quantmod)

mdate <- "2015-10-30"
edate <- "2016-01-05"

tickers <- c("ABG","ACH","ADM","AEG","AEM","AGQ","AGRO","AKOb","APO", "JJE")

# Iterate through the tickers and retrieve data from Yahoo Finance defensively: data => xts
data <- do.call("cbind", lapply(seq_along(tickers), function(i){
        try_var <- try(getSymbols(tickers[i], from = mdate, to = edate, auto.assign = FALSE))
        if(inherits(try_var, "try-error")) {
          i <- i + 1
        } else{
          getSymbols(tickers[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
abc <- do.call("cbind", split(td_data_o, td_data_o$price_var))
...