深度 | 在 R 中估计 GARCH 参数存在的问题

2018 年 11 月 23 日 量化投资与机器学习



本期作者:徐瑞龙

未经授权,严禁转载


本文翻译自《Problems In Estimating GARCH Parameters in R 》


原文链接:

https://ntguardian.wordpress.com/2017/11/02/problems-estimating-garch-parameters-r/


源代码:点击阅读原文



我从 R 的金融板块邮件列表收到一位知名金融工具包贡献者——Brian Peterson 的邮件:


我强烈建议关注 rugarch 和 rmgarch。RMetrics 序列包的主要维护者 Diethelm Wuertz 在 2016 年死于车祸,目前的代码基本处于无维护状态。


我会看看这是否解决了这个问题。谢谢 Brian!我把这篇帖子留给其他人,作为将来避免使用 gGarch 的告诫。这对我来说是个新闻,因为书籍经常引用 fGarch,所以这可能是那些寻求在 R 中使用 GARCH 模型的人的资源——为什么不要使用 fGarch。


我用 rugarch 进行了一次快速实验,看起来它同样被这个问题困扰。下面是我运行的代码,我会尽快在明天贴出一份全面的研究。

library(rugarch)

spec = ugarchspec(
   variance.model = list(garchOrder = c(1, 1)),
   mean.model = list(
       armaOrder = c(0, 0), include.mean = FALSE),
   fixed.pars = list(
       alpha1 = 0.2, beta1 = 0.2, omega = 0.2))
ugarchpath(
   spec = spec, n.sim = 1000, n.start = 1000) -> x
srs = x@path$seriesSim
spec1 = ugarchspec(
   variance.model = list(garchOrder = c(1, 1)),
   mean.model = list(
       armaOrder = c(0, 0), include.mean = FALSE))
ugarchfit(spec = spec1, data = srs)
ugarchfit(spec = spec1, data = srs[1:100])


这些天我的研究重点是变点检测方法。这些是用于检测数据序列中出现结构性变化的统计检验和过程。来自质量控制的早期示例是在生产小部件时检测机器是否未校准。可能存在一些感兴趣的测量值,例如我们观察到的滚珠轴承的直径。机器按顺序生成这些小部件。在原假设下,滚珠轴承的平均直径不会改变,而在备择假设中,在制造过程中的某些未知点处,机器变得未校准并且滚珠轴承的平均直径发生变化。然后,检验在这两个假设之间做出决定。


这些类型的检验对经济学家和金融业工作者也很重要,特别是对于预测。我们再次使用按时间索引的序列数据,我首选的例子是股票的价格,在给出了股票的常见时间序列图,人们可以立即将其识别为时间序列,但还有更多的数据集,如州的 GDP 或失业率。经济学家希望使用过去的数据和统计量预测这些数量。统计方法的一个假设是要预测的序列是平稳的:数据的产生过程具有单一的均值、自相关性、分布等。这个假设并不总是经过检验,但对成功的预测至关重要。结构性变化的检验检查了这个假设,如果结果是假的,预测者可能需要在训练他们的模型时分割他们的数据集。


我之前写过关于这些检验的文章,介绍了 CUSUM 统计量,这是检测结构性变化的最流行的统计量。我的导师和他以前的博士生(Greg Rice,目前是滑铁卢大学的教授)开发了一个新的检验统计量,可以更好地检测数据集中早期或晚期发生的结构性变化(想象一下,制作小部件的机器几乎没有被校准,一百个小部件中只有最后一打样本受到影响)。我们提交论文的期刊正在要求我们进行修订,其中一个修订是更好的示例应用(我们最初使用上述博客文章中讨论的工资 / 生产率数据,审稿人抱怨这些变量是被相同因素决定的(codetermined),所以使用一个对另一个做回归没意义,我不同意这样的抱怨,但我不会在这里争论)。


我们希望将我们的检验应用于检测 GARCH 模型中的结构性变化,这是金融时间序列中的常见模型。据我所知,用于 GARCH 模型估计和推断(以及其他工作)的“最新技术” R 包是 fGarch。特别是,函数 garchFit() 用于从数据中估计 GARCH 模型。但是,当我们尝试在我们的检验中使用此函数时,我们得到了明显病态的数值(我们已经完成了模拟研究以了解预期的行为)。没有变化的原假设在模拟序列上被完全拒绝。我从未看到检验未能拒绝原假设,即使原假设总是对的。即使样本量为 10000,几乎不是小样本也是如此。


我们认为问题可能在于参数估计的协方差矩阵的估计,并且我煞费苦心地推导和编写函数以使该矩阵不使用数值微分,但这并没有阻止不良行为。最后我的导师和我上周三戏弄了 garchFit() 一把,并发现该函数应该受到责备。当我估计参数(不一定是我们最初认为的协方差矩阵,尽管它可能也被污染)时,函数对模拟数据的行为是如此不稳定,依我来看,该函数基本上是无用的。


这个函数应该是众所周知的,问题当然可能在于我,而不是 fGarch(或者可能有更好的包)。这个函数是如此重要,让我感到我应该分享我的发现。在这篇文章中,我展示了一序列数值实验,证明了 garchFit() 的病态行为。


‍‍‍‍

A‍‍RCH 模型基础



估计 GARCH 参数