通过R中的xts进行动态周期子集化

时间:2013-03-07 02:07:42

标签: r time-series xts

假设我们有一个OHLC的xts对象为SPX返回系列(SPX

如果我想动态地对这些回报进行子集化,以便我们可以将每个月的Business Day 9的句点子集化为2 business days before the end of the month,那么使用xts执行此操作的最有效方法是什么?

我尝试过嵌套.index / xts函数的某些组合,例如

SPX[.indexmday(SPX)==1]

以及RQuantLiblubridate之外的某些日期函数,但成功程度不同。

我确信有一种相当方便和有效的方式来做这个任何建议非常感谢!

1 个答案:

答案 0 :(得分:3)

以下是使用headtail的负值的方法:

SPX <- getSymbols("^GSPC", src="yahoo", auto.assign=FALSE)
do.call(rbind, lapply(split(SPX, 'months'), function(x) tail(head(x, -2), -9)))

它按“月”分割,然后将功能应用于每个月。除了xts中的最后2天之外,该函数除了前9天以外都有。最后,rbind将结果合并为一个xts对象。

修改

您可以使用xts::firstxts::last代替headtail,以便它可以使用非日常频率。

do.call(rbind, lapply(split(SPX, 'months'), function(x) {
  first(xts::last(x, "-2 days"), "-9 days")
}))

更新以发表评论:

如果要对子集执行其他操作,则需要检查以确保至少有一行数据。如果,对于给定的月份,在第9天之后和第2天到最后一天之前,您的xts对象中没有天,则上面的匿名函数将返回NULL

do.call(rbind, lapply(split(SPX, 'months'), function(x) {
  dat <- first(xts::last(x, "-2 days"), "-9 days")
  if (NROW(dat) > 0) OpCl(dat)
}))

虽然在这种情况下,您可以在原始答案的结果上调用OpCl()以获得相同的结果。

tmp <- do.call(rbind, lapply(split(SPX, 'months'), function(x) {
  first(xts::last(x, "-2 days"), "-9 days")
}))
OpCl(tmp)