You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:05:39