2016-08-21 19 views
1

我通過使用as.Date序列子集化的xts對象日期序列XTS:如何子集由認爲工作日

library("quantmod") 

getSymbols("AAPL",from="2003-01-01") 
# indx sequence 
indx <- seq(as.Date('2003-03-31'), length.out=200, by='4 weeks') 

SELECT <- AAPL[paste(indx)] 

如果你看看在最後2行中SELECT,我看它從2016-06-06跳到2016-08-01這不是4周。它缺少2016-07-04,但由於這不是工作日,所以它跳過了它。如果indx不是營業日,我如何返回SELECT將返回下一個可用營業日?在這個例子中,它應該返回2016-07-05 ...

回答

1

在營業日,我想你的意思是AAPL的交易日,在這種情況下,您的營業日實際上是AAPL證券的時間指數。

第一性原理使用的事實日期樣的辦法可以增加1:

indx <- seq(as.Date('2003-03-31'), length.out=200, by='4 weeks') 
indx <- indx[indx < as.Date(end(AAPL))] 
while(!all(indx %in% as.Date(index(AAPL)))) { 
    # You ask for the next available business day: 
    indx[!indx %in% as.Date(index(AAPL))] <- indx[!indx %in% as.Date(index(AAPL))] + 1 
    # Careful that the last indx value does not go past as.Date(end(AAPL)) 
    if (indx[length(indx)] > as.Date(end(AAPL))) { 
     indx[length(indx)] <- as.Date(end(AAPL)) 
    } 
} 

SELECT <- AAPL[indx] 
tail(SELECT) 
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
# 2016-03-14 101.91 102.91 101.78  102.52 25076100  101.35055 
# 2016-04-11 108.97 110.61 108.83  109.02 29407500  107.77640 
# 2016-05-09  93.00  93.77 92.59  92.79 32936400  92.29005 
# 2016-06-06  97.99 101.89 97.55  98.63 23292500  98.09858 
# 2016-07-05  95.39  95.40 94.46  94.99 27705200  94.47819 
# 2016-08-01 104.41 106.15 104.41  106.05 38167900  105.47860 

您也可能會發現通過timeDate包有用的解決方案一般多爲商務日期類型子集。例如http://stackoverflow.com/questions/13673895/r-time-series-data-daily-only-working-days