【问题标题】:rolling computations in xts by monthxts 按月滚动计算
【发布时间】:2012-08-14 19:26:20
【问题描述】:

我熟悉zoo 函数rollapply,它允许您对zooxts 对象进行滚动计算,您可以通过by 参数指定滚动增量。我对每个月应用一个函数特别感兴趣,但在计算中使用所有过去的每日数据。例如,假设我的数据集如下所示:

dte, val
1/01/2001, 10
1/02/2001, 11
...
1/31/2001, 2
2/01/2001, 54
2/02/2001, 34
...
2/30/2001, 29

我想选择每个月的月底和apply 一个使用所有每日数据的函数。这似乎不适用于rollapply,因为by 参数有时为30,其他月份为29,等等。我目前的想法是:

f <- function(xts_obj) { coef(lm(a ~ b, data=as.data.frame(xts_obj)))[1] }
month_end <- endpoints(my_xts, on="months", k=1)
rslt <- apply(month_end, 1, function(idx) { my_xts[paste0("/",idx)] })

肯定有更好的方法可以更快地做到这一点,不是吗? 澄清一下:我想使用重叠的时间段,只是应该每月进行一次滚动。

【问题讨论】:

    标签: r subset apply xts zoo


    【解决方案1】:

    如果我理解正确,您可以获得端点的日期,然后对于每个端点(即使用 lapplyfor),使用截至该点的数据调用 rollapply

    getSymbols("SPY", src='yahoo', from='2012-01-01', to='2012-08-01')
    idx <- index(SPY)[endpoints(SPY, 'months')]
    out <- lapply(idx, function(i) {
      as.xts(rollapplyr(as.zoo(SPY[paste0("/", i)]), 5, 
                        function(x) coef(lm(x[, 4] ~ x[, 1]))[2], by.column=FALSE))
    })
    sapply(out, NROW)
    #[1]  16  36  58  78 100 121 142 143
    

    我暂时强制zoo 使用rollapplyr 以确保使用rollapply.zoo 方法(与未导出的rollapply.xts 方法相反),然后强制返回xts

    【讨论】:

    • 需要zoo/xts转换吗?当我把它们拿出来时,我得到了同样的结果。
    • @DarrenCook,看起来没有必要,但我想覆盖我的基地。
    • @DarrenCook,如果您希望结果为xts,那么假设您使用的是rollapply.zoo,则需要as.xts,除非您加载了PerformanceAnalytics。如果您加载了 PerformanceAnalytics,那么您将使用 rollapply.xts
    • @Gsee,我一直想知道如何解决一个类似的问题,不太复杂,因为我必须使用每月数据计算每个月的函数,即使用当时可用的所有数据计算趋势。我将如何修改上面给出的方法?指定的宽度是多少?我可以在没有 rollapply 的情况下执行此操作吗?
    • @Anusha,这是我在另一个答案的 cmets 中回答的最后一个问题。您提出的下一个问题应该作为正确的问题发布。试试这个:m &lt;- to.monthly(SPY); m$trend &lt;- sapply(seq_len(NROW(m)), function(i) coef(lm(as.numeric(Ad(m[1:i])) ~ c(1:i)))[2]); m。作为额外的奖励chartSeries(OHLC(m), TA='addTA(m$trend)')
    【解决方案2】:

    作为对“是否需要 zoo/xts 转换?”的回答: 在这种情况下不需要它,但如果你向它发送一个数据帧,rollapply 将不起作用,正如我最近从 this StackOverflow answer 发现的那样@

    【讨论】:

    • rollapply.xts 现在在 xts 的开发版本中注册为 S3 方法。但是,它还不完美;至少有一种情况会失败,但 rollapply.zoo 不会。
    【解决方案3】:

    你想要period.apply(),或者它的便利助手apply.monthly(),两者都在xts

    例子:

    R> foo <- xts(1:100, order.by=Sys.Date()+0:99)
    R> apply.monthly(foo, sum)
               [,1]
    2012-08-31  105
    2012-09-30  885
    2012-10-31 1860
    2012-11-25 2200
    R> 
    

    或同样

    R> apply.monthly(foo, quantile)
               0%   25%  50%   75% 100%
    2012-08-31  1  4.25  7.5 10.75   14
    2012-09-30 15 22.25 29.5 36.75   44
    2012-10-31 45 52.50 60.0 67.50   75
    2012-11-25 76 82.00 88.0 94.00  100
    R> 
    

    只是为了证明也可以使用返回多个值的函数。

    【讨论】:

    • 但这不会简单地做不重叠的时期吗?那就是传递给 sum 的东西将是几个月内不重叠的数据。我正在尝试使用所有过去的数据,以便我的时期重叠..
    • 哦,我明白了,那确实会有所不同。但是由于您实际上没有提供完整的示例,因此我错过了。根据您的聚合函数是什么,您可能仍然可以使用 apply.monthly() 并在之后进行聚合。这一切都取决于...
    • 好的,我刚刚更新了问题以使其更清楚。对此感到抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-03-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多