使用 R 连续绑定每日和每周数据?

Continuous cbind-ed daily and weekly data with R?

我想连续绑定每日和每周数据(没有 NA)我为此目的使用此代码,但我有两个问题。

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

怎么做?

只需添加以下行:

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

你第一个问题的实际答案,你问的是发生了什么:w_aapl=to.weekly(d_aapl) 只是返回你每天 d_aapl 时间序列(这是一个单变量序列)的 OHLC每周规模,尽管每周数据的前几行(和最后几行)可能不太清楚。 (它与您问题中调整后的价格或数量无关。)

w_aapl 中的时间戳默认对应于每个每周聚合中的最后一天(如果您希望将时间戳更改为一周的开始,但这是回答你的问题的一个侧面),每周从周一到周日运行(周一的数据是下周的第一天)。

由于您在周末没有数据,因此您的时间戳将是每周的最后一个星期五(但如果包含周日数据,则为周日)。也许这将有助于了解发生了什么:

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(星期一)到 2015-01-04(星期日)之间的值,这只是一个值星期五 2015-01-02(这就是为什么 OHLC = C 为第一个每周柱)。
  • 2015-01-09 行的数据将从 2015-01-052015-01-11 之间的 d_aapl 获取。您可以清楚地看到高价来自 2015-01-08,低价位于 2015-01-05,开盘价是范围内的第一个值,即 2015-01-05,收盘价是 2015-01-09 .
  • 2015-01-16 行的数据将从 2015-01-122015-01-18 之间的 d_aapl 获取,等等....

关于你的第二个问题,已经提供的其他答案很好,但你也可以考虑查看 ?merge.xts 及其 fill 参数,这在某些情况下更简洁:res=merge(d_aapl,Cl(w_aapl), fill = na.locf)