Title: | Mixed-Frequency GARCH Models |
---|---|
Description: | Estimating GARCH-MIDAS (MIxed-DAta-Sampling) models (Engle, Ghysels, Sohn, 2013, <doi:10.1162/REST_a_00300>) and related statistical inference, accompanying the paper "Two are better than one: Volatility forecasting using multiplicative component GARCH models" by Conrad and Kleen (2020, <doi:10.1002/jae.2742>). The GARCH-MIDAS model decomposes the conditional variance of (daily) stock returns into a short- and long-term component, where the latter may depend on an exogenous covariate sampled at a lower frequency. |
Authors: | Onno Kleen [aut, cre] |
Maintainer: | Onno Kleen <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.2.1 |
Built: | 2025-03-03 04:33:34 UTC |
Source: | https://github.com/onnokleen/mfgarch |
A dataset containing the S&P 500 stock returns and the NFCI
df_financial
df_financial
A data frame with 11,306 rows and 5 variables:
date
daily S&P 500 log returns times 100
5-minute realized variances
a dummy for each year/week combination
National Financial Conditions Index
https://github.com/onnokleen/mfGARCH/
https://fred.stlouisfed.org/series/NFCI
https://realized.oxford-man.ox.ac.uk
A dataset containing the S&P 500 stock returns, realized variances and macroeconomic variables
df_mfgarch
df_mfgarch
A data frame with 11,938 rows and 11 variables:
date
daily S&P 500 log returns times 100
open-close returns
5-minute realized variances
Cboe VIX
a dummy for each year/week combination
changes in housing starts
changes in industrial production
NAI
National Financial Conditions Index
a dummy for each year/month combination
https://github.com/onnokleen/mfGARCH/
https://realized.oxford-man.ox.ac.uk
This function estimates a multiplicative mixed-frequency GARCH model. For the sake of numerical stability, it is best to multiply log returns by 100.
fit_mfgarch( data, y, x = NULL, K = NULL, low.freq = "date", var.ratio.freq = NULL, gamma = TRUE, weighting = "beta.restricted", x.two = NULL, K.two = NULL, low.freq.two = NULL, weighting.two = NULL, multi.start = FALSE, control = list(par.start = NULL) )
fit_mfgarch( data, y, x = NULL, K = NULL, low.freq = "date", var.ratio.freq = NULL, gamma = TRUE, weighting = "beta.restricted", x.two = NULL, K.two = NULL, low.freq.two = NULL, weighting.two = NULL, multi.start = FALSE, control = list(par.start = NULL) )
data |
data frame containing a column named date of type 'Date'. |
y |
name of high frequency dependent variable in df. |
x |
covariate employed in mfGARCH. |
K |
an integer specifying lag length K in the long-term component. |
low.freq |
a string of the low frequency variable in the df. |
var.ratio.freq |
specify a frequency column on which the variance ratio should be calculated. |
gamma |
if TRUE, an asymmetric GJR-GARCH is used as the short-term component. If FALSE, a simple GARCH(1,1) is employed. |
weighting |
specifies the weighting scheme employed in the long-term component. Options are "beta.restricted" (default) or "beta.unrestricted" |
x.two |
optional second covariate |
K.two |
lag lgenth of optional second covariate |
low.freq.two |
low frequency of optional second covariate |
weighting.two |
specifies the weighting scheme employed in the optional second long-term component. Currently, the only option is "beta.restricted" |
multi.start |
if TRUE, optimization is carried out with multiple starting values |
control |
a list |
A list of class mfGARCH with letters and numbers.
par - vector of estimated parameters
rob.std.err - sandwich/HAC-type standard errors
broom.mgarch - a broom-like data.frame with entries 1) estimate: column of estimated parameters 2) rob.std.err - sandwich/HAC-type standard errors 3) p.value - p-values derived from sandwich/HAC-type standard errors 4) opg.std.err - Bollerslev-Wooldrige/OPG standard errors for GARCH processes 5) opg.p.value - corresponding alternative p-values
tau - fitted long-term component
g - fitted short-term component
df.fitted - data frame with fitted values and residuals
K - chosen lag-length in the long-term component
weighting.scheme - chosen weighting scheme
llh - log-likelihood value at estimated parameter vector
bic - corresponding BIC value
y - dependent variable y
optim - output of the optimization routine
K.two - lag-lenth of x.two if two covariates are employed
weighting.scheme.two - chosen weighting scheme of x.two (if K.two != NULL)
tau.forecast - one-step ahead forecast of the long-term component
variance.ratio - calculated variance ratio
est.weighting - estimated weighting scheme
est.weighting.two - estimated weighting scheme of x.two (if K.two != NULL)
## Not run: fit_mfgarch(data = df_financial, y = "return", x = "nfci", low.freq = "week", K = 52) fit_mfgarch(data = df_mfgarch, y = "return", x = "nfci", low.freq = "year_week", K = 52, x.two = "dindpro", K.two = 12, low.freq.two = "year_month", weighting.two = "beta.restricted") ## End(Not run)
## Not run: fit_mfgarch(data = df_financial, y = "return", x = "nfci", low.freq = "week", K = 52) fit_mfgarch(data = df_mfgarch, y = "return", x = "nfci", low.freq = "year_week", K = 52, x.two = "dindpro", K.two = 12, low.freq.two = "year_month", weighting.two = "beta.restricted") ## End(Not run)
This function plots the weighting scheme of an estimated GARCH-MIDAS model
plot_weighting_scheme(x)
plot_weighting_scheme(x)
x |
mfGARCH object obtained by fit_mfgarch |
This function simulates a GARCH-MIDAS model. Innovations can follow a standard normal or student-t distribution.
simulate_mfgarch( n.days, mu, alpha, beta, gamma, m, theta, w1 = 1, w2, K, psi, sigma.psi, low.freq = 1, n.intraday = 288, student.t = NULL, corr = 0 )
simulate_mfgarch( n.days, mu, alpha, beta, gamma, m, theta, w1 = 1, w2, K, psi, sigma.psi, low.freq = 1, n.intraday = 288, student.t = NULL, corr = 0 )
n.days |
number of days |
mu |
mu |
alpha |
alpha |
beta |
beta |
gamma |
gamma |
m |
m |
theta |
theta |
w1 |
w1 |
w2 |
w2 |
K |
K |
psi |
psi |
sigma.psi |
sigma.psi |
low.freq |
number of days per low-frequency period |
n.intraday |
number of maximum intraday returns |
student.t |
either NULL or degrees of freedom |
corr |
correlation between innovations (should only be used for daily tau) |
simulate_mfgarch(n.days = 200, mu = 0, alpha = 0.06, beta = 0.92, gamma = 0, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 12, psi = 0.98, sigma.psi = 0.1, low.freq = 10)
simulate_mfgarch(n.days = 200, mu = 0, alpha = 0.06, beta = 0.92, gamma = 0, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 12, psi = 0.98, sigma.psi = 0.1, low.freq = 10)
This function simulates a GARCH-MIDAS model where the short-term GARCH component is replaced by its diffusion limit, see Andersen (1998)
simulate_mfgarch_diffusion( n.days, mu, alpha, beta, m, theta, w1 = 1, w2, K, psi, sigma.psi, low.freq = 1, n.intraday = 288 )
simulate_mfgarch_diffusion( n.days, mu, alpha, beta, m, theta, w1 = 1, w2, K, psi, sigma.psi, low.freq = 1, n.intraday = 288 )
n.days |
number of days |
mu |
mu |
alpha |
alpha |
beta |
beta |
m |
m |
theta |
theta |
w1 |
w1 |
w2 |
w2 |
K |
K |
psi |
psi |
sigma.psi |
sigma.psi |
low.freq |
low.freq |
n.intraday |
n.intraday |
## Not run: simulate_mfgarch_diffusion(n.days = 200, mu = 0, alpha = 0.06, beta = 0.92, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 12, psi = 0.98, sigma.psi = 0.1, low.freq = 10) ## End(Not run)
## Not run: simulate_mfgarch_diffusion(n.days = 200, mu = 0, alpha = 0.06, beta = 0.92, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 12, psi = 0.98, sigma.psi = 0.1, low.freq = 10) ## End(Not run)
Simulate a GARCH-MIDAS similar to Wang/Ghysels with lagged RVol as covariate
simulate_mfgarch_rv_dependent( n.days, mu, alpha, beta, gamma, m, theta, w1 = 1, w2, K, n.intraday = 288, low.freq = 1, rvol = FALSE )
simulate_mfgarch_rv_dependent( n.days, mu, alpha, beta, gamma, m, theta, w1 = 1, w2, K, n.intraday = 288, low.freq = 1, rvol = FALSE )
n.days |
number of days |
mu |
mu |
alpha |
alpha |
beta |
beta |
gamma |
gamma |
m |
m |
theta |
theta |
w1 |
w1 |
w2 |
w2 |
K |
K |
n.intraday |
number of maximum intraday returns, default 288 |
low.freq |
number of days per low frequency |
rvol |
if TRUE, the square root of the realized variance is used as a covariate |
simulate_mfgarch_rv_dependent(n.days = 2200, mu = 0, alpha = 0.06, beta = 0.92, gamma = 0, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 3, low.freq = 22)
simulate_mfgarch_rv_dependent(n.days = 2200, mu = 0, alpha = 0.06, beta = 0.92, gamma = 0, m = 0, theta = 0.1, w1 = 1, w2 = 3, K = 3, low.freq = 22)