【问题标题】:How to transform xts to lower frequency in a cumulative way如何以累积方式将 xts 转换为较低频率
【发布时间】:2011-11-05 20:44:16
【问题描述】:

我正在尝试以累积的方式将 xts 时间序列数据转换为较低的周期性。

例如,对 xts 包中的样本数据 (sample_matrix) 使用 to.weekly 我会得到:

library(xts)
data(sample_matrix)
to.weekly(as.xts(sample_matrix), name="")

> to.weekly(as.xts(sample_matrix), name="")
              .Open    .High     .Low   .Close
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-15 49.99489 50.68583 49.80454 50.48912
.....

我希望能够使用稍微不同的函数 to.weekly.cumulative 来代替返回:

> to.weekly.cumulative(as.xts(sample_matrix), name="")
              .Open    .High     .Low   .Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.03978 50.42188 49.95041 50.39767
2007-01-04 50.03978 50.42188 49.95041 50.33236
2007-01-05 50.03978 50.42188 49.95041 50.33459
2007-01-06 50.03978 50.42188 49.95041 50.18112
2007-01-07 50.03978 50.42188 49.95041 49.99185
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.99489 50.13053 49.80454 49.97246
2007-01-11 49.99489 50.23910 49.80454 50.23910
2007-01-12 49.99489 50.35980 49.80454 50.28519
2007-01-13 49.99489 50.48000 49.80454 50.41286
2007-01-14 49.99489 50.62395 49.80454 50.60145
2007-01-15 49.99489 50.68583 49.80454 50.48912
....

此函数不会仅返回端点的数据,而是返回 xts 对象中所有行的数据。例如,我试图从每日柱(或 15 分钟柱从 1 分钟柱)中得到每周柱,这样我每天(或每分钟)都会得到当前(从那一天/分钟)的发展每周(15 分钟)条形图。所以,在星期一,我会得到一个每周条形图 Open,High,Low,Close 和星期一一样如果低于周一低点,低点将是周二低点......周五我会从周一开盘,高点为整周的高点,低点为整周的低点,周五收盘价。如果我使用 xts 中的 to.weekly 函数,周五的数据应该是相同的。

因此,基本上,这不仅仅是端点处的数据(如 xts to.weekly 所做的那样),而是原始 xts 对象周期性可用的所有时间步长。因此,不知何故,这是一部关于每周酒吧发展的电影(每天我都会知道每周酒吧在每周结束时所处的位置)。

怎么做(如何将函数写入.weekly.cumulative?)?

高度赞赏如何做到这一点的示例。

编辑:尝试根据 DWin 评论进行更多解释。

【问题讨论】:

  • 您会欣赏展示如何执行此操作的示例(目前似乎尚未确定)。我们会很感激数据。建议您搜索 SO:[r]“如何写一个好问题。”
  • DWin 感谢您的评论。我希望我更清楚地解释了我想在这里实现的目标。上面的数据是包中的示例数据。我希望在安装了 xts 包的任何 R 上运行 to.weekly.cumulative 之前的所有内容(我为了展示我想要的内容而编造)。
  • 我还没有尝试过——但是cumsum( to.weekly( x) ) 能做到你想要的吗?
  • @Samo。特别是对于复杂的 xts 对象,打印表示并不是呈现对象的好方法。你应该养成提供输出的习惯 dput(head(object, 20))

标签: r xts


【解决方案1】:

不确定这是否是您想要的,但也许您可以通过以下方式完成这项工作:

  1. 为时间序列创建一个循环索引(此处为wday)。
  2. 使用rollapplyr 使用wday 作为窗口宽度。

这是一个例子:

z <- as.xts(sample_matrix)
wday <- .indexwday(z) + 1
wday <- (wday-3)%%7 + 1 # rotate the wday index if need.

z2 <- data.frame(
  Open = rollapplyr(z$Open, wday, function(x) x[1], partial = TRUE),
  High = rollapplyr(z$High, wday, max, partial = TRUE),
  Low = rollapplyr(z$Low, wday, min, partial = TRUE),
  Close = z$Close
  )

z2是这样的:

> head(z2, 15)
               Open     High      Low    Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.03978 50.42188 49.95041 50.39767
2007-01-04 50.03978 50.42188 49.95041 50.33236
2007-01-05 50.03978 50.42188 49.95041 50.33459
2007-01-06 50.03978 50.42188 49.95041 50.18112
2007-01-07 50.03978 50.42188 49.95041 49.99185
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.99489 50.13053 49.80454 49.97246
2007-01-11 49.99489 50.23910 49.80454 50.23910
2007-01-12 49.99489 50.35980 49.80454 50.28519
2007-01-13 49.99489 50.48000 49.80454 50.41286
2007-01-14 49.99489 50.62395 49.80454 50.60145
2007-01-15 49.99489 50.68583 49.80454 50.48912
2007-01-16 50.62024 50.73731 50.56627 50.67835

【讨论】:

    【解决方案2】:

    按“周”拆分,将自定义函数应用于每周的数据,然后 rbind 结果

    to.weekly.cumulative <- function(xts.obj, name="") {
         out <- do.call(rbind, 
                       lapply(split(xts.obj, 'weeks'), 
                           function(x) cbind(rep(first(x[,1]), NROW(x[,1])), 
                                       cummax(x[,2]), cummin(x[,3]), x[,4])))
         colnames(out) <- paste(name, c("Open", "High", "Low", "Close"), sep=".")
         out
    }
    
    > library(quantmod)
    > data(sample_matrix)
    > myxts <- as.xts(sample_matrix)
    
    
    > head(to.weekly.cumulative(myxts), 15)
                  .Open    .High     .Low   .Close
    2007-01-02 50.03978 50.11778 49.95041 50.11778
    2007-01-03 50.03978 50.42188 49.95041 50.39767
    2007-01-04 50.03978 50.42188 49.95041 50.33236
    2007-01-05 50.03978 50.42188 49.95041 50.33459
    2007-01-06 50.03978 50.42188 49.95041 50.18112
    2007-01-07 50.03978 50.42188 49.95041 49.99185
    2007-01-08 50.03555 50.10363 49.96971 49.98806
    2007-01-09 50.03555 50.10363 49.80454 49.91333
    2007-01-10 50.03555 50.13053 49.80454 49.97246
    2007-01-11 50.03555 50.23910 49.80454 50.23910
    2007-01-12 50.03555 50.35980 49.80454 50.28519
    2007-01-13 50.03555 50.48000 49.80454 50.41286
    2007-01-14 50.03555 50.62395 49.80454 50.60145
    2007-01-15 50.61724 50.68583 50.47359 50.48912
    2007-01-16 50.61724 50.73731 50.47359 50.67835
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 2011-10-09
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多