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 每次都被简单地覆盖。听起来您希望 wiw1w2 等,但 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_sizesnum_samples 以获得更密集的采样。此外,滚动的结束日期 window 显示为 ADF statistic 的每个值。

更新

感谢您的澄清。我已经通过几种方式简化了下面的代码。 window size的增量固定为1,可以直接指定样本区间大小;选择 sample_interval = 1 会在每个 Date 点进行 ADF 计算,这正是我所理解的您要寻找的。此外,我已将计算出的 ADF 统计数据收集到一个矩阵 DF 中,这可能更易于您使用。 DF 的行索引是 ADF 计算中使用的 windows 的末尾 DatesDF 的列索引是 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)