设为首页 加入收藏

TOP

在 R 中估计 GARCH 参数存在的问题(八)
2019-08-15 00:10:00 】 浏览:424
Tags:估计 GARCH 参数 存在 问题
%+% param_reshape(params_lbfgsbnm) + ggtitle("L-BFGS-B Optimization with Nelder-Mead"))

诚然,QMLE 并非 garchFit() 的默认估计方法,默认的是正态分布。不幸的是,这没有带来更好的结果。

print(ggp %+% param_reshape(params_norm) + ggtitle("cond.dist = 'norm'"))

在 CRAN,fGarch 自 2013 年以来没有看到更新!有可能 fGarch 开始显现出它的落伍老迈,新的包装已经解决了我在这里强调的一些问题。包 tseries 提供了一个函数 garch(),它也通过 QMLE 拟合 \(\text{GARCH}(1,1)\) 模型,并且比 fGarch 更新。它是我所知道的唯一可以拟合 \(\text{GARCH}(1,1)\) 模型的其他包。

不幸的是,garch() 没有做得更好。事实上,它似乎更糟糕。问题再一次出现在 \(\beta\) 身上。

library(tseries)

getFitDatagarch <- function(x)
{
    garch(x)$coef
}

params_tseries <- foreach(
    t = 50:1000,
    .combine = rbind,
    .packages = c("tseries")) %dopar%
    {
        getFitDatagarch(x[1:t])
    }
rownames(params_tseries) <- 50:1000

param_reshape_tseries <- function(p)
{
    p <- as.data.frame(p)
    p$t <- as.integer(rownames(p))

    pnew <- melt(
        p, id.vars = "t", variable.name = "parameter")

    pnew$parameter <- as.character(pnew$parameter)

    return(pnew)
}

ggplot(
    param_reshape_tseries(params_tseries),
    aes(x = t, y = value)) +
    geom_line() +
    geom_hline(
        yintercept = 0.2, color = "blue") +
    scale_y_continuous(
        breaks = c(0, 0.2, 0.25, 0.5, 0.75, 1)) +
    coord_cartesian(ylim = c(0, 1)) +
    facet_grid(. ~ parameter)

所有这些实验均在固定(但随机选择)的序列上进行。实验显示,对于样本量小于 300(可能更大的数字)的情况,\(\text{GARCH}(1,1)\) 参数估计的分布是可疑的。当我们模拟许多过程并查看参数的分布时会发生什么?

我模拟了 10000 个样本大小为 100、500 和 1000 的 \(\text{GARCH}(1,1)\) 过程(使用与之前相同的参数)。以下是参数估计的经验分布。

experiments2 <- foreach(
    n = c(100, 500, 1000)) %do%
    {
        mat <- foreach(
            i = 1:10000,
            .combine = rbind,
            .packages = c("fGarch")) %dopar%
            {
                x <- garchSim(
                    garchSpec(
                        model = list(
                            omega = 0.2, alpha = 0.2, beta = 0.2)),
                    n.start = 1000,
                    n = n)
                getFitData(x)
            }
        rownames(mat) <- NULL
        mat
    }
names(experiments2) <- c(100, 500, 1000)

save(params, x, experiments1,
     xarch, params_arch, params_lbfgsb,
     params_nlminbnm, params_lbfgsbnm,
     params_norm, params_tseries,
     experiments2,
     file = "garchfitexperiments.Rda")

param_sim <- lapply(
    experiments2,
    function(mat)
    {
        df <- as.data.frame(mat)
        df <- df[c("omega", "alpha1", "beta1")]
        return(df)
    }) %>%
    ldply(.id = "n")
param_sim <- param_sim %>%
    melt(id.vars = "n", variable.name = "parameter")
head(param_sim)
##     n parameter        value
## 1 100     omega 8.015968e-02
## 2 100     omega 2.493595e-01
## 3 100     omega 2.300699e-01
## 4 100     omega 3.674244e-07
## 5 100     omega 2.697577e-03
## 6 100     omega 2.071737e-01
ggplot(
    param_sim,
    aes(x = value)) +
    geom_density(
        fill = "grey", alpha = 0.7) +
    geom_vline(
        xintercept = 0.2, color = "blue") +
    facet_grid(
        n ~ parameter)

当样本量为 100 时,这些估计远非可靠。\(\omega\)\(\alpha\) 以一种令人不安的倾向趋近于 0,而 \(\beta\) 几乎可以说是任何东西。如上所述,garchFit() 报告的标准差不会捕获这种行为。对于较大的样本量,\(\omega\)\(\alpha\) 表现得更好,但 \(\beta\) 仍显示出令人不安的行为。它的变化幅度几乎没有变化,并且它仍然有过小的倾向。

最让我困扰的是样本量为 1000 让我感觉很大。如果一个人正在查看股票价格的每日数据,那么此样本大小大致相当于 4 年的数据。这告诉我,这种病态行为正在影响人们现在试图估计并在模型中使用的 GARCH 模型。

结论

由 John C. Nash 撰写的题为《On best practice optimization methods in R》的文章,发表于 2014 年 9 月的 Journal of Statistical Software,讨论了 R 需要更好的优化计算实践。特别是,他强调了 garchFit() 使用了过时的方法(或至少它们的 R 实现)。他主张在社区中提高对优化问题的认识,并提高包的灵活性,而不仅仅是使用 optim() 提供的不同算法。

我在本文中强调的问题让我更加意识到选择在优化方法中的重要性。我最初的目标是

首页 上一页 5 6 7 8 9 下一页 尾页 8/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇时间序列分析工具箱—— h2o + ti.. 下一篇使用记忆化优化你的 R 代码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目