如何为R包函数实现滚动窗口循环以计算动态市场效率指标
滚动窗口计算动态Hurst指数与Lo-MacKinlay方差比的解决方案
问题根源
你之前的代码里,for循环没有将每个窗口的结果存储到lv中,循环结束后lv默认是NULL,这才导致后续调用hurstexp和Lo.Mac时出现类型错误。
解决方案
以下是两种实现自动化滚动窗口计算的方法,包含基础循环和更高效的向量化操作:
1. 准备环境与数据
# 加载所需包 library(pracma) library(vrtest) library(zoo) # 用于简化滚动窗口操作 # 复现对数收益率数据(设置随机种子保证结果可复现) set.seed(123) reproduce <- rnorm(3000, mean = -0.0004832595, sd = 0.003566892) window_size <- 100 # 滚动窗口大小
2. 滚动计算Hurst指数
方法一:基础for循环
# 初始化空向量存储结果 hurst_results <- numeric(length = length(reproduce) - window_size + 1) for (i in 1:(length(reproduce) - window_size + 1)) { # 提取当前窗口的收益率数据 window_data <- reproduce[i:(i + window_size - 1)] # 计算Hurst指数并存储 hurst_results[i] <- hurstexp(window_data)$Hs } # 查看前5个结果 head(hurst_results)
方法二:用rollapply简化操作
# 定义滚动计算Hurst指数的函数 calc_hurst <- function(x) { hurstexp(x)$Hs } # 执行滚动计算(align="left"对应你手动计算的窗口起始逻辑) hurst_results_roll <- rollapply(reproduce, width = window_size, FUN = calc_hurst, align = "left") # 结果与循环方法一致 head(hurst_results_roll)
3. 滚动计算Lo-MacKinlay方差比
由于Lo.Mac返回包含多个统计量的列表(方差比、z统计量等),需要将每个窗口的结果整理为数据框:
方法一:基础for循环
# 定义方差比的滞后阶数 lags <- c(2,4,8,16) # 初始化空数据框存储结果 vr_results <- data.frame( window_start = 1:(length(reproduce) - window_size + 1), vr_2 = numeric(), vr_4 = numeric(), vr_8 = numeric(), vr_16 = numeric(), z_2 = numeric(), z_4 = numeric(), z_8 = numeric(), z_16 = numeric() ) for (i in 1:nrow(vr_results)) { window_data <- reproduce[i:(i + window_size - 1)] # 计算方差比 vr_output <- Lo.Mac(window_data, lags) # 提取结果存入数据框 vr_results$vr_2[i] <- vr_output$VR[1] vr_results$vr_4[i] <- vr_output$VR[2] vr_results$vr_8[i] <- vr_output$VR[3] vr_results$vr_16[i] <- vr_output$VR[4] vr_results$z_2[i] <- vr_output$z[1] vr_results$z_4[i] <- vr_output$z[2] vr_results$z_8[i] <- vr_output$z[3] vr_results$z_16[i] <- vr_output$z[4] } # 查看前3行结果 head(vr_results, 3)
方法二:用rollapply结合dplyr整理结果
library(dplyr) # 定义滚动计算方差比的函数 calc_vr <- function(x) { vr_out <- Lo.Mac(x, lags) # 将结果转为数据框行 tibble( vr_2 = vr_out$VR[1], vr_4 = vr_out$VR[2], vr_8 = vr_out$VR[3], vr_16 = vr_out$VR[4], z_2 = vr_out$z[1], z_4 = vr_out$z[2], z_8 = vr_out$z[3], z_16 = vr_out$z[4] ) } # 执行滚动计算并合并结果 vr_results_roll <- rollapply(reproduce, width = window_size, FUN = calc_vr, align = "left", by.column = FALSE) %>% bind_rows() %>% mutate(window_start = 1:n()) # 查看结果 head(vr_results_roll, 3)
关键说明
- 滚动窗口索引
i:(i + window_size - 1)确保每个窗口包含window_size条数据,总窗口数为length(reproduce) - window_size + 1。 align = "left"表示窗口从第i个观测值开始,完全匹配你手动计算时2:101、3:102的逻辑;若需要从末尾对齐窗口,可改为align = "right"。
内容的提问来源于stack exchange,提问作者Stakerauo
相关产品推荐
相关产品推荐

