假设我们有一个OHLC的xts对象为SPX返回系列(SPX
)
如果我想动态地对这些回报进行子集化,以便我们可以将每个月的Business Day 9
的句点子集化为2 business days before the end of the month
,那么使用xts执行此操作的最有效方法是什么?
我尝试过嵌套.index
/ xts
函数的某些组合,例如
SPX[.indexmday(SPX)==1]
以及RQuantLib
和lubridate
之外的某些日期函数,但成功程度不同。
我确信有一种相当方便和有效的方式来做这个任何建议非常感谢!
答案 0 :(得分:3)
以下是使用head
和tail
的负值的方法:
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::first
和xts::last
代替head
和tail
,以便它可以使用非日常频率。
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)