You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的rugarch包GARCH模型中使用自定义EGB2分布?

在rugarch包中使用自定义EGB2分布的实现方法

要在rugarch中使用非内置的EGB2分布,仅提供PDF函数是不够的——包在模型估计、模拟过程中需要完整的概率密度(PDF)、累积分布(CDF)、分位数、随机数生成四个核心函数,再通过注册流程将自定义分布纳入rugarch的识别体系。具体步骤如下:


1. 编写完整的EGB2分布函数

确保四个函数的参数顺序严格匹配rugarch的要求:

# 1. EGB2概率密度函数(替换为你已实现的逻辑)
dEGB2 <- function(x, mu, sigma, shape1, shape2, log = FALSE) {
  z <- (x - mu)/sigma
  # 此处替换为你的EGB2 PDF计算代码
  pdf_val <- ... 
  if (log) return(log(pdf_val)) else return(pdf_val)
}

# 2. EGB2累积分布函数
pEGB2 <- function(q, mu, sigma, shape1, shape2, lower.tail = TRUE, log.p = FALSE) {
  z <- (q - mu)/sigma
  # 此处替换为你的EGB2 CDF计算代码
  cdf_val <- ...
  if (!lower.tail) cdf_val <- 1 - cdf_val
  if (log.p) return(log(cdf_val)) else return(cdf_val)
}

# 3. EGB2分位数函数(可通过数值优化反推CDF)
qEGB2 <- function(p, mu, sigma, shape1, shape2, lower.tail = TRUE, log.p = FALSE) {
  if (log.p) p <- exp(p)
  if (!lower.tail) p <- 1 - p
  # 用uniroot求解分位数,需根据EGB2分布特性调整区间范围
  quant_func <- function(q) pEGB2(q, mu, sigma, shape1, shape2) - p
  q_val <- uniroot(quant_func, interval = c(mu - 10*sigma, mu + 10*sigma))$root
  return(q_val)
}

# 4. EGB2随机数生成函数(基于分位数函数实现)
rEGB2 <- function(n, mu, sigma, shape1, shape2) {
  u <- runif(n)
  r_val <- qEGB2(u, mu, sigma, shape1, shape2)
  return(r_val)
}

2. 将EGB2分布注册到rugarch

使用setdistroption()函数完成注册,明确分布的参数信息:

library(rugarch)

# 注册自定义EGB2分布
setdistroption(distribution = "eGB2",
               distf = list(density = "dEGB2", 
                            distribution = "pEGB2", 
                            quantile = "qEGB2", 
                            random = "rEGB2"),
               pars = 4, # EGB2的参数数量:mu、sigma、shape1、shape2
               param.names = c("mu", "sigma", "shape1", "shape2"),
               param.bounds = list(lower = c(-Inf, 1e-6, 1e-6, 1e-6), 
                                   upper = c(Inf, Inf, Inf, Inf)))

注:参数上下界需匹配EGB2分布的实际约束,比如sigma必须为正,形状参数通常也需大于0。


3. 验证自定义分布的可用性

注册完成后,即可像内置分布一样在模型规格中调用:

# 定义eGARCH模型规格
spec <- ugarchspec(
  variance.model = list(
    model = "eGARCH",
    garchOrder = c(1, 1)
  ),
  mean.model = list(
    armaOrder = c(1, 1),
    include.mean = TRUE
  ),
  distribution.model = "eGB2"
)

# 用模拟数据测试拟合(可选)
set.seed(123)
sim_data <- ugarchsim(spec, n.sim = 1000)
fit <- ugarchfit(spec, data = as.vector(sim_data@simulation$seriesSim))

关键注意事项

  • 四个函数的参数顺序不能错,必须严格匹配rugarch的预期格式;
  • 分位数函数的数值求解需保证稳定性,可根据EGB2分布的尾部特性调整uniroot的区间范围;
  • 若EGB2分布有参数简化形式,需同步调整注册时的参数数量和函数参数。

内容的提问来源于stack exchange,提问作者Andy Van

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:10:15