滚动最大值(滚动宽度)rollapply不起作用

时间:2013-07-14 08:24:55

标签: r xts

 x<- xts(c(1, 1.1, 1.2, 1.3, 1.4, -.9, 1.2), Sys.Date()-7:1)

x中,我想要一个列出下面提到的结果。

x
           [,1]           max high
2013-07-07  1.0              1.0
2013-07-08  1.1              1.1 
2013-07-09  1.2              1.2
2013-07-10  1.3              1.3
2013-07-11  1.4              1.4
2013-07-12  0.9              1.4
2013-07-13  1.2              1.4

如果我使用rollapply function我必须保持宽度固定但我希望每个日期的日期最大值。 rollapply无效。 我想使用像rollapply(x,[1:i],max)这样的东西,我代表不。排。 我得到的答案是获得max.high我应该使用cummax并且它的工作非常好。由于我被禁止在这个论坛中提出新问题,我正在添加我的问题。我不知道它是否正确,但我没有其他方法可以做到。

  

x < - xts(c(100,98,105,100,99,98,96,95,94,93,99,100,106),Sys.Date() - 13:1)   colnames(x)&lt; - “value”   x $ max&lt; - cummax(x $ value)   x $ trade&lt; - ifelse(x $ max * 0.95&gt; = x $ value,1,0)   X             价值最大贸易贸易1   2013-07-05 100 100 0 0   2013-07-06 98 100 0 0   2013-07-07 105 105 0 0   2013-07-08 100 105 0 0   2013-07-09 99 105 1 1   2013-07-10 98 105 1 0   2013-07-11 96 105 1 0   2013-07-12 95 105 1 0   2013-07-13 94 105 1 1   2013-07-14 93 105 1 0   2013-07-15 99 105 1 -1   2013-07-16 100 105 0 0   2013-07-17 106 106 0 -1

直到列交易,我的代码工作,但我需要另一个列trade1,它基于如果值至少小于列max的5%,则trade1列将为1的逻辑,然后它将再次给我1 value列的最大值是10%以上,当值从值94上升5%或更多时(当trade1列为1时,值列为94),trade1列应该给我-1并且再次当列值从值99上升10%或更多时(当trade1列为1时,值列为99)

如果任何人要求更清晰,我会再次尝试这样做。 问候 Anup

2 个答案:

答案 0 :(得分:8)

cummax计算扩展(而不是滚动)窗口的最大值。

cummax(x)
#            [,1]
# 2013-07-07  1.0
# 2013-07-08  1.1
# 2013-07-09  1.2
# 2013-07-10  1.3
# 2013-07-11  1.4
# 2013-07-12  1.4
# 2013-07-13  1.4

答案 1 :(得分:2)

您可以使用TTR包中的runMax。我觉得它对xts时间序列非常有用。

> x<- xts(c(1, 1.1, 1.2, 1.3, 1.4, -.9, 1.2), Sys.Date()-7:1)
> colnames(x) <- "value"
> x$max.high <- runMax(x$value , 4) # change this parameter to match your needs
> x
           value max.high
2013-07-07   1.0       NA
2013-07-08   1.1       NA
2013-07-09   1.2       NA
2013-07-10   1.3      1.3
2013-07-11   1.4      1.4
2013-07-12  -0.9      1.4
2013-07-13   1.2      1.4

> x$max.high <- ifelse(is.na(x$max.high) , x$value , x$max.high)
> x
           value max.high
2013-07-07   1.0      1.0
2013-07-08   1.1      1.1
2013-07-09   1.2      1.2
2013-07-10   1.3      1.3
2013-07-11   1.4      1.4
2013-07-12  -0.9      1.4
2013-07-13   1.2      1.4