Time-Varying Beta Models: Rolling Window and DCC-GARCH
Simon Mueller
2026-09-06
Source:vignettes/time-varying-models.Rmd
time-varying-models.RmdIntroduction
The standard market model assumes a constant beta over the estimation window. In practice, betas can vary over time due to changing firm risk, leverage, or market conditions. The EventStudy package provides two time-varying beta models:
- RollingWindowModel: Rolling OLS estimation (no additional dependencies)
-
DCCGARCHModel: Dynamic Conditional Correlation
GARCH (requires
rmgarch)
Rolling Window Model
The RollingWindowModel estimates alpha and beta using a
rolling OLS window over the estimation period. The parameters from the
last window are used for event-window prediction.
Basic Usage
library(EventStudy)
task <- EventStudyTask$new(firm_data, index_data, request)
ps <- ParameterSet$new(
return_model = RollingWindowModel$new(window_size = 60)
)
task <- run_event_study(task, ps)Custom Window Size
The window_size parameter controls the width of each
rolling window. A smaller window captures faster parameter changes but
is noisier:
# Shorter window: more responsive but noisier
rw_short <- RollingWindowModel$new(window_size = 30, min_obs = 20)
# Longer window: smoother but slower to adapt
rw_long <- RollingWindowModel$new(window_size = 120, min_obs = 60)Diagnostics
After fitting, you can inspect the time series of rolling parameters:
ps <- ParameterSet$new(
return_model = RollingWindowModel$new(window_size = 60)
)
task <- run_event_study(task, ps)
# Access rolling parameters from the fitted model
model_data <- task$data_tbl$data[[1]]
model_obj <- task$data_tbl$model[[1]]
stats <- model_obj$statistics
# Rolling betas over the estimation window
plot(stats$rolling_betas, type = "l",
main = "Rolling Beta over Estimation Window",
xlab = "Window Index", ylab = "Beta")
abline(h = stats$beta, lty = 2, col = "red") # final betaHow it Works
For each position in the estimation window, a rolling OLS regression is fit: R_{firm,t} = \alpha_w + \beta_w R_{market,t} + \varepsilon_t where w indexes windows of size
window_size.This produces time series of \alpha_t, \beta_t, and \sigma_t.
The parameters from the last rolling window are used to predict expected returns in the event window.
Abnormal returns are computed as: AR_t = R_{firm,t} - (\hat{\alpha}_{last} + \hat{\beta}_{last} R_{market,t})
DCC-GARCH Model
The DCCGARCHModel uses bivariate DCC-GARCH to estimate
time-varying conditional correlations and covariances, yielding
time-varying betas.
Requirements
The DCC-GARCH model requires the rmgarch and
rugarch packages:
install.packages("rmgarch")Basic Usage
ps <- ParameterSet$new(
return_model = DCCGARCHModel$new()
)
task <- run_event_study(task, ps)Custom GARCH Orders
# GARCH(2,1) with DCC(1,2)
dcc <- DCCGARCHModel$new(
garch_order = c(2, 1),
dcc_order = c(1, 2)
)
ps <- ParameterSet$new(return_model = dcc)How it Works
-
A bivariate DCC-GARCH model is fitted to the estimation-window returns:
- Each return series gets a univariate GARCH(p,q) model for conditional variance
- The DCC(a,b) layer models the time-varying correlation
The time-varying beta is computed from the conditional covariance matrix H_t: \beta_t = \frac{H_{12,t}}{H_{22,t}} = \frac{Cov(R_{firm}, R_{market})_t}{Var(R_{market})_t}
The last \beta_t is used for event-window prediction.
Convergence Notes
DCC-GARCH models can be sensitive to: - Very short estimation windows
(use at least 200 observations) - Extreme returns or near-constant
series - The package uses purrr::safely() internally so
convergence failures produce a warning rather than an error
Comparison
| Feature | RollingWindowModel | DCCGARCHModel |
|---|---|---|
| Dependencies | None (base R OLS) | rmgarch, rugarch |
| Speed | Fast | Slower |
| Volatility Clustering | No | Yes |
| Estimation Window | 60+ obs | 200+ obs recommended |
| Robustness | Very robust | May fail to converge |
For most applications, the RollingWindowModel provides a
good balance of flexibility and robustness. The
DCCGARCHModel is preferred when time-varying volatility
clustering is important.