R语言中TGARCH模型波动率与时间序列叠加绘图故障排查
问题原因与解决办法
核心问题
你的代码存在两个关键问题,导致波动率曲线无法正常显示:
- 数值量级严重不匹配:你绘制的
ts_data是资产价格序列,而vol是模型输出的波动率(sigma的平方),两者数值差距极大,波动率曲线会被压缩到图表底部几乎不可见。 - 时间轴可能未对齐:
vol基于dl_data拟合生成,若ts_data与dl_data的时间范围、频率不一致,lines()函数无法正确定位绘制曲线。
解决步骤
步骤1:计算对应维度的实际波动率
GARCH模型拟合的是收益率的波动率,因此你需要从价格序列计算实际波动率(而非直接用原始价格),比如用对数收益率的平方(和模型输出的sigma^2对应):
# 从价格序列计算对数收益率 returns <- diff(log(ts_data)) # 用收益率平方表示实际波动率,和模型输出维度匹配 actual_vol <- returns^2 # 去掉差分后产生的第一个NA值,保证序列长度一致 actual_vol <- actual_vol[-1]
步骤2:修正绘图代码
将实际波动率与模型波动率放在同一量级下绘图,同时确保时间轴完全对齐:
# 先绘制实际波动率曲线 plot(actual_vol, type = "l", col = "blue", ylab = "Volatility", xlab = "Time", main = "Actual vs Model Predicted Volatility") # 叠加模型波动率曲线 lines(vol, col = "red") # 添加图例 legend("topright", legend = c("Actual Volatility", "Model Predicted Volatility"), col = c("blue", "red"), lty = 1)
可选:双Y轴同时展示价格与波动率
如果一定要同时对比价格和波动率,可使用双Y轴绘图:
# 绘制价格序列(左Y轴) plot(ts_data, type = "l", col = "blue", ylab = "Price", xlab = "Time", main = "Price vs Model Predicted Volatility") # 开启双Y轴模式 par(new = TRUE) # 绘制波动率曲线,关闭重复坐标轴 plot(vol, type = "l", col = "red", ylab = "", xlab = "", axes = FALSE) # 添加右侧Y轴刻度与标签 axis(side = 4, col = "red") mtext("Volatility", side = 4, line = 3, col = "red") # 添加图例 legend("topright", legend = c("Price", "Model Predicted Volatility"), col = c("blue", "red"), lty = 1)
额外检查项
- 用
length(vol)和length(actual_vol)确认两个序列长度一致,若不一致,调整vol生成时的start/end参数,使其与ts_data的时间范围匹配。
内容的提问来源于stack exchange,提问作者dovexz12323
相关产品推荐
相关产品推荐

