Phù hợp với GARCH (1,1) - mô hình với hiệp phương sai trong R


10

Tôi có một số kinh nghiệm với mô hình chuỗi thời gian, dưới dạng các mô hình ARIMA đơn giản, v.v. Bây giờ tôi có một số dữ liệu thể hiện phân cụm biến động và tôi muốn thử bắt đầu với việc khớp mô hình GARCH (1,1) trên dữ liệu.

Tôi có một chuỗi dữ liệu và một số biến tôi nghĩ ảnh hưởng đến nó. Vì vậy, trong thuật ngữ hồi quy cơ bản, có vẻ như:

yt=α+β1xt1+β2xt2+ϵt.

Nhưng tôi hoàn toàn mất khả năng thực hiện điều này thành mô hình GARCH (1,1)? Tôi đã xem xét phần đóng rugarchgói và phần đóng fGarchgói R, nhưng tôi không thể làm bất cứ điều gì có ý nghĩa ngoài các ví dụ mà người ta có thể tìm thấy trên internet.

Câu trả lời:


12

Dưới đây là một ví dụ về việc thực hiện bằng cách sử dụng rugarchgói và với một số dữ liệu giả mạo. Chức năng ugarchfitcho phép sự bao gồm của hồi quy bên ngoài trong phương trình trung bình (lưu ý việc sử dụng external.regressorstrong fit.spectrong các mã dưới đây).

Để sửa các ký hiệu, mô hình là trong đó và biểu thị hiệp phương sai tại thời điểm và với các giả định / yêu cầu "thông thường" về các tham số và quy trình đổi mới .

yt=λ0+λ1xt,1+λ2xt,2+ϵt,ϵt=σtZt,σt2=ω+αϵt12+βσt12,
xt,1xt,2tZt

Các giá trị tham số được sử dụng trong ví dụ như sau.

## Model parameters
nb.period  <- 1000
omega      <- 0.00001
alpha      <- 0.12
beta       <- 0.87
lambda     <- c(0.001, 0.4, 0.2)

Hình ảnh bên dưới hiển thị chuỗi các biến số và cũng như chuỗi . Các mã được sử dụng để tạo ra chúng được cung cấp dưới đây.xt,1xt,2ytR

nhập mô tả hình ảnh ở đây

## Dependencies
library(rugarch)

## Generate some covariates
set.seed(234)
ext.reg.1 <- 0.01 * (sin(2*pi*(1:nb.period)/nb.period))/2 + rnorm(nb.period, 0, 0.0001)
ext.reg.2 <- 0.05 * (sin(6*pi*(1:nb.period)/nb.period))/2 + rnorm(nb.period, 0, 0.001)
ext.reg   <- cbind(ext.reg.1, ext.reg.2)

## Generate some GARCH innovations
sim.spec    <- ugarchspec(variance.model     = list(model = "sGARCH", garchOrder = c(1,1)), 
                          mean.model         = list(armaOrder = c(0,0), include.mean = FALSE),
                          distribution.model = "norm", 
                          fixed.pars         = list(omega = omega, alpha1 = alpha, beta1 = beta))
path.sgarch <- ugarchpath(sim.spec, n.sim = nb.period, n.start = 1)
epsilon     <- as.vector(fitted(path.sgarch))

## Create the time series
y <- lambda[1] + lambda[2] * ext.reg[, 1] + lambda[3] * ext.reg[, 2] + epsilon

## Data visualization
par(mfrow = c(3,1))
plot(ext.reg[, 1], type = "l", xlab = "Time", ylab = "Covariate 1")
plot(ext.reg[, 2], type = "l", xlab = "Time", ylab = "Covariate 2")
plot(y, type = "h", xlab = "Time")
par(mfrow = c(1,1))

Một sự phù hợp được thực hiện ugarchfitnhư sau.

## Fit
fit.spec <- ugarchspec(variance.model     = list(model = "sGARCH",
                                                 garchOrder = c(1, 1)), 
                       mean.model         = list(armaOrder = c(0, 0),
                                                 include.mean = TRUE,
                                                 external.regressors = ext.reg), 
                       distribution.model = "norm")
fit      <- ugarchfit(data = y, spec = fit.spec)

Ước tính tham số là

## Results review
fit.val     <- coef(fit)
fit.sd      <- diag(vcov(fit))
true.val    <- c(lambda, omega, alpha, beta)
fit.conf.lb <- fit.val + qnorm(0.025) * fit.sd
fit.conf.ub <- fit.val + qnorm(0.975) * fit.sd
> print(fit.val)
#     mu       mxreg1       mxreg2        omega       alpha1        beta1 
#1.724885e-03 3.942020e-01 7.342743e-02 1.451739e-05 1.022208e-01 8.769060e-01 
> print(fit.sd)
#[1] 4.635344e-07 3.255819e-02 1.504019e-03 1.195897e-10 8.312088e-04 3.375684e-04

Và giá trị thực tương ứng là

> print(true.val)
#[1] 0.00100 0.40000 0.20000 0.00001 0.12000 0.87000

Hình dưới đây cho thấy ước tính tham số với khoảng tin cậy 95% và giá trị thực. Các Rmã được sử dụng để tạo ra nó được cung cấp dưới đây.

nhập mô tả hình ảnh ở đây

plot(c(lambda, omega, alpha, beta), pch = 1, col = "red",
     ylim = range(c(fit.conf.lb, fit.conf.ub, true.val)),
     xlab = "", ylab = "", axes = FALSE)
box(); axis(1, at = 1:length(fit.val), labels = names(fit.val)); axis(2)
points(coef(fit), col = "blue", pch = 4)
for (i in 1:length(fit.val)) {
    lines(c(i,i), c(fit.conf.lb[i], fit.conf.ub[i]))
}
legend( "topleft", legend = c("true value", "estimate", "confidence interval"),
        col = c("red", "blue", 1), pch = c(1, 4, NA), lty = c(NA, NA, 1), inset = 0.01)

Làm thế nào bạn ước tính các thông số (lambda, omega, alpha, beta) ??
chs

1
@chs Các ước tính tham số đã thu được với ugarchfithàm.
QuantIbex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.