## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
has_bgev <- requireNamespace("bgev", quietly = TRUE)
knitr::opts_chunk$set(eval = has_bgev)
library(GEVStableGarch)

## ----check-bgev, eval = !has_bgev, echo = FALSE, results = "asis"-------------
cat("> The `bgev` package is not installed, so the code below is shown but not run.\n")

## ----build--------------------------------------------------------------------
# bgev_mean <- function(xi, delta)
#   integrate(function(p) bgev::qbgev(p, 0, 1, xi, delta), 0, 1,
#             subdivisions = 400L, rel.tol = 1e-6)$value
# 
# bgev_innov <- gs_dist(
#   name = "bgev",
#   log_density = function(z, par) {
#     d <- bgev::dbgev(z, 0, 1, par[["bgev_xi"]], par[["bgev_delta"]])
#     ifelse(d > 0, log(d), -Inf)
#   },
#   random   = function(n, par) bgev::rbgev(n, 0, 1, par[["bgev_xi"]], par[["bgev_delta"]]),
#   cdf      = function(q, par) bgev::pbgev(q, 0, 1, par[["bgev_xi"]], par[["bgev_delta"]]),
#   quantile = function(p, par) bgev::qbgev(p, 0, 1, par[["bgev_xi"]], par[["bgev_delta"]]),
#   par_names = c("bgev_xi", "bgev_delta"),
#   lower = c(bgev_xi = 0.02, bgev_delta = 0.5),
#   upper = c(bgev_xi = 0.45, bgev_delta = 5),
#   start = c(bgev_xi = 0.20, bgev_delta = 2),
#   default_delta = 2,                                   # GARCH mode: variance recursion
#   max_power = function(par) (par[["bgev_delta"]] + 1) / par[["bgev_xi"]],
#   mean = function(par) bgev_mean(par[["bgev_xi"]], par[["bgev_delta"]]))

## ----check--------------------------------------------------------------------
# gs_check_dist(bgev_innov)

## ----fit----------------------------------------------------------------------
# spec  <- gs_spec(garch = c(1, 1), dist = bgev_innov)
# model <- gs_model(spec, mu = 0, omega = 0.1, alpha = 0.1, beta = 0.6,
#                   dist_par = c(bgev_xi = 0.1, bgev_delta = 4))
# gs_stationarity(model)
# 
# x   <- gs_sim(model, n = 3000, seed = 7)$y
# fit <- gs_fit(x, spec)
# fit

## ----forecast-----------------------------------------------------------------
# predict(fit, n_ahead = 5, level = c(0.01, 0.05), n_sim = 5000, seed = 1)

## ----pit----------------------------------------------------------------------
# u <- residuals(fit, type = "pit")
# round(quantile(u, c(0.1, 0.5, 0.9)), 3)

