2016-01-19 21 views
2

當每個代碼的時間週期相同時,我可以循環並計算週末/週末回報列表,每當我想查詢的時間段對於每個股票代碼都是不同的時候都會遇到麻煩。使用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 2015-01-04和2015年1月5日之間的2015年1月5日和2015-01之間的隔夜收益,爲GOOG -06等。如果是星期五,我想要下個星期一。

我能得到什麼,我通過查找這樣每個人股票在尋找:

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) 
    } 

我如何可以添加日期循環方面對上述股票循環?

+3

你好RyGuy。你可以添加一些例子/可重複的數據?另外,我不太瞭解這個問題。但是,如果您想彙總每個代碼的信息,並且您有一個包含值+日期和另一個代碼+代碼範圍日期的表格,我寧願加入這兩個表格,以便有關代碼,價值和日期的信息將與開始日期和結束日期。對於同一個表中的所有內容,您可以在dplyr或data.table中使用聚合或等價物來完成最終的數學運算。 –

+0

@Carlos Alberto,感謝您的關注。在我的第一段之後「例如,用:」有我使用的示例數據框。我所具有的突出問題是 - 如果所有這些代碼都對應不同的日期,我怎麼才能使用Quant mod來循環查找數據框中的代碼?在我的例子中,我想在2015-01-04(和接下來的幾天)檢索AAPL的信息,2015-01-05(以及接下來的幾天)等等。然後將所有這些結果綁定在一起一個df。 – RyGuy

回答

2

也許這就是你要找的。請參閱我使用的是指數,而不是實際的列表,以便我可以參考你的數據幀中的每個元素(它不是最佳的,但它是在幫你在函數描述的作業):

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) 
} 
+0

@卡洛斯阿爾貝託,對於我在這個例子上的不快,感謝您對我的支持,並感謝您的詳細解決方案。唯一不工作的部分是錯誤處理。嘗試:符號< - c(「AAPL」,「GOOG」,「BADTICKER」,「MSFT」); 日期< - as.Date(c(「2015-01-03」,「2015-01-04」,「2015-01-05」,「2015-01-06」))'任何想法如何解決這個問題?我有很多不好的選擇,所以這是一個問題。 – RyGuy

+0

謝謝,完美的作品! – RyGuy