在R中通过xts进行动态周期子集划分

在R中通过xts进行动态周期子集划分,r,time-series,xts,R,Time Series,Xts,假设我们有一个OSX的OHLC返回序列的xts对象(SPX) 如果我想动态地对这些回报进行子集划分,以便我们可以(比如)将每个月的第9个工作日划分为月末前的2个工作日,那么使用xts最有效的方法是什么 我尝试过嵌套一些.index/xts函数的组合,比如 SPX[.indexmday(SPX)==1] 以及一些来自RQuantLib和lubridate但成功程度不同的日期函数 我相信有一个相当方便和有效的方法做这件事任何建议非常感谢 这里有一种方法,将负值用于头部和尾部: SPX <-

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

如果我想动态地对这些回报进行子集划分,以便我们可以(比如)将每个月的
第9个工作日
划分为月末前的
2个工作日
,那么使用xts最有效的方法是什么

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

SPX[.indexmday(SPX)==1]
以及一些来自
RQuantLib
lubridate
但成功程度不同的日期函数


我相信有一个相当方便和有效的方法做这件事任何建议非常感谢

这里有一种方法,将负值用于
头部
尾部

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

如果要对子集执行其他操作,则需要检查以确保至少有一行数据。如果在给定的一个月内,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(或任何标准周期)回报的最佳方法是什么?也就是说,不是只返回每个子周期的时间序列价格,而是以一个包含OpCl返回的对象结束?
do.call(rbind, lapply(split(SPX, 'months'), function(x) {
  dat <- first(xts::last(x, "-2 days"), "-9 days")
  if (NROW(dat) > 0) OpCl(dat)
}))
tmp <- do.call(rbind, lapply(split(SPX, 'months'), function(x) {
  first(xts::last(x, "-2 days"), "-9 days")
}))
OpCl(tmp)