2

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

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

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

SPX[.indexmday(SPX)==1]

以及一些日期功能,RQuantLiblubridate成功程度不同。

我敢肯定有一种相当方便和有效的方法来做这个任何建议都非常感谢!

4

1 回答 1

3

head这是一种对and使用负值的方法tail

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

它按“月”分割,然后对每个月应用一个函数。该函数获取除前 9 天之外的所有xts. 最后,rbind将结果组合成一个xts对象。

编辑:

您可以使用xts::firstandxts::last代替headandtail以便它可以使用除每日以外的频率。

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

更新地址评论:

如果要对子集进行其他操作,则需要检查以确保至少有 1 行数据。如果对于给定的月份,您的 xts 对象在 9 号之后和 2 号到最后一天之前没有天,则上面的匿名函数将返回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)
于 2013-03-07T02:24:56.370 回答