2016-08-16 49 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