R 粗鲁模拟
R rugarch simulation
我想知道 rugarch 规范模型中每个参数的范围。
例如分布误差 "nig" 和模型 "apARCH"。我想知道与 "nig" 分布相关的参数 "skew"、"shape" 以及模型的参数 "gamma" 和 "delta" 的范围是多少"apARCH"。
这是我的代码示例:
varianceModel = list(model="apARCH", garchOrder=c(1,1))
meanModel = list(armaOrder=c(1,1))
distributionModel = "nig"
fixedPars = list(mu=0, ar1 = 0.1, ma1= 0.9, omega=0.001, alpha1=0.1, beta1=0.8, gamma1 = 0.01, delta = 2, shape=1.5, skew = 0.2)
spec <- ugarchspec(variance.model = varianceModel,
mean.model= meanModel, distribution.model=distributionModel,
fixed.pars=fixedPars)
path.sgarch <- ugarchpath(spec, n.sim=1000, n.start=1, m.sim=20)
现在对于每个参数,如何获得可能的范围或 "standard" 参数?
rugarch
的文档中似乎没有此类参数可能取值范围的列表,而 this introduction 仅提供了部分信息。
然而,这些可能值的范围是(至少应该是)标准,因为它们提供 well-defined 分布和固定模型。因此,您应该能够在其他一些来源中找到所有此类范围。
然而,关于发行版,rugarch
中实际上有一个隐藏的源代码可供您使用---rugarch:::.DistributionBounds
函数源代码。例如,它包含
if (distribution == "nig") {
skew = 0.2
skew.LB = -0.99
skew.UB = 0.99
shape = 0.4
shape.LB = 0.01
shape.UB = 25
}
表示 skew
的下限和上限分别为 -0.99 和 0.99。要更快地提取这些数字,您可以使用
rugarch:::.DistributionBounds("nig")[c("skew.LB", "skew.UB")]
# $skew.LB
# [1] -0.99
#
# $skew.UB
# [1] 0.99
关于方差模型,通常 "simple" 范围,例如 APARCH 的 -1 < gamma < 1,不是您想要的 available/what,因为它们只允许模型存在,但不保证平稳性。例如,要使 GARCH(1,1) 平稳,我们需要 alpha + beta < 1;因此,我们实际上有比区间更高的维度约束。正如我所说,您可以在网上找到这些。
然而,ugarchpath
也通过计算 persistence(spec)
来检查这些条件。现在,正如您在
中看到的
getMethod("persistence", signature(object = "uGARCHspec", pars = "missing",
distribution = "missing", model = "missing",
submodel="missing"))
有不同的方法来计算每个规范的持久性。例如,对于 APARCH,我们查看
rugarch:::.persistaparch1
# function (pars, idx, distribution = "norm")
# {
# alpha = pars[idx["alpha", 1]:idx["alpha", 2]]
# beta = pars[idx["beta", 1]:idx["beta", 2]]
# gamma = pars[idx["gamma", 1]:idx["gamma", 2]]
# delta = pars[idx["delta", 1]:idx["delta", 2]]
# skew = pars[idx["skew", 1]:idx["skew", 2]]
# shape = pars[idx["shape", 1]:idx["shape", 2]]
# ghlambda = pars[idx["ghlambda", 1]:idx["ghlambda", 2]]
# ps = sum(beta) + sum(apply(cbind(gamma, alpha), 1, FUN = function(x) x[2] *
# aparchKappa(x[1], delta, ghlambda, shape, skew, distribution)))
# return(ps)
# }
条件是ps < 1
。请注意
rugarch:::.persistsgarch1
# function (pars, idx, distribution = "norm")
# {
# ps = sum(pars[idx["alpha", 1]:idx["alpha", 2]]) + sum(pars[idx["beta",
# 1]:idx["beta", 2]])
# return(ps)
# }
在 GARCH(1,1) 的情况下准确给出 alpha + beta,然后 ugarchpath
检查上述平稳性条件。因此,您可以做的最直接的事情是在模拟之前检查是否 persistence(spec) < 1
。例如,在您的示例中,
persistence(spec)
# [1] 0.8997927
我想知道 rugarch 规范模型中每个参数的范围。 例如分布误差 "nig" 和模型 "apARCH"。我想知道与 "nig" 分布相关的参数 "skew"、"shape" 以及模型的参数 "gamma" 和 "delta" 的范围是多少"apARCH"。 这是我的代码示例:
varianceModel = list(model="apARCH", garchOrder=c(1,1))
meanModel = list(armaOrder=c(1,1))
distributionModel = "nig"
fixedPars = list(mu=0, ar1 = 0.1, ma1= 0.9, omega=0.001, alpha1=0.1, beta1=0.8, gamma1 = 0.01, delta = 2, shape=1.5, skew = 0.2)
spec <- ugarchspec(variance.model = varianceModel,
mean.model= meanModel, distribution.model=distributionModel,
fixed.pars=fixedPars)
path.sgarch <- ugarchpath(spec, n.sim=1000, n.start=1, m.sim=20)
现在对于每个参数,如何获得可能的范围或 "standard" 参数?
rugarch
的文档中似乎没有此类参数可能取值范围的列表,而 this introduction 仅提供了部分信息。
然而,这些可能值的范围是(至少应该是)标准,因为它们提供 well-defined 分布和固定模型。因此,您应该能够在其他一些来源中找到所有此类范围。
然而,关于发行版,rugarch
中实际上有一个隐藏的源代码可供您使用---rugarch:::.DistributionBounds
函数源代码。例如,它包含
if (distribution == "nig") {
skew = 0.2
skew.LB = -0.99
skew.UB = 0.99
shape = 0.4
shape.LB = 0.01
shape.UB = 25
}
表示 skew
的下限和上限分别为 -0.99 和 0.99。要更快地提取这些数字,您可以使用
rugarch:::.DistributionBounds("nig")[c("skew.LB", "skew.UB")]
# $skew.LB
# [1] -0.99
#
# $skew.UB
# [1] 0.99
关于方差模型,通常 "simple" 范围,例如 APARCH 的 -1 < gamma < 1,不是您想要的 available/what,因为它们只允许模型存在,但不保证平稳性。例如,要使 GARCH(1,1) 平稳,我们需要 alpha + beta < 1;因此,我们实际上有比区间更高的维度约束。正如我所说,您可以在网上找到这些。
然而,ugarchpath
也通过计算 persistence(spec)
来检查这些条件。现在,正如您在
getMethod("persistence", signature(object = "uGARCHspec", pars = "missing",
distribution = "missing", model = "missing",
submodel="missing"))
有不同的方法来计算每个规范的持久性。例如,对于 APARCH,我们查看
rugarch:::.persistaparch1
# function (pars, idx, distribution = "norm")
# {
# alpha = pars[idx["alpha", 1]:idx["alpha", 2]]
# beta = pars[idx["beta", 1]:idx["beta", 2]]
# gamma = pars[idx["gamma", 1]:idx["gamma", 2]]
# delta = pars[idx["delta", 1]:idx["delta", 2]]
# skew = pars[idx["skew", 1]:idx["skew", 2]]
# shape = pars[idx["shape", 1]:idx["shape", 2]]
# ghlambda = pars[idx["ghlambda", 1]:idx["ghlambda", 2]]
# ps = sum(beta) + sum(apply(cbind(gamma, alpha), 1, FUN = function(x) x[2] *
# aparchKappa(x[1], delta, ghlambda, shape, skew, distribution)))
# return(ps)
# }
条件是ps < 1
。请注意
rugarch:::.persistsgarch1
# function (pars, idx, distribution = "norm")
# {
# ps = sum(pars[idx["alpha", 1]:idx["alpha", 2]]) + sum(pars[idx["beta",
# 1]:idx["beta", 2]])
# return(ps)
# }
在 GARCH(1,1) 的情况下准确给出 alpha + beta,然后 ugarchpath
检查上述平稳性条件。因此,您可以做的最直接的事情是在模拟之前检查是否 persistence(spec) < 1
。例如,在您的示例中,
persistence(spec)
# [1] 0.8997927