使用 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-05
到 2015-01-11
之间的 d_aapl
获取。您可以清楚地看到高价来自 2015-01-08
,低价位于 2015-01-05
,开盘价是范围内的第一个值,即 2015-01-05
,收盘价是 2015-01-09
.
- 第
2015-01-16
行的数据将从 2015-01-12
到 2015-01-18
之间的 d_aapl
获取,等等....
关于你的第二个问题,已经提供的其他答案很好,但你也可以考虑查看 ?merge.xts
及其 fill
参数,这在某些情况下更简洁:res=merge(d_aapl,Cl(w_aapl), fill = na.locf)
我想连续绑定每日和每周数据(没有 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-05
到2015-01-11
之间的d_aapl
获取。您可以清楚地看到高价来自2015-01-08
,低价位于2015-01-05
,开盘价是范围内的第一个值,即2015-01-05
,收盘价是2015-01-09
.- 第
2015-01-16
行的数据将从2015-01-12
到2015-01-18
之间的d_aapl
获取,等等....
关于你的第二个问题,已经提供的其他答案很好,但你也可以考虑查看 ?merge.xts
及其 fill
参数,这在某些情况下更简洁:res=merge(d_aapl,Cl(w_aapl), fill = na.locf)