如何在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
相关产品推荐
相关产品推荐

