【问题标题】:apply.rolling window / loop with a rank functionapply.rolling 窗口/循环与排名函数
【发布时间】:2016-10-29 22:08:14
【问题描述】:

如何在使用base::rank 对数据进行排名时制作滚动窗口/循环(回溯期 30 天/数据点)?见下文apply.rolling 函数似乎不起作用。

请看下面的例子:

# example data
require(xts)
set.seed(3)    
A    <- matrix(runif(900, max=30), ncol=3)
Data <- xts(A, Sys.Date()-300:1)
names(Data) <- c("C1", "C2", "C3")

这会导致(仅显示最近 7 天/数据点):

2016-06-20 16.71131510 12.80074552 19.27525535
2016-06-21 22.92512330 25.11613536 17.45237229
2016-06-22 20.09403965 17.20945809 28.06481040
2016-06-23 28.68593738  4.84698272 18.36108782
2016-06-24 15.52956209 25.54946621  3.97892474
2016-06-25 25.76582707 18.14117193  8.17883282
2016-06-26 25.23925100 16.07418907 15.35118717

我只选择最后 30 个数据点:

rolldata30 <- tail(Data[,2:3], 30)
rollindex30 <- tail(Data[,1], 30)

我根据向量C2C3 的原始值对数据(最后30 个数据点)进行排名。因此,这是从 2016 年 5 月 28 日到 2016 年 6 月 26 日的时期。然后我创建一个新向量,计算两者的平均值。 factorx 显示我感兴趣的结果。

rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep"))
factor <- cbind(rollindex30, global = rowMeans(rank30))
factorx <- last(factor)

结果:

2016-06-20 16.711315   14.5
2016-06-21 22.925123    9.5
2016-06-22 20.094040    9.0
2016-06-23 28.685937   19.0
2016-06-24 15.529562   15.0
2016-06-25 25.765827   18.5
2016-06-26 25.239251   17.0

最后一天的数据:

           C1        global
2016-06-26 25.23925     17

我怎样才能使计算滚动以便对 2016-5-27 到 2016-06-262016-05-26 到 2016-06- 进行相同的计算- 25,等等?

使用PerformanceAnalytics::apply.rolling 会报错:

xts(x, order.by = order.by, frequency = frequency, .CLASS = "double", 中的错误: order.by 需要一个适当的基于时间的对象

require(PerformanceAnalytics)
test1 <- apply.rolling(Data, width=30, gap=30, by=1, FUN=function(x) as.xts(-x, 2, rank))

我做了以下功能。 factorz 给出相同的结果。也许该功能有助于使其滚动?

rollrank <- function(x)
{
  a <- tail(x, 30)
  b <- as.xts(apply(-a, 2, rank, na.last= "keep"))
  c <-  cbind(a, global = rowMeans(b))
  d <- last(c)
  return(d)
}
factorz <- rollrank(Data[,2:3])

【问题讨论】:

    标签: r loops apply xts rank


    【解决方案1】:

    apply.rollingFUN 参数没有意义。我怀疑你的意思是FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep"))。但这仍然行不通,因为FUN 返回的对象不止一行。

    您的rollrank 函数非常接近您的需要,我建议您使用rollapply 而不是apply.rolling。我建议您根据第一个示例创建一个函数,然后将该函数传递给rollapply

    myrank <- function(x) {
      rolldata30 <- x[,2:3]
      rollindex30 <- x[,1]
      rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep"))
      factor <- cbind(rollindex30, global = rowMeans(rank30))
      factorx <- last(factor)
      return(factorx)
    }
    test1 <- rollapply(Data, 30, myrank, by.column=FALSE)
    tail(test1)
    #                   C1 global
    # 2016-06-23  7.806336   19.5
    # 2016-06-24 17.456436   17.5
    # 2016-06-25 29.196350   12.5
    # 2016-06-26 25.185687   11.0
    # 2016-06-27 19.775105    6.5
    # 2016-06-28 12.067774   16.0
    

    【讨论】:

    • 谢谢,这就是我要找的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2018-05-15
    • 1970-01-01
    • 2014-09-18
    • 2022-01-17
    相关资源
    最近更新 更多