apply.rolling window / 使用排名函数循环
apply.rolling window / loop with a rank function
如何在使用 base::rank
对数据进行排名时进行滚动 window / 循环(回溯期 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
我select只有最后30个数据点:
rolldata30 <- tail(Data[,2:3], 30)
rollindex30 <- tail(Data[,1], 30)
我根据向量 C2
和 C3
的原始值对数据(最后 30 个数据点)进行排名。因此,这是 2016-05-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-26、2016-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])
apply.rolling
的 FUN
参数没有意义。我怀疑你的意思是 FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep"))
。但这仍然行不通,因为 FUN
returns 一个对象有多于一行。
您的 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
如何在使用 base::rank
对数据进行排名时进行滚动 window / 循环(回溯期 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
我select只有最后30个数据点:
rolldata30 <- tail(Data[,2:3], 30)
rollindex30 <- tail(Data[,1], 30)
我根据向量 C2
和 C3
的原始值对数据(最后 30 个数据点)进行排名。因此,这是 2016-05-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-26、2016-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])
apply.rolling
的 FUN
参数没有意义。我怀疑你的意思是 FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep"))
。但这仍然行不通,因为 FUN
returns 一个对象有多于一行。
您的 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