You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在R语言中计算滚动窗口标准差?

实现滚动窗口标准差的几种方法

嘿,刚好你已经加载了几个合适的工具包,我给你几个实用的实现方案,不用额外安装新包就能搞定!

方法1:用zoo包的rollapply()(最直接)

zoorollapply()是处理滚动窗口计算的利器,它可以对任意滚动窗口应用你需要的函数,包括标准差sd()

步骤说明:

  • 如果你需要的是收益率的滚动标准差(金融分析里更常用),先把收盘价转换成日收益率:
# 计算对数日收益率(也可以用简单收益率:diff(AAL.data)/lag(AAL.data, k=-1))
AAL.returns <- diff(log(AAL.data))
  • 然后指定窗口大小(比如30天)计算滚动标准差:
# 30天滚动窗口标准差,对齐方式为"right"(结果对应窗口最后一个日期)
roll_sd_returns <- rollapply(
  data = AAL.returns,
  width = 30,
  FUN = sd,
  na.rm = TRUE,
  align = "right"
)
  • 如果是直接对收盘价计算滚动标准差,把AAL.returns换成AAL.data即可:
roll_sd_price <- rollapply(
  data = AAL.data,
  width = 30,
  FUN = sd,
  na.rm = TRUE,
  align = "right"
)

参数解释:

  • width:滚动窗口的样本数量,根据你的需求调整(比如20、60天)
  • na.rm = TRUE:自动忽略窗口内的缺失值,避免结果出现NA
  • align = "right":金融分析中常用的对齐方式,确保每个标准差结果对应窗口的最后一个交易日

方法2:用forecast包的rollapply()

其实forecast包的rollapply()就是调用的zoo包实现,用法完全一致,所以上面的代码直接就能用,不用做任何修改。

方法3:用rugarch包做滚动波动率建模(进阶版)

如果你需要的不是简单的样本标准差,而是更精准的滚动波动率估计(比如GARCH模型),你已经加载的rugarch包就能派上用场:

# 定义GARCH(1,1)模型规范(最常用的波动率模型)
garch_spec <- ugarchspec(
  variance.model = list(garchOrder = c(1,1)),
  mean.model = list(armaOrder = c(0,0))  # 均值方程设为0,只关注波动率
)

# 滚动窗口拟合GARCH模型,窗口起始大小300,每步重新拟合
roll_garch_result <- ugarchroll(
  spec = garch_spec,
  data = AAL.returns,
  n.start = 300,
  refit.every = 1,
  refit.window = "moving"
)

# 提取滚动波动率结果
roll_volatility <- sigma(roll_garch_result)

这个方法适合需要专业波动率分析的场景,结果比简单样本标准差更贴合金融市场的波动特性。

可视化验证

你可以把滚动标准差和原始价格画在一起,直观查看波动变化:

plot(AAL.data, main = "AAL Closing Price & 30-Day Rolling Std Dev", ylab = "Value")
lines(roll_sd_price, col = "red", lwd = 2)
legend("topright", 
       legend = c("Closing Price", "30-Day Rolling Std Dev"),
       col = c("black", "red"),
       lwd = 2)

内容的提问来源于stack exchange,提问作者Homesand

火山引擎 最新活动