rollapplyr 移动 window ADF
rollapplyr moving window ADF
所以我想做一个滚动 window,每次它结束时都以更大的尺寸 window 重新开始,以计算 ADF 测试。我正在考虑 rollapplyr()
中的 while
循环,但我所做的不起作用。我还希望 ADF 测试每次滚动时都会创建一个新数据。
这是我的代码:
C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
head(C)
Date Dividend
1 1 587.2105
2 2 564.3108
3 3 548.4872
4 4 521.1410
5 5 541.0921
6 6 563.5000
r11<-1
T<- 1336
rw<-9
for(i in 1:1326){
while(r11<=T-rw+i){
wi <- rollapplyr(C$Dividend, rw+i,function(u) adf.test(u)$statistic)
r11<-r11+i
}
}
出于某种原因,它在 ADF 的第一次滚动时停止,所以它只创建数据 w1
您每次迭代都会覆盖您的输出。
wi
每次都被简单地覆盖。听起来您希望 wi
是 w1
、w2
等,但 i
递增,但 R 不会以这种方式工作。
我也把你的r11 <- r11 + i
改成了+ 1
,我猜你是这个意思,如果不是就改回来。
修复代码并使其快速 运行 的最简单方法是创建 wi
列表,然后在末尾对其进行绑定:
r11 <- 1
T <- 1336
rw <- 9
wi <- list()
for(i in 1:1326){
while(r11 <= T - rw + i){
wi[i] <- rollapplyr(C$Dividend, rw + i, function(u) adf.test(u)$statistic)
r11 <- r11 + 1
}
}
wi <- do.call(rbind, wi)
adf.test
返回的值的数量取决于 rollapplyr
中滚动 window 的大小,因此您需要将结果累加到列表中作为 jeremycg 显示在他的回答中。然而,do.call
函数可能无法正常工作,如图所示。我尝试使用具有相同数据点数和 window 大小的随机红利数据来复制您的问题,并发现它运行了很长时间。为了减少 运行 时间,同时仍然给出 window 大小范围内的结果,我修改了代码以在股息系列中以等间隔时间而不是每次都计算 ADF 结果。滚动 window 的大小也增加了一个值 > 1 。代码现在可以在几秒钟内运行。 wi
中包含的结果包括股息序列中的采样间隔和 window 大小。您可以根据需要调整 num_wind_sizes
和 num_samples
以获得更密集的采样。此外,滚动的结束日期 window 显示为 ADF statistic
的每个值。
更新
感谢您的澄清。我已经通过几种方式简化了下面的代码。 window size的增量固定为1,可以直接指定样本区间大小;选择 sample_interval
= 1 会在每个 Date
点进行 ADF 计算,这正是我所理解的您要寻找的。此外,我已将计算出的 ADF 统计数据收集到一个矩阵 DF
中,这可能更易于您使用。 DF
的行索引是 ADF 计算中使用的 windows 的末尾 Dates
。 DF
的列索引是 ADF 计算中使用的 window 大小。例如,DF[16,10]
是结束于 Date = 16 的 10 个连续日期系列的 ADF 统计量;即使用 window = 10。下面仅使用 20 个日期的示例计算的输出可能有助于澄清这一点。
library(zoo)
library(tseries)
# num_random <- 1336
num_random <- 20
set.seed(123)
C <- data.frame(Date=1:num_random, Dividend=550 + 30*rnorm(num_random)) # generate randum sample data
# C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
num_dividends <- nrow(C)
head(C)
rw<-9
sample_interval <- 1 # sampling interval along dividend series;
# sample_interval = 1 causes every point in dividend series to be used
wi <- list()
DF <- matrix(0, nrow=num_dividends, ncol=num_dividends-1)
for(i in 1:(num_dividends-rw-1) ) {
wi <- c(wi,list(list(c(window_size=rw+i,sample_interval=sample_interval),
DF=cbind(Date=seq(rw+i, num_dividends, by=sample_interval),
statistic=rollapplyr(C$Dividend, rw + i, function(u) adf.test(u)$statistic, by=sample_interval)))))
DF[seq((rw+i),num_dividends,sample_interval), i+rw] <- wi[[i]]$DF[,"statistic"]
}
# row indices of DF are the end Date of the window used in the ADF calculation
# column indices of DF are the window sizes used in the ADF calculation
# for example, DF[16,10] is the ADF statistic for Date = 16 using a window =10
print(DF, digits=4)
所以我想做一个滚动 window,每次它结束时都以更大的尺寸 window 重新开始,以计算 ADF 测试。我正在考虑 rollapplyr()
中的 while
循环,但我所做的不起作用。我还希望 ADF 测试每次滚动时都会创建一个新数据。
这是我的代码:
C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
head(C)
Date Dividend
1 1 587.2105
2 2 564.3108
3 3 548.4872
4 4 521.1410
5 5 541.0921
6 6 563.5000
r11<-1
T<- 1336
rw<-9
for(i in 1:1326){
while(r11<=T-rw+i){
wi <- rollapplyr(C$Dividend, rw+i,function(u) adf.test(u)$statistic)
r11<-r11+i
}
}
出于某种原因,它在 ADF 的第一次滚动时停止,所以它只创建数据 w1
您每次迭代都会覆盖您的输出。
wi
每次都被简单地覆盖。听起来您希望 wi
是 w1
、w2
等,但 i
递增,但 R 不会以这种方式工作。
我也把你的r11 <- r11 + i
改成了+ 1
,我猜你是这个意思,如果不是就改回来。
修复代码并使其快速 运行 的最简单方法是创建 wi
列表,然后在末尾对其进行绑定:
r11 <- 1
T <- 1336
rw <- 9
wi <- list()
for(i in 1:1326){
while(r11 <= T - rw + i){
wi[i] <- rollapplyr(C$Dividend, rw + i, function(u) adf.test(u)$statistic)
r11 <- r11 + 1
}
}
wi <- do.call(rbind, wi)
adf.test
返回的值的数量取决于 rollapplyr
中滚动 window 的大小,因此您需要将结果累加到列表中作为 jeremycg 显示在他的回答中。然而,do.call
函数可能无法正常工作,如图所示。我尝试使用具有相同数据点数和 window 大小的随机红利数据来复制您的问题,并发现它运行了很长时间。为了减少 运行 时间,同时仍然给出 window 大小范围内的结果,我修改了代码以在股息系列中以等间隔时间而不是每次都计算 ADF 结果。滚动 window 的大小也增加了一个值 > 1 。代码现在可以在几秒钟内运行。 wi
中包含的结果包括股息序列中的采样间隔和 window 大小。您可以根据需要调整 num_wind_sizes
和 num_samples
以获得更密集的采样。此外,滚动的结束日期 window 显示为 ADF statistic
的每个值。
更新
感谢您的澄清。我已经通过几种方式简化了下面的代码。 window size的增量固定为1,可以直接指定样本区间大小;选择 sample_interval
= 1 会在每个 Date
点进行 ADF 计算,这正是我所理解的您要寻找的。此外,我已将计算出的 ADF 统计数据收集到一个矩阵 DF
中,这可能更易于您使用。 DF
的行索引是 ADF 计算中使用的 windows 的末尾 Dates
。 DF
的列索引是 ADF 计算中使用的 window 大小。例如,DF[16,10]
是结束于 Date = 16 的 10 个连续日期系列的 ADF 统计量;即使用 window = 10。下面仅使用 20 个日期的示例计算的输出可能有助于澄清这一点。
library(zoo)
library(tseries)
# num_random <- 1336
num_random <- 20
set.seed(123)
C <- data.frame(Date=1:num_random, Dividend=550 + 30*rnorm(num_random)) # generate randum sample data
# C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
num_dividends <- nrow(C)
head(C)
rw<-9
sample_interval <- 1 # sampling interval along dividend series;
# sample_interval = 1 causes every point in dividend series to be used
wi <- list()
DF <- matrix(0, nrow=num_dividends, ncol=num_dividends-1)
for(i in 1:(num_dividends-rw-1) ) {
wi <- c(wi,list(list(c(window_size=rw+i,sample_interval=sample_interval),
DF=cbind(Date=seq(rw+i, num_dividends, by=sample_interval),
statistic=rollapplyr(C$Dividend, rw + i, function(u) adf.test(u)$statistic, by=sample_interval)))))
DF[seq((rw+i),num_dividends,sample_interval), i+rw] <- wi[[i]]$DF[,"statistic"]
}
# row indices of DF are the end Date of the window used in the ADF calculation
# column indices of DF are the window sizes used in the ADF calculation
# for example, DF[16,10] is the ADF statistic for Date = 16 using a window =10
print(DF, digits=4)