经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
在 R 中估计 GARCH 参数存在的问题(续)
来源:cnblogs  作者:xuruilong100  时间:2018/12/10 9:42:34  对本文有异议

目录

在 R 中估计 GARCH 参数存在的问题(续)

本文承接《在 R 中估计 GARCH 参数存在的问题》

链接:https://www.cnblogs.com/xuruilong100/p/9986088.html

在之前的博客《在 R 中估计 GARCH 参数存在的问题》中,Curtis Miller 讨论了 fGarch 包和 tseries 包估计 GARCH(1, 1) 模型参数的稳定性问题,结果不容乐观。本文承接之前的博客,继续讨论估计参数的稳定性,这次使用的是前文中提到,但没有详尽测试的 rugarch 包。

rugarch 包的使用

rugarch 包中负责估计 GARCH 模型参数的最主要函数是 ugarchfit,不过在调用该函数值前要用函数 ugarchspec 创建一个特殊对象,用来固定 GARCH 模型的阶数。

  1. srs = ...
  2. garch_mod = ugarchspec(
  3. variance.model = list(
  4. garchOrder = c(1, 1)),
  5. mean.model = list(
  6. armaOrder = c(0, 0),
  7. include.mean = FALSE))
  8. g <- ugarchfit(spec = garch_mod, data = srs)

需要注意的是 g 是一个 S4 类。

简单实验

首先用 1000 个模拟样本,

  1. library(rugarch)
  2. library(ggplot2)
  3. library(fGarch)
  4. set.seed(110117)
  5. x <- garchSim(
  6. garchSpec(
  7. model = list(
  8. "alpha" = 0.2, "beta" = 0.2, "omega" = 0.2)),
  9. n.start = 1000,
  10. n = 1000)
  11. plot(x)

  1. garch_spec = ugarchspec(
  2. variance.model = list(garchOrder = c(1, 1)),
  3. mean.model = list(
  4. armaOrder = c(0, 0), include.mean = FALSE))
  5. g_all <- ugarchfit(
  6. spec = garch_spec, data = x)
  7. g_50p <- ugarchfit(
  8. spec = garch_spec, data = x[1:500])
  9. g_20p <- ugarchfit(
  10. spec = garch_spec, data = x[1:200])

结果同样不容乐观,

  1. coef(g_all)
  2. # omega alpha1 beta1
  3. # 2.473776e-04 9.738059e-05 9.989026e-01
  4. coef(g_50p)
  5. # omega alpha1 beta1
  6. # 2.312677e-04 4.453120e-10 9.989998e-01
  7. coef(g_20p)
  8. # omega alpha1 beta1
  9. # 0.03370291 0.09823614 0.79988068

再用 10000 个模拟样本试试,如果使用日线级别的数据的话,这相当于 40 年长度的数据量,

  1. set.seed(110117)
  2. x <- garchSim(
  3. garchSpec(
  4. model = list(
  5. "alpha" = 0.2, "beta" = 0.2, "omega" = 0.2)),
  6. n.start = 1000, n = 10000)
  7. plot(x)
  8. g_all <- ugarchfit(
  9. spec = garch_spec, data = x)
  10. g_50p <- ugarchfit(
  11. spec = garch_spec, data = x[1:5000])
  12. g_20p <- ugarchfit(
  13. spec = garch_spec, data = x[1:2000])

  1. coef(g_all)
  2. # omega alpha1 beta1
  3. # 0.1955762 0.1924522 0.1967614
  4. coef(g_50p)
  5. # omega alpha1 beta1
  6. # 0.2003755 0.1919633 0.1650453
  7. coef(g_20p)
  8. # omega alpha1 beta1
  9. # 1.368689e-03 6.757177e-09 9.951920e-01

看来数据量极端大的时候,估计才可能是合理的、稳定的。

rugarch 参数估计的行为

首先使用 1000 个模拟样本做连续估计,样本数从 500 升至 1000。

  1. library(doParallel)
  2. cl <- makeCluster(detectCores() - 1)
  3. registerDoParallel(cl)
  4. set.seed(110117)
  5. x <- garchSim(
  6. garchSpec(
  7. model = list(alpha = 0.2, beta = 0.2, omega = 0.2)),
  8. n.start = 1000, n = 1000)
  9. params <- foreach(
  10. t = 500:1000,
  11. .combine = rbind,
  12. .packages = c("rugarch")) %dopar%
  13. {
  14. getFitDataRugarch(x[1:t])
  15. }
  16. rownames(params) <- 500:1000
  17. params_df <- as.data.frame(params)
  18. params_df$t <- as.numeric(rownames(params))
  19. ggplot(params_df) +
  20. geom_line(
  21. aes(x = t, y = beta1)) +
  22. geom_hline(
  23. yintercept = 0.2, color = "blue") +
  24. geom_ribbon(
  25. aes(x = t,
  26. ymin = beta1 - 2 * beta1.se,
  27. ymax = beta1 + 2 * beta1.se),
  28. color = "grey", alpha = 0.5) +
  29. ylab(expression(hat(beta))) +
  30. scale_y_continuous(
  31. breaks = c(0, 0.2, 0.25, 0.5, 1)) +
  32. coord_cartesian(ylim = c(0, 1))

几乎所有关于 \(\beta\) 的估计都非常肯定的被认为是 1!这个结果相较于 fGarch 包来说,更加糟糕。

让我们看看其他参数的行为。

  1. library(reshape2)
  2. library(plyr)
  3. library(dplyr)
  4. param_reshape <- function(p)
  5. {
  6. p <- as.data.frame(p)
  7. p$t <- as.integer(rownames(p))
  8. pnew <- melt(p, id.vars = "t", variable.name = "parameter")
  9. pnew$parameter <- as.character(pnew$parameter)
  10. pnew.se <- pnew[grepl("*.se", pnew$parameter), ]
  11. pnew.se$parameter <- sub(".se", "", pnew.se$parameter)
  12. names(pnew.se)[3] <- "se"
  13. pnew <- pnew[!grepl("*.se", pnew$parameter), ]
  14. return(
  15. join(
  16. pnew, pnew.se,
  17. by = c("t", "parameter"),
  18. type = "inner"))
  19. }
  20. ggp <- ggplot(
  21. param_reshape(params),
  22. aes(x = t, y = value)) +
  23. geom_line() +
  24. geom_ribbon(
  25. aes(ymin = value - 2 * se,
  26. ymax = value + 2 * se),
  27. color = "grey",
  28. alpha = 0.5) +
  29. geom_hline(yintercept = 0.2, color = "blue") +
  30. scale_y_continuous(
  31. breaks = c(0, 0.2, 0.25, 0.5, 0.75, 1)) +
  32. coord_cartesian(ylim = c(0, 1)) +
  33. facet_grid(. ~ parameter)
  34. print(ggp + ggtitle("solnp Optimization"))

这种现象不仅限于 \(\beta\)\(\omega\)\(\alpha\) 也表现出极端不良行为。

极端大样本

下面将样本总数扩充至 10000,连续估计的样本数从 5000 升至 10000,情况有会怎么样?

  1. set.seed(110117)
  2. x <- garchSim(
  3. garchSpec(
  4. model = list(alpha = 0.2, beta = 0.2, omega = 0.2)),
  5. n.start = 1000, n = 10000)
  6. params10k <- foreach(
  7. t = seq(5000, 10000, 100),
  8. .combine = rbind,
  9. .packages = c("rugarch")) %dopar%
  10. {
  11. getFitDataRugarch(x[1:t])
  12. }
  13. rownames(params10k) <- seq(5000, 10000, 100)
  14. params10k_df <- as.data.frame(params10k)
  15. params10k_df$t <- as.numeric(rownames(params10k))
  16. ggplot(params10k_df) +
  17. geom_line(
  18. aes(x = t, y = beta1)) +
  19. geom_hline(
  20. yintercept = 0.2, color = "blue") +
  21. geom_ribbon(
  22. aes(x = t,
  23. ymin = beta1 - 2 * beta1.se,
  24. ymax = beta1 + 2 * beta1.se),
  25. color = "grey", alpha = 0.5) +
  26. ylab(expression(hat(beta))) +
  27. scale_y_continuous(
  28. breaks = c(0, 0.2, 0.25, 0.5, 1)) +
  29. coord_cartesian(ylim = c(0, 1))

结果堪称完美!之前的猜测是对的,样本要极端大才能保证估计的质量。

其他参数的行为。

  1. ggp10k <- ggplot(
  2. param_reshape(params10k),
  3. aes(x = t, y = value)) +
  4. geom_line() +
  5. geom_ribbon(
  6. aes(ymin = value - 2 * se,
  7. ymax = value + 2 * se),
  8. color = "grey",
  9. alpha = 0.5) +
  10. geom_hline(yintercept = 0.2, color = "blue") +
  11. scale_y_continuous(
  12. breaks = c(0, 0.2, 0.25, 0.5, 0.75, 1)) +
  13. coord_cartesian(ylim = c(0, 1)) +
  14. facet_grid(. ~ parameter)
  15. print(ggp10k + ggtitle("solnp Optimization"))

相较于 \(\beta\)\(\omega\)\(\alpha\) 的估计值更加稳定,这一节论和之前文章中的结论大体一致,参数估计的不稳定性集中体现在 \(\beta\) 身上。

结论

在一般大小样本量的情况下,rugarchfGarch 的表现都不好,即使改变函数的最优化算法(相关代码未贴出)也于事无补。不过当样本量极端大时,rugarch 的稳定性大幅改善,这似乎印证了机器学习中的一个常见观点,即大样本 + 简单算法胜过小样本 + 复杂算法

为了解决非大样本情况下估计的稳定性问题,有必要找到一种 bootstrap 方法,人为扩充现实问题中有限的样本量;或者借鉴机器学习的思路,对参数施加正则化约束。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号