Skip to content

Autoregressive Conditional Heteroscedasticity (ARCH)

Authors: Robert F. Engle (1982) Source: Econometrica — bài báo nhận Nobel Kinh tế 2003 Tag: moi:2026-05-16 #volatility #econometrics #garch #time-series

Ý tưởng cốt lõi

Trước Engle 1982, kinh tế lượng giả định phương sai sai số không đổi theo thời gian (homoscedasticity). Engle quan sát thấy điều này sai bét trên dữ liệu tài chính: lợi suất chuỗi thời gian thể hiện volatility clustering — phiên biến động lớn thường nối tiếp phiên biến động lớn, phiên yên tĩnh nối tiếp phiên yên tĩnh. Đây là tính chất "phương sai có điều kiện" thay đổi theo thông tin quá khứ.

Mô hình ARCH(q) của Engle định nghĩa:

$$\sigma_t^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2 + \alpha_2 \epsilon_{t-2}^2 + \dots + \alpha_q \epsilon_{t-q}^2$$

Phương sai có điều kiện tại thời điểm $t$ là hàm tuyến tính của sai số bình phương quá khứ. Cú sốc lớn ($\epsilon_{t-1}^2$ lớn) làm phương sai tương lai tăng — và do tự suy giảm theo thời gian, hiệu ứng này tạo ra cụm biến động.

Đột phá lý thuyết:

  1. Lần đầu mô hình hóa volatility là một process độc lập có thể dự báo, không chỉ là sai số ngẫu nhiên.
  2. Mở đường cho cả gia đình mô hình GARCH (Bollerslev 1986), EGARCH (Nelson 1991), GJR-GARCH (Glosten-Jagannathan-Runkle 1993), TGARCH, FIGARCH... — tất cả đều là biến thể của ý tưởng ARCH gốc.
  3. Cho phép forecast volatility nhiều bước, từ đó định giá option, tính VaR, sizing vị thế động.

Engle nhận Nobel Kinh tế 2003 chính nhờ bài báo này. Cùng với Black-Scholes (1973), ARCH là một trong hai trụ cột định lượng quan trọng nhất của ngành quản trị rủi ro.

Ứng dụng giao dịch chính

ARCH/GARCH có ba ứng dụng trực tiếp trong trading:

  1. Volatility targeting (sizing động): position size $= \frac{\text{target vol}}{\sigma_t^{forecast}}$. Khi mô hình dự báo volatility tăng, tự động giảm size; volatility giảm thì tăng size. Đây là kỹ thuật cốt lõi của CTA/trend follower và các risk parity fund.

  2. Option pricing và IV regime detection: so sánh GARCH forecast với implied volatility — chênh lệch lớn báo hiệu cơ hội long/short vega (mua/bán volatility).

  3. Stop-loss động: thay vì stop cố định 2% hay X điểm, dùng stop = 2 × $\sigma_t^{forecast}$. Trong giai đoạn yên tĩnh stop chặt, trong bão thị trường stop nới ra — tránh bị stop-out vô lý.

Cấu trúc GARCH(1,1) chuẩn (Bollerslev 1986) thực tế dùng nhiều hơn ARCH gốc:

$$\sigma_t^2 = \omega + \alpha \epsilon_{t-1}^2 + \beta \sigma_{t-1}^2$$

Với điều kiện $\alpha + \beta < 1$ để stationary. Thực nghiệm trên cổ phiếu/index, $\alpha \approx$ 0.05-0.10 và $\beta \approx$ 0.85-0.92 (persistence cao).

Áp dụng đa thị trường

VN30F (Hợp đồng tương lai chỉ số Việt Nam)

  • Fit GARCH(1,1) trên close-to-close log returns ≥ 500 phiên. Forecast σ_{t+1} dùng cho sizing phiên mai.
  • α ≈ 0.10-0.15, β ≈ 0.80-0.85 (persistence cao hơn US do mass-driven retail).
  • Vol spike đặc thù: 30 phút cuối phiên đáo hạn (3rd Thursday) do basis unwind — loại data point hoặc dùng dummy variable khi fit.
  • Stop-loss dynamic: stop = 2.5 × σ_forecast × √holding_period.

US equity futures (ES, NQ, RTY)

  • ES có dataset GARCH chuẩn nhất ngành — fit trên 20+ năm daily là benchmark cho mọi mô hình vol.
  • Pattern: α ≈ 0.05-0.08, β ≈ 0.90-0.92. Leverage effect mạnh — dùng GJR-GARCH hoặc EGARCH thay vì GARCH symmetric để bắt cú sốc downside lớn hơn upside.
  • VIX là implied counterpart — dùng GARCH forecast / VIX² ratio làm signal: ratio > 1.2 → vol underpriced (long vol); ratio < 0.8 → vol overpriced (short vol qua VIX futures).
  • Vol clustering theo macro calendar: FOMC, NFP, CPI ngày — bumps σ_forecast bằng dummy.

Crypto spot (BTC, ETH)

  • Crypto có vol clustering mạnh nhất từng được ghi nhận: persistence (α+β) thường > 0.97, gần unit root → IGARCH hoặc FIGARCH (Fractionally Integrated GARCH) phù hợp hơn GARCH stationary.
  • Vol regime crypto rất chênh lệch: BTC realized vol có thể swing 30% → 150% trong 2 tháng. GARCH forecast cần update daily, không weekly.
  • Đặc thù: crypto trade 24/7 không có "close" thiên nhiên — dùng UTC 00:00 cut-off cho daily. Weekend volume thấp tạo bias trong σ estimate — robust hơn là dùng realized vol từ 5-min bar thay vì close-to-close.
  • Use case: vol-targeting size cho HODL portfolio. Khi σ forecast > 80% annualized → giảm allocation crypto xuống một nửa.

Crypto perpetual futures

  • Tương tự crypto spot nhưng thêm yếu tố funding rate volatility — funding spikes thường co-move với vol spikes. Mô hình bivariate GARCH (DCC-GARCH của Engle 2002) bắt được correlation dynamics giữa price vol và funding vol.
  • Liquidation cascade tạo vol jumps non-Gaussian → khuyến nghị GARCH + jump diffusion thay vì pure GARCH cho VaR/ES estimation.
  • Funding-adjusted return cho input của GARCH model (loại bỏ phần "carry deterministic").

Cân nhắc cross-market chung

  • In-sample vs out-of-sample fit: GARCH dễ overfit. Luôn check out-of-sample log-likelihood trên 20% data cuối.
  • Đuôi phân phối: Student-t (df ~ 4-7) phù hợp hơn Gaussian cho mọi thị trường, đặc biệt crypto (df có thể ~ 3-4).
  • Multi-horizon forecast: σ(h) annualized scale theo √h chỉ hợp khi return không correlated — với crypto có momentum, scale này underestimate vol dài hạn.
  • Live update: fit lại GARCH hàng tuần (đủ dài), không daily (overfit short-term noise).

Minh họa Python

python
import numpy as np
import pandas as pd
from arch import arch_model  # pip install arch

def garch_volatility_forecast(returns: pd.Series,
                              horizon: int = 1,
                              p: int = 1,
                              q: int = 1) -> pd.DataFrame:
    """
    Fit GARCH(p,q) và dự báo volatility cho horizon phiên tới.

    Tham số:
    - returns: chuỗi log-returns (đã *100 để model hội tụ tốt hơn).
    - horizon: số phiên forecast (1 = chỉ phiên kế tiếp).
    """
    # Nhân 100 trước khi fit (arch package khuyến nghị)
    r = returns.dropna() * 100

    # Mô hình GARCH(1,1) với phân phối Student-t (đuôi dày)
    model = arch_model(r, mean='Zero', vol='GARCH', p=p, q=q, dist='t')
    res = model.fit(disp='off')

    # Forecast
    forecast = res.forecast(horizon=horizon, reindex=False)
    sigma_forecast = np.sqrt(forecast.variance.values[-1]) / 100  # đưa về scale gốc

    return pd.DataFrame({
        'horizon': range(1, horizon + 1),
        'sigma_forecast': sigma_forecast,
        'sigma_annualized': sigma_forecast * np.sqrt(252)
    })


def position_size_volatility_target(notional: float,
                                    target_annual_vol: float,
                                    sigma_forecast_daily: float,
                                    multiplier: float = 100_000) -> float:
    """
    Tính số lượng hợp đồng VN30F dựa trên volatility target.

    notional: vốn phân bổ (VND).
    target_annual_vol: mục tiêu vol năm của strategy (e.g. 0.15 = 15%).
    sigma_forecast_daily: GARCH forecast σ daily (decimal).
    multiplier: hệ số nhân VN30F (100.000 VND/điểm).
    """
    sigma_annual = sigma_forecast_daily * np.sqrt(252)
    target_notional_risk = notional * target_annual_vol
    contract_value = 1300 * multiplier  # giả định VN30F ~ 1300 điểm
    n_contracts = target_notional_risk / (sigma_annual * contract_value)
    return round(n_contracts, 1)


# Sử dụng:
# vn30f_returns = np.log(vn30f_close).diff().dropna()
# vol_df = garch_volatility_forecast(vn30f_returns, horizon=1)
# n = position_size_volatility_target(notional=1e9,
#                                     target_annual_vol=0.15,
#                                     sigma_forecast_daily=vol_df['sigma_forecast'][0])
# print(f"Size khuyến nghị: {n} contracts")

Powered by dautu.tech