GARCH (Generalized Autoregressive Conditional Heteroskedasticity) is the industry-standard statistical model for forecasting volatility. It captures a fundamental market reality: large price moves tend to cluster. After a crash, volatility stays elevated for days or weeks. GARCH models this persistence mathematically and forecasts tomorrow's volatility using today's.
Section 1: Core Mechanics
Tim Bollerslev developed GARCH in 1986, extending Robert Engle's 1982 ARCH model. Engle received the 2003 Nobel Prize in Economics partly for this work. GARCH is used by risk managers, central banks, and options desks worldwide to forecast short-term volatility.
The core observation GARCH formalizes: volatility clustering. Calm periods (small daily moves) cluster together. Turbulent periods (large daily moves) cluster together. Yesterday's volatility is the strongest predictor of today's volatility — not just its level, but its persistence.
The GARCH(1,1) Model
The model has two equations. First, the return equation:
Where is the daily return, is the mean return, is the conditional standard deviation (what we want to forecast), and is a standard normal shock.
Second — the central equation — the conditional variance equation:
Where:
- = today's forecasted variance (what we solve for)
- (omega) = long-run variance intercept — the unconditional variance floor
- (alpha) = ARCH term — weight placed on yesterday's squared return (the recent shock)
- = yesterday's squared return — yesterday's shock magnitude
- (beta) = GARCH term — weight placed on yesterday's variance forecast (persistence)
- = yesterday's forecasted variance — carries forward the existing volatility level
Stationarity constraint: . This ensures volatility mean-reverts to its long-run average rather than exploding to infinity.
What the Parameters Mean
| Parameter | Typical Equity Value | Interpretation |
|---|---|---|
| omega | ~0.000001 | Near-zero — long-run variance floor |
| alpha | ~0.05–0.15 | Weight on recent shocks; high alpha = volatile reaction to news |
| beta | ~0.80–0.90 | Persistence; high beta = volatility stays elevated for many days |
| alpha + beta | ~0.90–0.98 | Closer to 1 = more persistent volatility |
Typical S&P 500 parameters (approximately): omega ≈ 0.000001, alpha ≈ 0.09, beta ≈ 0.87. Sum ≈ 0.96 — volatility is highly persistent.
Inputs
- Daily log returns:
- Parameter estimation: Maximum Likelihood Estimation (MLE) — requires numerical optimization. Cannot be computed by hand; requires software (Python
archlibrary, Rrugarch, MATLAB, Bloomberg).
Parameters
| Parameter | Default | Notes |
|---|---|---|
| p (GARCH lag) | 1 | Number of past variance lags. GARCH(1,1) is usually sufficient |
| q (ARCH lag) | 1 | Number of past squared return lags. q=1 is standard |
| Distribution | Normal | Student-t distribution is more realistic for fat tails |
| Min. data | 500+ bars | Fewer bars produce unreliable parameter estimates |
Section 2: Interpretation & Signals
Volatility Clustering — The Core Insight
GARCH Conditional Volatility vs. Observed Returns — Volatility Clustering
What GARCH Outputs
GARCH produces a conditional variance forecast for each trading day — the model's best estimate of volatility for that day, given all information up to the prior close. Convert to annualized vol: .
Half-Life of a Volatility Shock
The persistence of a volatility shock in GARCH(1,1) is characterized by its half-life:
For alpha = 0.09, beta = 0.87: . A shock takes roughly 17 trading days (3.4 weeks) to decay to half its initial impact. This is why equity markets stay volatile for weeks after a crash.
Section 3: Pass vs. Live — Real-Time Reliability
GARCH is a daily model. It produces a one-step-ahead variance forecast at each bar close. This forecast is final once the bar closes and the return is computed. The model does not repaint — but parameter estimation is periodic, not real-time.
Section 4: Practical Use Cases
Setup: GARCH is NOT appropriate for intraday scalping — use ATR(14) on intraday charts instead When relevant: Check daily GARCH conditional vol before each trading session. If daily GARCH vol > 30% annualized, the market is in a volatile regime — intraday swings will be wider Action: High GARCH day → reduce scalp position sizes by 30–50%; expect price to move more per bar Key rule: GARCH tells you the daily regime; ATR tells you the intraday stop size
Setup: GARCH(1,1) estimated on daily returns; plot conditional vol alongside price Signal: GARCH vol dropping from above 25% back below 20% → vol regime normalizing → risk appetite returning Action: Resume normal position sizing; stop widths can narrow back toward standard 1.5× ATR Key rule: Trade with the GARCH vol regime — increase position size as vol normalizes, decrease as it spikes
Setup: GARCH-based VaR (Value at Risk) calculation for portfolio risk management Formula: Daily VaR = portfolio value × GARCH sigma × z-score (1.65 for 95%, 2.33 for 99%) Action: If 1-day 95% VaR exceeds 2% of portfolio → reduce exposure until GARCH vol returns to baseline Key rule: Position-level GARCH is about drawdown management, not entry/exit timing
Real example — GARCH VaR: Portfolio value $500,000. GARCH(1,1) estimates sigma_t = 1.8% for the next trading day (annualized ≈ 28.6%). One-day 95% VaR = $500,000 × 0.018 × 1.65 = $14,850. This means there is a 5% probability of losing more than $14,850 in one day under this GARCH model. When VaR exceeds the portfolio's daily loss tolerance, reduce equity exposure.
Section 5: Pseudo Code
# Requires: pip install arch
INPUT: close[], period_start=0, period_end=len(close)
PROCESS:
Step 1: Calculate daily log returns
returns = [ln(close[i] / close[i-1]) for i in 1..N]
returns = returns * 100 # arch library works in percentage returns
Step 2: Specify and fit GARCH(1,1) model
from arch import arch_model
model = arch_model(returns, vol='Garch', p=1, q=1, dist='normal')
result = model.fit(disp='off') # disp='off' suppresses verbose output
Step 3: Extract parameters
omega = result.params['omega']
alpha = result.params['alpha[1]']
beta = result.params['beta[1]']
Step 4: Get conditional variance series (in-sample)
cond_var = result.conditional_volatility # in percentage units
Step 5: Forecast next day's volatility
forecast = result.forecast(horizon=1)
next_day_sigma = sqrt(forecast.variance.iloc[-1].values[0])
next_day_annual_vol = next_day_sigma * sqrt(252)
OUTPUT: cond_vol[] — conditional daily vol in percent; next_day_annual_vol — one-day forecast
EDGE CASES:
- Fewer than 500 returns: parameter estimates unreliable — warn user
- alpha + beta >= 1: non-stationary model — try constraining parameters or use IGARCH
- Convergence failure: try different starting values or switch to Student-t distribution
- Returns with missing data (NaN): forward-fill or remove before fitting
Section 6: Parameters & Optimization
GARCH Order Selection
| Model | Specification | Use Case |
|---|---|---|
| GARCH(1,1) | p=1, q=1 | Standard; best for most equity/fx series |
| GARCH(1,2) | p=1, q=2 | Two shock lags; rarely improves over (1,1) |
| EGARCH(1,1) | Exponential | Captures leverage effect (down moves = more vol) |
| GJR-GARCH(1,1) | Threshold | Asymmetric — neg. returns add extra vol vs. pos. |
| IGARCH(1,1) | Integrated | alpha+beta=1; for highly persistent vol (financial crises) |
Distribution Selection
| Distribution | Code | When to Use |
|---|---|---|
| Normal | dist='normal' |
Baseline; simpler but underestimates tail risk |
| Student-t | dist='t' |
Fat tails; better fit for most financial data |
| Skewed-t | dist='skewt' |
Asymmetric returns; best for equities and crypto |
How do I know if my GARCH model fits well?
Use the Akaike Information Criterion (AIC) and Bayesian Information Criterion (BIC) from the fit result — lower is better. Also check: (1) standardized residuals should be approximately N(0,1); (2) Ljung-Box test on squared residuals should show no autocorrelation (p-value > 0.05); (3) ARCH LM test on residuals should show no remaining ARCH effects. The arch library's result.summary() provides all these diagnostics.
What is the difference between GARCH and EGARCH?
Standard GARCH treats positive and negative returns symmetrically — a 2% up move and a 2% down move produce identical increases in forecasted volatility. In reality, markets show a "leverage effect": negative returns cause larger volatility increases than positive returns of the same magnitude. EGARCH (Exponential GARCH, Nelson 1991) captures this asymmetry by allowing different alpha coefficients for positive and negative shocks. For equity indices and most individual stocks, EGARCH or GJR-GARCH fits significantly better than standard GARCH.
What minimum data length do I need for reliable GARCH estimation?
The rule of thumb is 500+ daily observations (about 2 years). Below 250 observations, MLE optimization becomes unreliable and parameters can take extreme values. For best results, use 3–5 years of daily returns. For intraday GARCH, the data requirement scales with frequency — on 5-minute bars you need proportionally more bars to achieve statistical reliability.
Section 7: Synergies & Conflicts
| Works Well With | Avoid Combining With | |
|---|---|---|
| Historical Volatility (HV) | Compare GARCH forecast against HV to assess model accuracy. If GARCH consistently underestimates HV spikes, consider switching to Student-t distribution or GJR-GARCH | — |
| ATR | ATR for actionable daily stop sizing; GARCH for multi-day volatility regime forecasting. Complementary timeframes | — |
| IV Rank / IV Percentile | GARCH forecasted vol is an independent estimate of fair IV. If GARCH forecast > current IV, options are cheap by the model's measure — conditions favor buying | — |
| VaR Calculation | GARCH provides the dynamic sigma input for time-varying VaR. Far superior to constant-volatility VaR (parametric normal VaR with fixed sigma) | — |
| SMA / EMA crossovers | — | Momentum signals and statistical volatility forecasting operate on completely different conceptual frameworks — no meaningful confluence |
| Fixed-vol trading rules (e.g., fixed ATR(14) stop forever) | — | GARCH shows that volatility is time-varying. Using a fixed ATR from a low-vol period as your stop in a high-GARCH-vol period systematically underestimates risk |
Section 8: Common Mistakes
| Mistake | Root Cause | Solution |
|---|---|---|
| Using GARCH with fewer than 250 bars | Parameters are statistically unreliable below this threshold | Collect at least 500 bars (2 years daily) before fitting; more is better |
| Ignoring convergence warnings | Optimizer fails silently and produces garbage parameters | Always check result.convergence; try different starting values or distributions if it fails |
| Treating Normal distribution as adequate | Financial returns have fat tails — Normal understates extreme moves | Use Student-t or Skewed-t distribution for better tail estimates |
| Static parameters across market regimes | Parameters estimated in 2019 may not apply in 2022 | Re-estimate monthly on a rolling window; monitor AIC for model degradation |
| Using daily GARCH directly on intraday decisions | Model calibrated on daily data; intraday noise has different structure | Use GARCH for daily regime context only; use intraday ATR for intraday stop sizing |
Section 9: Cheat Sheet
USE WHEN: Forecasting next-day volatility; calculating time-varying VaR; identifying persistent high-vol regimes; comparing against IV for options edge
AVOID WHEN: Fewer than 250 daily observations; intraday decision-making; markets with structural breaks (use regime-switching GARCH)
ENTRY SIGNAL: Not a standalone entry signal — GARCH signals vol regime, not price direction
EXIT/RISK SIGNAL: GARCH vol spike above 30% annualized → reduce position size; widen stops for estimated half-life duration
PARAMETERS: GARCH(1,1) with Student-t distribution is the standard starting point for most assets
CONFLUENCE: HV (compare against realized vol) + IV Rank (options pricing edge) + ATR (daily stop sizing)
RISK: Parameter instability across regimes; convergence failures with short history; Normal distribution underestimates tail events
BEST TIMEFRAME: Daily bars only — requires daily log returns; provides next-day vol forecast updated at each market close