【问题标题】:Dynamic period subsetting via xts in R通过 R 中的 xts 进行动态周期子集
【发布时间】:2013-03-07 02:07:42
【问题描述】:

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

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

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

SPX[.indexmday(SPX)==1]

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

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

【问题讨论】:

    标签: r time-series xts


    【解决方案1】:

    这是一种对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")
    }))
    

    更新地址评论:

    如果要对子集进行其他操作,则需要检查以确保至少有 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)
    

    【讨论】:

    • 当我们讨论这个问题时,您认为通过您的方法为每个子周期推导 OpCl(或任何标准周期)回报的最佳方法是什么?即,您不是只返回每个子周期的价格时间序列,而是以一个保存 OpCl 回报的对象结束?
    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2020-10-29
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多