Я могу прокручивать и рассчитывать доходность за ночь / выходные для списка тикеров, когда период времени одинаков для каждого тикера, но у меня возникают проблемы, когда период времени, который я хочу найти, отличается для каждого тикера .
Например, с:
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)
}
Как я могу добавить аспект цикла дат к вышеуказанному циклу тикера?