Поиск тикеров для разных периодов времени в цикле с quantmod

Я могу прокручивать и рассчитывать доходность за ночь / выходные для списка тикеров, когда период времени одинаков для каждого тикера, но у меня возникают проблемы, когда период времени, который я хочу найти, отличается для каждого тикера .

Например, с:

symbols <- c("AAPL", "GOOG"," MSFT")
dates <- as.Date(c("2015-01-04", "2015-01-05", "2015-01-06"))
example.df <- data.frame(tickers, dates)
example.df
  tickers dates
1    AAPL 2015-01-04
2    GOOG 2015-01-05
3    MSFT 2015-01-06

Я бы хотел получить возврат в ночное время для AAPL в период с 04.01.2015 по 05.01.2015, для GOOG с 05.01.2015 по 06.01.2015 и т. Д. Если бы это была пятница, я бы хотел следующий понедельник.

Я могу получить то, что ищу, просматривая каждый тикер следующим образом:

library(quantmod)
library(dplyr)
# date range accounts for weekends
getSymbols("AAPL", from = "2016-01-04", to = "2016-01-08")
data <- as.data.frame(AAPL)
colnames(data) <- c("open","high","low","close","volume","adj.")
# overnight return calculation
data$overnight.return <- data$open / lag(data$close, default = 0) - 1
data$overnight.return <- paste(round(data$overnight.return * 100, 3), "%",sep= "") 
# the overnight/over-weekend returns for the specified date
data.df.final <- slice(data, 2)

Конечно, это ужасно медленно. Вот насколько я смог сделать из этого цикл:

# needs to be a loop itself and inside the other 'for' loop somehow I think
symbol.list <- example.df[,1]
start <-  data[,2]
end <- data[,2] + days(3) 

results <- NULL
for (i in symbol.list) {
  data <- getSymbols(Symbols = i, 
                     src = "yahoo", 
                     from = start, to = end, 
                     auto.assign = FALSE)
  if (inherits(data, 'try-error')) next
  colnames(data) <- c("open","high","low","close","volume","adj.")
  data <- as.data.frame(data)
  data <- cbind(date = rownames(data), data)
  data$overnightRtn <- as.vector(data$open / lag(data$close, default = 0) - 1)
  data$overnightRtn <- paste(round(data$overnightRtn * 100, 3), "%") 
  data <- slice(data, 2)
  results <- bind_rows(results, data)
  }

Как я могу добавить аспект цикла дат к вышеуказанному циклу тикера?


person RyGuy    schedule 19.01.2016    source источник
comment
Привет, RyGuy. Не могли бы вы добавить несколько примеров / воспроизводимых данных? Кроме того, я не очень хорошо понимаю проблему. Однако, если вы хотите суммировать информацию для каждого тикера, и у вас есть таблица со значениями + даты и другая с тикерами + rangeDate, я предпочитаю присоединиться к обеим таблицам, так что информация о тикере, значении, дате будет вместе с дата начала и дата окончания. Имея все это в той же таблице, вы можете просто использовать агрегат или эквивалент в dplyr или data.table для выполнения окончательных вычислений.   -  person Carlos Alberto    schedule 19.01.2016
comment
@ Карлос Альберто, спасибо, что заглянули. В моем первом абзаце после Например, с: вот пример фрейма данных, который я использую. Главный вопрос, который у меня есть, - как я могу использовать количественный мод для циклического просмотра и поиска тикеров во фрейме данных, если все эти тикеры соответствуют разным датам? В моем примере я хочу получить информацию для AAPL 04.01.2015 (и в следующие пару дней), для GOOG 05.01.2015 (и в следующие пару дней) и т. Д. Затем свяжите все эти результаты вместе в один df.   -  person RyGuy    schedule 20.01.2016


Ответы (1)


возможно это то, что вы ищете. Обратите внимание, что я использую индекс, а не фактический список, поэтому я могу ссылаться на каждый элемент вашего фрейма данных (он не оптимизирован, но выполняет ту работу, которую вы описали в функции):

symbols <- c("AAPL", "GOOG"," MSFT")              ## " MSFT" has an extra space
dates <- as.Date(c("2015-01-04", "2015-01-05", "2015-01-06"))
example.df <- data.frame(tickers=symbols, dates)  ## there was an error here in your example.

symbol.list <- trimws(example.df[,1])
start <-  as.Date(example.df[,2])
end <- as.Date(example.df[,2]) + days(3) 

results <- NULL
for (i in 1:NROW(symbol.list)) {
  try(dataX <- getSymbols(Symbols = symbol.list[i], 
                     src = "yahoo", 
                     from = start[i], to = end[i], 
                     auto.assign = FALSE),silent=T)
  if (!exists("dataX")) {cat("Error in ",i,"\n");next}
  colnames(dataX) <- c("open","high","low","close","volume","adj.")
  dataX <- as.data.frame(dataX)
  dataX <- cbind(date = rownames(dataX), dataX)
  dataX$overnightRtn <- as.vector(dataX$open / lag(dataX$close, default = 0) - 1)
  dataX$overnightRtn <- paste(round(dataX$overnightRtn * 100, 3), "%") 
  data2 <- slice(dataX, 2);rm(dataX)
  results <- if (is.null(results)) data2 else rbind(results, data2)
}
person Carlos Alberto    schedule 20.01.2016
comment
. @ Карлос Альберто, извините за мою небрежность в отношении примера и спасибо за терпение и ваше подробное решение. Единственная часть, которая не работает, - это обработка ошибок. Попробуйте: symbols <- c("AAPL", "GOOG","BADTICKER","MSFT"); dates <- as.Date(c("2015-01-03", "2015-01-04", "2015-01-05", "2015-01-06")) Есть идеи, как это исправить? У меня много плохих тикеров, так что это проблема. - person RyGuy; 20.01.2016