2016-08-16 50 views
0

我想連續綁定每日和每週數據(沒有NA)我正在使用此代碼用於該目的,但我有兩個問題。連續每日和每週數據與R?

library(quantmod) 
aapl=getSymbols("AAPL",from="2015-01-01",auto.assign=F) 
d_aapl=Cl(aapl)/Op(aapl) 
head(d_aapl) 
w_aapl=to.weekly(d_aapl) 

head(w_aapl) 
res=cbind(d_aapl,Cl(w_aapl)) 
head(res,8) 

的第一個問題是用w_aapl=to.weekly(d_aapl)邏輯它應該只僅d_aapl可變的,但其它執行對所有列除了體積和調整爲接近執行to.weekly功能。這裏發生了什麼?

  d_aapl.Open d_aapl.High d_aapl.Low d_aapl.Close 
2015-01-02 0.9815064 0.9815064 0.9815064 0.9815064 
2015-01-09 0.9811617 1.0243522 0.9811617 0.9941422 
2015-01-16 0.9702487 1.0069699 0.9702487 0.9902831 
2015-01-23 1.0081603 1.0194087 1.0055072 1.0060552 
2015-01-30 0.9943731 1.0221802 0.9708237 0.9895270 
2015-02-06 1.0049131 1.0089451 0.9909182 0.9909182 

第二個問題是輸出res。柱結合後我預計一些日子將NA被填充,而是的NA我想用以前的數據

curren result 
      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617   NA 
2015-01-06 0.9973719   NA 
2015-01-07 1.0051306   NA 
2015-01-08 1.0243522   NA 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487   NA 
2015-01-13 0.9891412   NA 

wanted 

      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617 0.9815064 
2015-01-06 0.9973719 0.9815064 
2015-01-07 1.0051306 0.9815064 
2015-01-08 1.0243522 0.9815064 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487 0.9941422 
2015-01-13 0.9891412 0.9941422 

怎麼辦呢?

+2

使用'動物園:: na.locf ()'或'tidyr :: fill()'來解決第二個問題。 – Psidom

+1

爲你的第一個問題設置OHLC參數:'to.weekly(d_aapl,OHLC = FALSE)'。見'?to.weekly'。 –

回答

1

實際的回答你的第一個問題,在你問發生了什麼事:w_aapl=to.weekly(d_aapl)被簡單地返回您的日常d_aapl時間序列的OHLC(這是一個單變量系列),儘管每週數據的前幾行(和後幾行)可能沒有那麼清楚。 (它沒有任何與調整後的價格或卷在你的問題的情況下。)

w_aapl時間戳對應於最後可用天在默認情況下,每個每週彙總,如果你想(閱讀?to.periodindexAt說法將時間戳更改爲一週的開始,但這是回答您的問題的一個側面),每週從週一到週日(週一的數據是下週的第一天)。

由於週末沒有數據,因此您的時間戳將爲每週的最後一個星期五(但如果包含星期日數據,則爲星期日)。也許這將看到的幫助是怎麼回事:

class(coredata(d_aapl)) <- "character" 
v <- xts(order.by = index(d_aapl), x = weekdays(index(d_aapl)), dimnames = list(NULL, "Weekday")) 
head(merge(d_aapl, v), 20) 

#    AAPL.Close   Weekday  
# 2015-01-02 "0.981506445654964" "Friday" 
# 2015-01-05 "0.981161686386908" "Monday" 
# 2015-01-06 "0.997371888517253" "Tuesday" 
# 2015-01-07 "1.00513062514358" "Wednesday" 
# 2015-01-08 "1.02435224688221" "Thursday" 
# 2015-01-09 "0.994142220540378" "Friday" 
# 2015-01-12 "0.970248685084346" "Monday" 
# 2015-01-13 "0.989141173831105" "Tuesday" 
# 2015-01-14 "1.00696993757364" "Wednesday" 
# 2015-01-15 "0.971090909090909" "Thursday" 
# 2015-01-16 "0.990283088762806" "Friday" 
# 2015-01-20 "1.00816028405639" "Tuesday" 
# 2015-01-21 "1.00550716857753" "Wednesday" 
# 2015-01-22 "1.01940867006333" "Thursday" 
# 2015-01-23 "1.00605520909915" "Friday" 
# 2015-01-26 "0.994373131604943" "Monday" 
# 2015-01-27 "0.97082370522725" "Tuesday" 
# 2015-01-28 "0.980277148183554" "Wednesday" 
# 2015-01-29 "1.02218020976616" "Thursday" 
# 2015-01-30 "0.989527044095827" "Friday" 

專門爲您的數據,每一行都會把數據從週一至週五,並分配週五時間戳:

  • 第一週數據條目2015-01-02是一個特殊情況,其取值爲2014-12-29(A星期一)至2015-01-04(A星期天),這僅爲週五的一個值2015-01-02(這就是爲什麼OHLC = C爲第一個每週欄)。
  • 2015-01-09行的數據將從d_aapl2015-01-052015-01-11之間。您可以看到最高點顯然是從2015-01-08,低點位於2015-01-05,開盤價是在2015-01-05範圍內的第一個值,收盤價爲2015-01-09
  • 2015-01-16的數據將取自d_aapl2015-01-122015-01-18等....

關於你提到的第二個問題,其他的答案已經提供了很好的工作,但你也可以考慮看?merge.xts及其fill的說法,這是更簡潔在某些情況下:res=merge(d_aapl,Cl(w_aapl), fill = na.locf)

1

只需添加以下行:

res$d_aapl.Close <- na.locf(res$d_aapl.Close) 

> res 
      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617 0.9815064 
2015-01-06 0.9973719 0.9815064 
2015-01-07 1.0051306 0.9815064 
2015-01-08 1.0243522 0.9815064 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487 0.9941422 
2015-01-13 0.9891412 0.9891412