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

如何在R语言的xts时间序列图中高亮波动聚集区?

高亮xts时间序列中的波动聚集区

好问题!要在你绘制的对数收益率图上高亮波动聚集区,核心思路是先识别出波动显著高于正常水平的区间,再用图形工具在图上标记这些区域。下面给你两种实用的实现方案,适配不同的绘图习惯:

方法一:基础绘图系统 + rect() 函数

这种方法直接基于你现有的xts绘图代码,不需要额外加载太多包,步骤清晰:

1. 先运行你的基础代码

library(xts)
data(sample_matrix)
prices <- as.xts(sample_matrix)[,"Close"]
pw_returns <- diff(log(prices))
plot(pw_returns, main="", col="darkblue", lwd=1)

2. 识别高波动区间

我们可以用全局标准差的倍数作为阈值(比如2倍标准差,你可以根据需求调整),标记出波动异常的点,再用rle()函数识别连续的高波动区间:

# 计算收益率的全局标准差
return_sd <- sd(pw_returns, na.rm = TRUE)
# 标记绝对值超过2倍标准差的收益率点
high_volatility <- abs(pw_returns) > 2 * return_sd

# 用rle识别连续的高波动区块
rle_vol <- rle(as.vector(high_volatility))
# 计算每个区块的起始/结束索引
start_idx <- cumsum(c(1, rle_vol$lengths[-length(rle_vol$lengths)]))
end_idx <- cumsum(rle_vol$lengths)
# 提取高波动区间的时间范围
high_vol_intervals <- data.frame(
  start = index(pw_returns)[start_idx[rle_vol$values]],
  end = index(pw_returns)[end_idx[rle_vol$values]]
)

3. 添加高亮矩形

用rect()函数在已有的图上绘制半透明矩形,覆盖高波动区间:

# 遍历每个高波动区间,绘制矩形
for(i in 1:nrow(high_vol_intervals)){
  rect(
    xleft = as.numeric(high_vol_intervals$start[i]),  # 时间转数值适配基础绘图的x轴
    xright = as.numeric(high_vol_intervals$end[i]),
    ybottom = par("usr")[3],  # 获取当前图的y轴最小值
    ytop = par("usr")[4],     # 获取当前图的y轴最大值
    col = adjustcolor("orange", alpha.f = 0.3),  # 半透明橙色,避免遮挡曲线
    border = NA  # 去掉矩形边框更美观
  )
}

# 补充标题和图例
title(main = "Log Returns with High Volatility Clustering Highlighted")
legend("topright", legend = "High Volatility", fill = adjustcolor("orange", alpha.f = 0.3))

方法二:用ggplot2实现(更灵活的可视化)

如果你习惯用ggplot2绘图,可以把xts对象转成数据框,结合geom_rect()实现高亮,代码更简洁:

library(ggplot2)
library(dplyr)

# 将xts转成标准数据框
returns_df <- data.frame(
  date = index(pw_returns),
  returns = coredata(pw_returns)
)

# 标记高波动点,并识别连续区间
return_sd <- sd(returns_df$returns, na.rm = TRUE)
returns_df <- returns_df %>%
  mutate(
    high_vol = abs(returns) > 2 * return_sd,
    # 给连续的高波动区块分组
    group = cumsum(high_vol != lag(high_vol, default = FALSE))
  ) %>%
  group_by(group) %>%
  mutate(
    start_date = first(date),
    end_date = last(date),
    is_high_vol = any(high_vol)
  ) %>%
  ungroup()

# 绘制带高亮的图
ggplot(returns_df, aes(x = date, y = returns)) +
  geom_line(color = "darkblue", linewidth = 1) +
  # 添加高波动区间的高亮矩形
  geom_rect(
    data = filter(returns_df, is_high_vol),
    aes(xmin = start_date, xmax = end_date, ymin = -Inf, ymax = Inf),
    fill = adjustcolor("orange", alpha.f = 0.3),
    inherit.aes = FALSE
  ) +
  labs(
    title = "Log Returns with High Volatility Clustering Highlighted",
    x = "Date",
    y = "Log Returns"
  ) +
  theme_minimal()

进阶技巧:用滚动窗口标准差识别波动

如果你觉得全局标准差不够贴合局部波动,可以用rollapply()计算滚动窗口的标准差,更精准地捕捉局部波动聚集:

# 计算20期滚动窗口的标准差
roll_sd <- rollapply(pw_returns, width = 20, FUN = sd, na.rm = TRUE, align = "right")
# 用滚动标准差的2倍作为阈值
high_vol_roll <- abs(pw_returns) > 2 * roll_sd
# 后面的区间识别和绘图步骤和方法一完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:14:34