← Quay lại danh sách bài viết
July 10, 2026
5 phút đọc

GARCH(1,1): Dự báo biến động của tiền mã hóa

#volatility
#GARCH
#risk
#forecasting
#crypto
#algorithmic-trading

Mở biểu đồ lợi suất hàng ngày của BTC và bạn sẽ nhận ra điều mà các sách giáo khoa về bước đi ngẫu nhiên chưa bao giờ chuẩn bị cho bạn: sự yên tĩnh và sự hỗn loạn xuất hiện theo cụm. Một ngày giảm 6% hiếm khi đứng một mình. Nó nằm bên trong một tuần với các dao động 4-8%, rồi thị trường thở phào và trôi qua một tháng với những phiên uể oải 1% trước cơn bão tiếp theo. Bản thân lợi suất trông gần như không thể dự đoán được — bạn không thể nói chắc ngày mai tăng hay giảm — nhưng độ lớn của chúng lại rất dễ dự đoán. Sự hỗn loạn của hôm nay cho bạn biết rất nhiều về ngày mai.

Hầu hết mọi công cụ quản trị rủi ro mà một nhà giao dịch tìm đến đều ngầm giả định rằng điều này không đúng. Black-Scholes định giá một quyền chọn với một σ\sigma hằng số duy nhất. Một con số Value-at-Risk tĩnh nhân một ước lượng biến động với một phân vị chuẩn. Một điểm dừng lỗ cố định 3% coi một ngày thứ Ba đi ngang chết lặng và những giờ quanh một công bố FOMC hay một sự cố de-peg lớn của sàn giao dịch như thể chúng mang cùng một mức rủi ro. Mỗi công cụ trong số này đều hỏng theo đúng một cách: nó thu gọn một đại lượng biến đổi theo thời gian thành một hằng số, rồi ngạc nhiên khi hằng số ấy hóa ra lại chuyển động.

Bài viết này là Phần 1 của một loạt bốn phần về mô hình hóa biến động cho tiền mã hóa. Nó xây dựng nền tảng: mô hình GARCH(1,1), tại sao nó khớp với lợi suất tiền mã hóa tốt đến vậy, cách ước lượng nó một cách trung thực bằng hợp lý cực đại với thư viện arch, và cách biến một dự báo phương sai có điều kiện thành hai thứ hữu dụng ngay lập tức — một cỡ vị thế và một độ rộng điểm dừng mà cả hai đều thở cùng thị trường. Phần 2 bổ sung tính bất đối xứng và đuôi nặng, Phần 3 chuyển sang đa biến, và Phần 4 lắp ráp bản kiểm thử ngược nhắm mục tiêu biến động hoàn chỉnh. Ở đây chúng ta cố ý giữ phần ứng dụng đơn giản; chiến lược trung thực, được kiểm chứng theo kiểu walk-forward là chủ đề của Phần 4.

Các sự thật cách điệu của lợi suất tiền mã hóa

Trước khi mô hình hóa bất cứ điều gì, việc chính xác về những gì ta đang cố tái tạo là điều đáng làm. Lợi suất tài chính thực nghiệm — cổ phiếu, ngoại hối, và đặc biệt là tiền mã hóa — chia sẻ một tập hợp nhỏ các quy luật thống kê bền vững đã được ghi nhận suốt hàng thập kỷ. Chúng thường được gọi là các sự thật cách điệu (stylized facts), và ba trong số đó chi phối mọi thứ tiếp theo.

1. Phân cụm biến động. Các bước chuyển lớn có xu hướng được theo sau bởi các bước chuyển lớn (bất kể dấu), và các bước chuyển nhỏ theo sau bởi các bước chuyển nhỏ. Mandelbrot nhận thấy điều này ở giá bông năm 1963. Về mặt hình thức, trong khi lợi suất rtr_t gần như không có tự tương quan chuỗi, thì bình phương lợi suất rt2r_t^2 (một đại lượng đại diện cho phương sai đã thực hiện) lại cho thấy tự tương quan dương mạnh, suy giảm chậm.

2. Đuôi béo (leptokurtosis). Phân phối vô điều kiện của lợi suất có nhiều khối lượng ở các cực trị hơn nhiều so với phân phối Gauss. Trong khi phân phối chuẩn có độ nhọn (kurtosis) bằng 3, thì log-lợi suất hàng ngày của BTC thường xuyên nằm trên 8-10, và lợi suất tiền mã hóa ở tần suất cao hơn có thể còn tệ hơn. Những ngày sáu-sigma, mà một mô hình chuẩn nói rằng chỉ nên xảy ra khoảng một lần trong một triệu năm, lại xuất hiện vài lần mỗi thập kỷ.

3. Không có tự tương quan tuyến tính trong lợi suất, nhưng tự tương quan mạnh trong bình phương lợi suất. Đây là dấu vân tay phân biệt một quá trình biến động thực sự với một xu hướng tầm thường. Nếu bạn hồi quy rtr_t theo các độ trễ của chính nó, bạn chẳng nhận được gì có thể khai thác. Nếu bạn hồi quy rt2r_t^2 theo các độ trễ của nó, bạn tìm thấy một tín hiệu rõ ràng, dai dẳng. Đây chính xác là cấu trúc mà một mô hình phương sai nên nắm bắt — và chính xác là điều mà một mô hình σ\sigma-hằng số vứt bỏ.

Chúng ta có thể quan sát bằng mắt cả ba điều này trong vài dòng. Không có gì ở đây đòi hỏi một nguồn dữ liệu đặc biệt; hãy dùng ccxt trong môi trường sản xuất, nhưng để có một đoạn mã tái lập được thì yfinance là ổn.

import numpy as np
import pandas as pd
import yfinance as yf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox
from scipy import stats

px = yf.download("BTC-USD", start="2021-01-01", end="2025-12-31")["Close"]
ret = np.log(px / px.shift(1)).dropna()          # log returns
ret = ret.rename("btc")

print(f"Observations:     {len(ret)}")
print(f"Ann. volatility:  {ret.std() * np.sqrt(365):.2%}")
print(f"Skewness:         {stats.skew(ret):.2f}")
print(f"Excess kurtosis:  {stats.kurtosis(ret):.2f}")   # 0 == Gaussian

lb_ret  = acorr_ljungbox(ret,        lags=[10], return_df=True)
lb_ret2 = acorr_ljungbox(ret ** 2,   lags=[10], return_df=True)
print("\nLjung-Box p-value, returns   (lag 10):", float(lb_ret["lb_pvalue"].iloc[0]))
print("Ljung-Box p-value, squared   (lag 10):", float(lb_ret2["lb_pvalue"].iloc[0]))

Kết quả điển hình (mang tính minh họa — cửa sổ của bạn sẽ khác): độ nhọn dư thừa (excess kurtosis) cao hơn 3 nhiều, một giá trị p Ljung-Box trên lợi suất thô không bác bỏ được giả thuyết không có tự tương quan, và một giá trị p trên bình phương lợi suất về cơ bản là bằng không. Sự tương phản cuối cùng đó chính là toàn bộ vấn đề. Không có gì để giao dịch trong dấu của lợi suất ở khung thời gian ngày, nhưng có rất nhiều cấu trúc trong phương sai của chúng, và cấu trúc đó là có thể dự báo được.

Một lưu ý về bản chất hoạt động 24/7 của tiền mã hóa. Không giống cổ phiếu, không có khoảng trống qua đêm và không có phiên đóng cửa cuối tuần, nên một ngày là một thanh 24 giờ sạch sẽ và hệ số quy đổi hàng năm là 365\sqrt{365}, chứ không phải 252\sqrt{252}. Phân cụm biến động cũng tồn tại ở các thang trong ngày, điều này quan trọng nếu bạn chạy GARCH trên thanh giờ — các lần đảo chiều funding-rate và các cơn thanh lý dây chuyền bơm vào các đợt bùng phát phương sai sắc, theo cụm mà một mô hình theo ngày làm mượt đi.

Từ ARCH đến GARCH

Vấn đề giờ đây được đặt ra rõ ràng: mô hình hóa một phương sai không phải hằng số mà phụ thuộc vào quá khứ gần. Mô hình đầu tiên làm được điều này một cách đúng đắn là ARCH của Engle (Autoregressive Conditional Heteroskedasticity, 1982), đã đem về cho ông giải Nobel năm 2003.

Viết lợi suất dưới dạng một trung bình có điều kiện cộng với một cú sốc:

rt=μt+εt,εt=σtzt,zti.i.d. (0,1)r_t = \mu_t + \varepsilon_t, \qquad \varepsilon_t = \sigma_t z_t, \qquad z_t \sim \text{i.i.d. } (0, 1)

Ở đây σt2\sigma_t^2 là phương sai có điều kiện — phương sai của rtr_t với mọi thứ đã biết cho đến thời điểm t1t-1 — và ztz_t là một tân biến (innovation) đã chuẩn hóa (chuẩn tắc trong trường hợp đơn giản nhất). Từ có điều kiện đảm nhận toàn bộ công việc: xét vô điều kiện thì phương sai có thể là hằng số, nhưng khi điều kiện hóa theo hôm qua thì nó chuyển động.

ARCH(qq) của Engle biến phương sai hôm nay thành một tổng có trọng số của qq cú sốc bình phương gần nhất:

σt2=ω+i=1qαiεti2\sigma_t^2 = \omega + \sum_{i=1}^{q} \alpha_i \, \varepsilon_{t-i}^2

với ω>0\omega > 0αi0\alpha_i \ge 0 để giữ phương sai dương. Điều này nắm bắt hiện tượng phân cụm một cách trực tiếp: một cú sốc lớn εt12\varepsilon_{t-1}^2 đẩy σt2\sigma_t^2 lên, làm tăng khả năng xảy ra một cú sốc lớn khác, điều này lại giữ cho phương sai ở mức cao. Rắc rối nằm ở sự suy giảm thực nghiệm. Tính dai dẳng của biến động trong các thị trường thực trải dài qua nhiều độ trễ, nên để khớp nó, một mô hình ARCH cần một qq lớn — thường là 8, 10, hoặc hơn — và điều đó nghĩa là phải ước lượng một vectơ dài, không ổn định của αi\alpha_i có xu hướng khớp quá mức (overfit).

Sáng kiến của Bollerslev năm 1986 là bổ sung một số hạng thấm hút toàn bộ tính dai dẳng đó chỉ với một tham số. Đệ quy GARCH(1,1) — Generalized ARCH — là:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha \, \varepsilon_{t-1}^2 + \beta \, \sigma_{t-1}^2

Ba tham số, ba diễn giải rõ ràng:

  • ω>0\omega > 0 — mức nền hay sàn. Một hằng số neo giữ mức phương sai dài hạn. Phương sai không bao giờ suy giảm xuống dưới mức mà ω\omega hỗ trợ.
  • α0\alpha \ge 0 — mức phản ứng với tin tức. Phương sai phản ứng dữ dội đến mức nào trước bất ngờ của hôm qua εt12\varepsilon_{t-1}^2. Một α\alpha lớn nghĩa là phương sai có điều kiện hay giật và nhạy với cú sốc.
  • β0\beta \ge 0 — mức dai dẳng hay trí nhớ. Bao nhiêu phần phương sai của hôm qua được mang sang hôm nay. Một β\beta lớn nghĩa là biến động mượt mà và tàn đi chậm — yên tĩnh vẫn yên tĩnh, bão vẫn bão.

Sự tao nhã nằm ở đệ quy. Bởi vì bản thân σt12\sigma_{t-1}^2 đã chứa một số hạng βσt22\beta \sigma_{t-2}^2, khai triển ngược lại cho thấy GARCH(1,1) là một ARCH(\infty) với các trọng số suy giảm theo cấp số nhân αβk\alpha \beta^{k} trên các cú sốc bình phương trong quá khứ:

σt2=ω1β+αk=0βkεt1k2\sigma_t^2 = \frac{\omega}{1-\beta} + \alpha \sum_{k=0}^{\infty} \beta^{k}\, \varepsilon_{t-1-k}^2

Vậy nên một β\beta duy nhất mua cho bạn một trí nhớ vô hạn, có trọng số theo hàm mũ về các cú sốc quá khứ. Đây là lý do tại sao chỉ một GARCH(1,1) — ba tham số — lại thường xuyên đánh bại các mô hình ARCH với mười tham số, và tại sao nó trở thành công cụ chủ lực của mô hình hóa biến động ứng dụng. Thực tế, nó là một họ hàng gần của bộ ước lượng phương sai EWMA RiskMetrics, vốn là trường hợp đặc biệt ω=0\omega = 0, α+β=1\alpha + \beta = 1 với β\beta cố định ở 0.94. GARCH tổng quát hóa nó bằng cách để dữ liệu tự chọn α\alpha, β\beta, và một mức hồi quy về trung bình thực sự.

Các tính chất: Tính dừng, phương sai dài hạn, và chu kỳ bán rã

Đệ quy GARCH(1,1) có một vài tính chất đáng được suy diễn ra, vì đó là những gì cho phép bạn lập luận về mô hình thay vì chỉ khớp nó một cách mù quáng.

Phương sai vô điều kiện (dài hạn). Giả sử quá trình là dừng theo hiệp phương sai (covariance-stationary) sao cho phương sai vô điều kiện σˉ2=E[εt2]=E[σt2]\bar{\sigma}^2 = \mathbb{E}[\varepsilon_t^2] = \mathbb{E}[\sigma_t^2] tồn tại và không đổi theo thời gian. Lấy kỳ vọng cả hai vế của đệ quy. Vì E[εt12]=E[σt12]=σˉ2\mathbb{E}[\varepsilon_{t-1}^2] = \mathbb{E}[\sigma_{t-1}^2] = \bar{\sigma}^2:

σˉ2=ω+ασˉ2+βσˉ2        σˉ2=ω1αβ\bar{\sigma}^2 = \omega + \alpha\, \bar{\sigma}^2 + \beta\, \bar{\sigma}^2 \;\;\Longrightarrow\;\; \bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta}

Đây là mức mà biến động hồi quy về. Nó chỉ tồn tại — và chỉ dương — khi α+β<1\alpha + \beta < 1.

Điều kiện dừng. Cũng chính bất đẳng thức đó,

α+β<1,\alpha + \beta < 1,

là điều kiện dừng theo hiệp phương sai cho GARCH(1,1). Đại lượng α+β\alpha + \betatính dai dẳng của quá trình phương sai: nó là hệ số AR(1) chi phối cách một cú sốc phương sai suy giảm trở về σˉ2\bar{\sigma}^2. Nếu α+β1\alpha + \beta \ge 1, phương sai vô điều kiện là vô hạn (hoặc không xác định) và các cú sốc không bao giờ hoàn toàn tắt đi.

Chúng ta có thể thấy sự hồi quy về trung bình một cách tường minh. Định nghĩa độ lệch phương sai σt2σˉ2\sigma_t^2 - \bar{\sigma}^2. Một chút biến đổi đại số trên đệ quy (thay ω=σˉ2(1αβ)\omega = \bar{\sigma}^2(1 - \alpha - \beta)) cho, dưới dạng kỳ vọng:

Et[σt+k2]σˉ2=(α+β)k(σt+12σˉ2)\mathbb{E}_t[\sigma_{t+k}^2] - \bar{\sigma}^2 = (\alpha + \beta)^{k}\,\bigl(\sigma_{t+1}^2 - \bar{\sigma}^2\bigr)

Khoảng cách giữa phương sai hiện tại và mức dài hạn của nó co lại theo một hệ số (α+β)(\alpha + \beta) mỗi bước. Đây chính xác là dự báo nhiều bước mà chúng ta dùng về sau.

Chu kỳ bán rã của biến động. Một cú sốc phương sai mất bao lâu để suy giảm được nửa đường trở về mức bình thường? Đặt (α+β)h=1/2(\alpha+\beta)^{h} = 1/2 và giải:

h1/2=ln0.5ln(α+β)h_{1/2} = \frac{\ln 0.5}{\ln(\alpha + \beta)}

Với α+β=0.95\alpha + \beta = 0.95 thì chu kỳ bán rã khoảng 13.5 ngày; với 0.980.98 khoảng 34 ngày; với 0.990.99 khoảng 69 ngày. Con số đơn lẻ này thường trực quan hơn các tham số thô — nó cho bạn biết, tính theo đơn vị các thanh của bạn, biến động dai dẳng đến mức nào.

Vấn đề gần-IGARCH trong tiền mã hóa. Đây là nếp gấp đặc thù của tiền mã hóa. Khi bạn khớp GARCH(1,1) với lợi suất BTC hoặc ETH, bạn hầu như luôn tìm thấy α+β\alpha + \beta rất gần 1 — các giá trị 0.98, 0.99, đôi khi 0.995 là chuyện thường. Đây là chế độ gần-IGARCH (Integrated GARCH). Nó có những hệ quả thực sự:

  • Chu kỳ bán rã trở nên khổng lồ (hàng tuần đến hàng tháng), nên mô hình coi biến động là rất dai dẳng và hầu như không hồi quy về trung bình.
  • Ước lượng của σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta) trở nên cực kỳ nhạy cảm: một thay đổi nhỏ của α+β\alpha+\beta từ 0.99 lên 0.995 làm gấp đôi phương sai dài hạn ngụ ý. Đừng bao giờ tin ước lượng điểm của biến động dài hạn trong chế độ này mà không có khoảng tin cậy.
  • Các dự báo nhiều bước hồi quy về trung bình chậm đến mức, đối với các chân trời thực tế dưới vài tuần, GARCH hành xử gần như một bước đi ngẫu nhiên trong phương sai (đó chính là điều EWMA giả định).

Việc gần-tích hợp là thật hay là một hiện vật của các đứt gãy cấu trúc (một dịch chuyển vĩnh viễn về mức biến động bị mô hình đọc thành một giai đoạn dai dẳng dài) là một cuộc tranh luận thực sự. Đó là thêm một lý do nữa để khớp lại trên các cửa sổ trượt thay vì khớp một lần trên toàn bộ lịch sử, một điểm mà chúng ta sẽ quay lại trong phần các cạm bẫy. Cấu trúc chế độ nói riêng được xử lý tốt hơn bằng một mô hình chuyển đổi tường minh — xem phát hiện chế độ với mô hình Markov ẩn, vốn bổ trợ cho GARCH chứ không phải thay thế.

Ước lượng bằng hợp lý cực đại

Các tham số GARCH được ước lượng bằng hợp lý cực đại (maximum likelihood). Logic thì trực tiếp: cho trước θ=(μ,ω,α,β)\theta = (\mu, \omega, \alpha, \beta), đệ quy tạo ra một đường dẫn đầy đủ của các phương sai có điều kiện σt2(θ)\sigma_t^2(\theta), và dưới một phân phối giả định cho các tân biến ztz_t chúng ta có thể viết ra mức độ khả dĩ của các lợi suất quan sát được. Rồi chúng ta chọn θ\theta để cực đại hóa hợp lý đó.

Giả sử các tân biến Gauss ztN(0,1)z_t \sim \mathcal{N}(0,1), sao cho rtFt1N(μ,σt2)r_t \mid \mathcal{F}_{t-1} \sim \mathcal{N}(\mu, \sigma_t^2). Mật độ có điều kiện của một quan sát là

f(rtFt1)=12πσt2exp ⁣((rtμ)22σt2).f(r_t \mid \mathcal{F}_{t-1}) = \frac{1}{\sqrt{2\pi\sigma_t^2}}\exp\!\left(-\frac{(r_t - \mu)^2}{2\sigma_t^2}\right).

Vì mô hình được viết một cách có điều kiện, hợp lý đồng thời phân tích thành một tích của các mật độ dự báo một bước, và log-hợp lý là một tổng đơn giản:

(θ)=12t=1T[ln(2π)+lnσt2(θ)+(rtμ)2σt2(θ)].\ell(\theta) = -\frac{1}{2}\sum_{t=1}^{T}\left[\ln(2\pi) + \ln \sigma_t^2(\theta) + \frac{(r_t - \mu)^2}{\sigma_t^2(\theta)}\right].

Hai sự thật cấu trúc cần lưu ý. Thứ nhất, σt2\sigma_t^2 xuất hiện vừa như một hình phạt (lnσt2\ln \sigma_t^2 — mô hình bị phạt vì tuyên bố phương sai cao) vừa trong phần dư đã chuẩn hóa ((rtμ)2/σt2(r_t-\mu)^2/\sigma_t^2 — mô hình bị phạt vì bị bất ngờ). Điểm tối ưu cân bằng hai điều này, và đó là điều làm cho phương sai bám theo. Thứ hai, đệ quy cần một giá trị khởi tạo σ12\sigma_1^2; lựa chọn thông thường là phương sai mẫu của lợi suất, và với vài nghìn quan sát thì giá trị khởi tạo hầu như không quan trọng.

Không có dạng đóng cho điểm cực đại, nên chúng ta tối ưu bằng số (arch dùng một phương pháp tựa-Newton với gradient giải tích hoặc số). Bề mặt hợp lý nhìn chung có hành vi tốt với GARCH(1,1), nhưng hai điều gây khó trong thực tế: các ràng buộc dương (ω,α,β0\omega,\alpha,\beta \ge 0) và hành vi gần biên khi α+β1\alpha+\beta \to 1, nơi bộ tối ưu có thể bò rất chậm. Cả hai đều được một thư viện tốt xử lý cho bạn — và bạn nên dùng một thư viện. Tự viết tay một MLE cho GARCH là một bài luyện tập học hỏi tốt nhưng là một lựa chọn sản xuất tồi.

Thư viện arch

Gói arch của Kevin Sheppard là công cụ tiêu chuẩn trong Python. Toàn bộ quá trình khớp gói gọn trong bốn dòng.

from arch import arch_model

r = ret * 100.0

model  = arch_model(r, mean="Constant", vol="Garch", p=1, q=1, dist="normal")
res    = model.fit(disp="off")
print(res.summary())

Một lời về tên các đối số, vì chúng là một nguồn nhầm lẫn phổ biến. Trong arch, p là số phương sai độ trễ (các số hạng β\beta, bậc GARCH) và q là số phần dư bình phương độ trễ (các số hạng α\alpha, bậc ARCH). Vậy nên p=1, q=1 chính là GARCH(1,1) mà chúng ta đã suy ra. (Ký hiệu gốc của Bollerslev viết nó là GARCH(p,qp,q) với pp cho bậc ARCH — hai quy ước bị hoán vị. Hãy tin tài liệu của chính thư viện, chứ không phải trí nhớ của bạn.)

Đọc phần tóm tắt, bảng hệ số trông đại khái như thế này (các giá trị minh họa cho lợi suất hàng ngày của BTC, không phải một thí nghiệm thật):

                     Volatility Model
==========================================================
                 coef    std err      t      P>|t|
----------------------------------------------------------
omega          0.4821     0.201    2.40    0.016
alpha[1]       0.0912     0.021    4.34    0.000
beta[1]        0.8994     0.024   37.5     0.000
==========================================================

Cách đọc nó:

  • alpha[1] + beta[1] = 0.0912 + 0.8994 = 0.9906. Tính dai dẳng vừa dưới 1 — chế độ gần-IGARCH, đúng như đã cảnh báo. Chu kỳ bán rã ln(0.5)/ln(0.9906)73\approx \ln(0.5)/\ln(0.9906) \approx 73 ngày.
  • omega = 0.4821, nên phương sai dài hạn là 0.4821/(10.9906)=51.30.4821 / (1 - 0.9906) = 51.3 tính theo đơn vị phần trăm-bình phương, tức là một biến động hàng ngày dài hạn 51.37.2%\sqrt{51.3} \approx 7.2\%, hay xấp xỉ 7.2%×365138%7.2\%\times\sqrt{365}\approx 138\% khi quy đổi theo năm. Đó là một con số BTC hợp lý.
  • Cả alphabeta đều có ý nghĩa thống kê mạnh. Việc alpha nhỏ so với beta là điển hình: phương sai tiền mã hóa chủ yếu là tính dai dẳng (trí nhớ), với một phản ứng khiêm tốn nhưng thật trước các cú sốc mới.

Cạm bẫy tỷ lệ ×100

Đây là cách phổ biến nhất để nhận về kết quả vô nghĩa từ arch, nên nó xứng đáng có một tiểu mục riêng. Bộ tối ưu hoạt động tốt nhất khi các con số nó thấy là O(1)O(1) đến O(100)O(100). Log-lợi suất hàng ngày là O(0.01)O(0.01), nên bình phương của chúng là O(0.0001)O(0.0001)ω\omega phải quanh 10610^{-6} — nằm trong một khoảng mà các gradient số mất độ chính xác và việc khớp có thể âm thầm không hội tụ hoặc trả về sai số chuẩn rác.

Cách khắc phục là khớp trên lợi suất được nhân với 100 (tức là theo phần trăm), như ở trên. arch thậm chí sẽ phát ra một DataScaleWarning nếu bạn quên. Mọi thứ bạn đọc ra từ mô hình khi đó sẽ ở đơn vị phần trăm hoặc phần trăm-bình phương, và bạn phải quy đổi ngược một cách nhất quán:

sigma_pct     = np.sqrt(res.forecast(horizon=1).variance.iloc[-1, 0])
sigma_decimal = sigma_pct / 100.0
print(f"1-day-ahead conditional vol: {sigma_decimal:.2%}")

Trộn lẫn các đại lượng đã tỷ lệ và chưa tỷ lệ — ví dụ đưa một biến động phần trăm vào một công thức định cỡ vị thế vốn kỳ vọng số thập phân — tạo ra các lỗi đúng bằng 100 lần, vốn dễ bị bỏ sót vì mã vẫn chạy tốt. Hãy chọn một quy ước (tôi giữ mọi thứ ở dạng thập phân bên ngoài việc khớp và chỉ tỷ lệ tại ranh giới arch) và đừng bao giờ vượt qua nó.

Dự báo phương sai có điều kiện

Một mô hình đã khớp chỉ hữu ích nếu nó dự báo được. GARCH cho các dự báo sạch, giải tích ở bất kỳ chân trời nào.

Một bước phía trước. Tại thời điểm TT (cuối mẫu) chúng ta biết εT\varepsilon_TσT2\sigma_T^2, nên phương sai kế tiếp là tất định:

σT+12=ω+αεT2+βσT2.\sigma_{T+1}^2 = \omega + \alpha\,\varepsilon_T^2 + \beta\,\sigma_T^2.

Không cần kỳ vọng — mọi thứ ở vế phải đều được quan sát.

Nhiều bước phía trước. Với h2h \ge 2 chúng ta chưa biết các cú sốc xen giữa, nên chúng ta lấy kỳ vọng có điều kiện. Dùng ET[εT+k2]=ET[σT+k2]\mathbb{E}_T[\varepsilon_{T+k}^2] = \mathbb{E}_T[\sigma_{T+k}^2] (vì E[z2]=1\mathbb{E}[z^2]=1), đệ quy thu gọn thành một AR(1) đơn giản trong phương sai được dự báo:

ET[σT+h2]=ω+(α+β)ET[σT+h12].\mathbb{E}_T[\sigma_{T+h}^2] = \omega + (\alpha + \beta)\,\mathbb{E}_T[\sigma_{T+h-1}^2].

Lặp điều này từ dự báo một bước cho ra dạng đóng, chính là kết quả hồi quy về trung bình mà chúng ta đã suy ra trước đó được viết ra tường minh:

ET[σT+h2]=σˉ2+(α+β)h1(σT+12σˉ2),σˉ2=ω1αβ.\mathbb{E}_T[\sigma_{T+h}^2] = \bar{\sigma}^2 + (\alpha+\beta)^{\,h-1}\bigl(\sigma_{T+1}^2 - \bar{\sigma}^2\bigr), \qquad \bar{\sigma}^2 = \frac{\omega}{1-\alpha-\beta}.

Hãy đọc kỹ điều này, vì đó là hình học của mọi dự báo GARCH. Cấu trúc kỳ hạn của phương sai bắt đầu từ phương sai có điều kiện của hôm nay σT+12\sigma_{T+1}^2 và suy giảm theo cấp số nhân về mức dài hạn σˉ2\bar{\sigma}^2. Nếu hôm nay yên tĩnh hơn trung bình, đường cong dự báo dâng lên về phía σˉ2\bar\sigma^2; nếu hôm nay là một cuộc khủng hoảng, nó rớt về phía đó. Tốc độ của sự suy giảm ấy hoàn toàn do (α+β)(\alpha+\beta) đặt ra — và trong chế độ tiền mã hóa gần-IGARCH, nơi α+β0.99\alpha+\beta \approx 0.99, sự suy giảm chậm đến mức đối với các chân trời dưới vài tuần thì dự báo hầu như không nhích khỏi mức của hôm nay. Điều đó đáng nội tâm hóa: đối với các kỳ nắm giữ ngắn, dự báo GARCH cho tiền mã hóa về cơ bản là "ngày mai trông giống hôm nay, chỉ hồi quy về trung bình rất chậm."

Tổng hợp về một chân trời nắm giữ. Các nhà giao dịch hiếm khi quan tâm đến phương sai của một ngày tương lai đơn lẻ. Nếu bạn nắm giữ một vị thế trong HH ngày và lợi suất không tương quan có điều kiện (sự thật cách điệu từ đầu bài), thì phương sai của lợi suất tích lũy HH ngày là tổng của các phương sai dự báo từng ngày:

σT2(H)=h=1HET[σT+h2],σT(H)=σT2(H).\sigma_{T}^{2}(H) = \sum_{h=1}^{H} \mathbb{E}_T[\sigma_{T+h}^2], \qquad \sigma_T(H) = \sqrt{\sigma_T^2(H)}.

Đây là con số mà bạn thực sự định cỡ dựa vào — biến động của lãi/lỗ trong kỳ nắm giữ của bạn. Lưu ý nó dứt khoát không phải là phép tỷ lệ ngây thơ HσT+1\sqrt{H}\,\sigma_{T+1}, vốn chỉ đúng nếu phương sai là hằng số. Khi phương sai hôm nay ở trên σˉ2\bar\sigma^2, dự báo hồi quy về trung bình làm cho biến động HH ngày thực sự thấp hơn quy tắc căn bậc hai; khi hôm nay yên tĩnh, nó cao hơn. Làm đúng điều này là sự khác biệt giữa một điểm dừng tôn trọng cấu trúc kỳ hạn và một điểm dừng thì không.

Trong mã:

H = 10
fc = res.forecast(horizon=H, reindex=False)

var_path_pct2 = fc.variance.iloc[-1].values        # [E_T sigma^2_{T+1}, ..., T+H]
var_path      = var_path_pct2 / (100.0 ** 2)       # back to decimal variance

daily_vol   = np.sqrt(var_path)
print("Forecast daily vol path:", np.round(daily_vol * 100, 2), "%")

H_day_var = var_path.sum()
H_day_vol = np.sqrt(H_day_var)
print(f"{H}-day holding-period vol: {H_day_vol:.2%}")

naive = np.sqrt(var_path[0] * H)
print(f"Naive sqrt(H) * sigma_1:   {naive:.2%}")

Với các chân trời dài hơn, GARCH cũng hỗ trợ dự báo bằng mô phỏng (method="simulation"), vốn lan truyền phân phối tân biến về phía trước và cho bạn toàn bộ mật độ dự báo, chứ không chỉ phương sai của nó — hữu ích khi các tân biến không phải Gauss, như chúng sẽ là khi chúng ta chuyển sang phân phối Student-t và phân phối lệch trong Phần 2. Đối với các đại lượng tuyến tính theo phương sai ở trên, đường dẫn giải tích là chính xác và miễn phí.

Chẩn đoán: Mô hình có thực sự hoạt động không?

Khớp một mô hình không giống với kiểm chứng nó. Toàn bộ mục đích của GARCH là hấp thụ phương sai thay đổi có điều kiện — hiện tượng phân cụm biến động — sao cho phần còn lại là (gần) i.i.d. Do đó việc kiểm tra đúng đắn là nhìn vào các phần dư đã chuẩn hóa

z^t=rtμ^σ^t\hat{z}_t = \frac{r_t - \hat\mu}{\hat\sigma_t}

và hỏi: hiện tượng phân cụm đã biến mất chưa? Nếu mô hình nắm bắt được động lực phương sai, thì z^t\hat z_t nên có phương sai đơn vị và, quan trọng là, bình phương của chúng z^t2\hat z_t^2 nên không còn tự tương quan nào. Chúng ta chạy ba kiểm định.

1. Ljung-Box trên phần dư đã chuẩn hóa. Kiểm tra rằng không còn tự tương quan tuyến tính nào ở mức của z^t\hat z_t (điều này thực chất đang kiểm định mô hình trung bình, chứ không phải mô hình phương sai). Không nên bác bỏ.

2. Ljung-Box trên bình phương phần dư đã chuẩn hóa. Đây là kiểm định quan trọng. Nếu z^t2\hat z_t^2 vẫn có tự tương quan đáng kể, thì mô hình phương sai đã không loại bỏ được hiện tượng phân cụm — có cấu trúc mà GARCH(1,1) không nắm bắt được, và bạn có thể cần một bậc cao hơn, một biến thể bất đối xứng, hoặc một phân phối tân biến khác. Không nên bác bỏ.

3. Kiểm định ARCH-LM (kiểm định nhân tử Lagrange của Engle). Hồi quy z^t2\hat z_t^2 theo các độ trễ của chính nó và kiểm định ý nghĩa đồng thời. Về cơ bản nó là một phiên bản hình thức của kiểm định 2 và trực tiếp hỏi "còn hiệu ứng ARCH sót lại không?" Một kết quả không có ý nghĩa thống kê xác nhận phương sai thay đổi có điều kiện đã được mô hình hóa hết.

from statsmodels.stats.diagnostic import acorr_ljungbox
from arch.unitroot.cointegration import engle_granger  # (unrelated; shown for import clarity)

z  = res.std_resid.dropna()          # standardized residuals
z2 = z ** 2

lb_z  = acorr_ljungbox(z,  lags=[10, 20], return_df=True)
lb_z2 = acorr_ljungbox(z2, lags=[10, 20], return_df=True)
print("Ljung-Box on standardized residuals:\n", lb_z, "\n")
print("Ljung-Box on SQUARED standardized residuals:\n", lb_z2, "\n")

lm = res.arch_lm_test(lags=10, standardized=True)
print(lm)

print(f"\nStd-resid excess kurtosis: {stats.kurtosis(z):.2f}")

Kết quả tốt trông như thế nào: các giá trị p Ljung-Box trên z^t2\hat z_t^2 nhảy từ gần-không (trên bình phương lợi suất thô) lên thoải mái trên 0.05, và kiểm định ARCH-LM không bác bỏ được. Đó là bằng chứng của bạn rằng mô hình đã làm tròn nhiệm vụ của nó đối với mô men bậc hai.

Kết quả không hoàn hảo trông như thế nào — và điều bạn nên kỳ vọng với một GARCH(1,1) Gauss thuần túy trên tiền mã hóa — là các kiểm định phân cụm vượt qua nhưng độ nhọn của phần dư đã chuẩn hóa vẫn cao (chẳng hạn 4-6 thay vì 0). GARCH loại bỏ hiện tượng phân cụm nhưng một phân phối vô điều kiện đuôi béo duy nhất vẫn còn đó, bởi vì các tân biến Gauss không thể tái tạo các đuôi. Tính đuôi béo còn sót lại đó không phải là một lỗi cần sửa ở đây; nó là động lực cho Phần 2, GARCH bất đối xứng và hiệu ứng đòn bẩy trong tiền mã hóa, nơi các tân biến Student-t và skewed-t và số hạng bất đối xứng GJR/EGARCH giải quyết đúng vấn đề này.

Ứng dụng: Định cỡ và điểm dừng theo tỷ lệ biến động

Bây giờ chúng ta đã có một dự báo về biến động của ngày mai (và của HH ngày kế tiếp). Chúng ta làm gì với nó? Hai công dụng đơn giản nhất, giá trị cao nhất là định cỡ vị thế và đặt điểm dừng. Chúng ta cố ý giữ cả hai ở mức cơ bản ở đây — chiến lược nhắm mục tiêu biến động đầy đủ với toàn bộ bộ máy thực dụng của nó là Phần 4.

Định cỡ vị thế nhắm mục tiêu biến động

Ý tưởng là nắm giữ một vị thế mà đóng góp rủi ro của nó gần như không đổi theo thời gian, thay vì một vị thế mà giá trị danh nghĩa của nó không đổi. Nếu bạn luôn triển khai cùng một cỡ đô la, rủi ro của bạn phình to trong các chế độ biến động cao và teo lại trong các chế độ yên tĩnh — ngược với điều bạn muốn. Nhắm mục tiêu biến động đảo ngược điều này: nhắm tới một biến động lãi/lỗ mục tiêu cố định, và để dự báo quyết định cỡ.

Với một biến động mục tiêu quy đổi theo năm σtarget\sigma_{\text{target}} (chẳng hạn 20%) và một biến động dự báo quy đổi theo năm σ^t\hat\sigma_t, trọng số vị thế là

wt=σtargetσ^t.w_t = \frac{\sigma_{\text{target}}}{\hat{\sigma}_t}.

Khi biến động dự báo cao, bạn giảm cỡ; khi nó thấp, bạn tăng cỡ. Đó là toàn bộ cơ chế. Bởi vì σ^t\hat\sigma_tdự báo — đã biết tại tt trước khi lợi suất tại t+1t+1 được thực hiện — nên không có nhìn trước, miễn là bạn kỷ luật về mặt thời điểm (chi tiết hơn trong phần các cạm bẫy).

def vol_target_weight(sigma_forecast_annual, sigma_target_annual=0.20,
                      w_max=3.0):
    """Volatility-scaled position weight. Inputs/outputs in decimals.
    w_max caps leverage so a tiny forecast vol can't demand insane size."""
    w = sigma_target_annual / sigma_forecast_annual
    return float(np.clip(w, 0.0, w_max))

sigma_1d   = np.sqrt(res.forecast(horizon=1).variance.iloc[-1, 0]) / 100.0
sigma_ann  = sigma_1d * np.sqrt(365)
w          = vol_target_weight(sigma_ann, sigma_target_annual=0.20)
print(f"Forecast annual vol: {sigma_ann:.1%}  ->  position weight: {w:.2f}x")

Đây là họ hàng gần của các quy tắc phân bổ vốn đúng đắn. Nhắm mục tiêu biến động trả lời câu hỏi "rủi ro nên tỷ lệ với biến động bao nhiêu," trong khi tiêu chí Kelly trả lời "rủi ro nên tỷ lệ với lợi thế bao nhiêu" — và cả hai nhân với nhau trong một chồng định cỡ đầy đủ: cỡ \propto lợi thế / phương sai. Lưu ý rằng số hạng phương sai của Kelly chính xác là dự báo GARCH mà bạn vừa tính, đó là lý do một mô hình biến động sống làm sắc bén đáng kể việc định cỡ Kelly so với một ước lượng lịch sử tĩnh. Nếu bản thân ước lượng lợi thế của bạn mang một sự bất định được định lượng, thì dự đoán conformal cho một cách không phụ thuộc phân phối để nới rộng hoặc thu hẹp cỡ cho khớp, và nó kết hợp gọn gàng với việc nhắm mục tiêu biến động.

Giới hạn w_max không phải là tùy chọn. Trong chế độ gần-IGARCH, một giai đoạn tĩnh lặng có thể đẩy biến động dự báo xuống khá thấp, và σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t sẽ đòi hỏi đòn bẩy vốn ổn trên giấy nhưng thảm khốc khi sự yên tĩnh bị phá vỡ — điều mà, theo phân cụm biến động, cuối cùng nó sẽ xảy ra, thường là đột ngột. Giới hạn đòn bẩy là sự thừa nhận thô-nhưng-hiệu-quả rằng dự báo của bạn là một trung bình có điều kiện, chứ không phải một sự bảo đảm, và rằng cái giá của việc sai là bất đối xứng. Sự bất đối xứng đó — một tài khoản bị thổi bay không thể phục hồi bằng một thắng lợi đối xứng — chính là sự bất đối xứng lỗ-lãi khiến bạn nên thận trọng một cách có hệ thống hơn so với những gì một quy tắc chỉ dựa trên phương sai gợi ý.

Điểm dừng theo tỷ lệ biến động

Một điểm dừng theo phần trăm cố định mắc cùng một căn bệnh như một cỡ vị thế cố định: một điểm dừng 3% là một cò súng cực nhạy trong một thị trường yên tĩnh và là một sai số làm tròn trong một thị trường dữ dội. Nó khiến bạn bị hất khỏi các vị thế tốt bởi nhiễu thông thường trong các chế độ biến động cao và trả lại quá nhiều trong các giai đoạn chuyển tiếp. Cách khắc phục là đặt khoảng cách điểm dừng theo đơn vị biến động dự báo.

khoảng caˊch điểm dừngt=kσ^t(H)\text{khoảng cách điểm dừng}_t = k \cdot \hat\sigma_t^{(H)}

trong đó σ^t(H)\hat\sigma_t^{(H)} là biến động dự báo trong chân trời nắm giữ kỳ vọng HH của bạn (đại lượng tổng hợp từ mục dự báo) và kk là một bội số — thường là 1.5 đến 3 — được chọn sao cho điểm dừng nằm ngoài dao động bình thường nhưng bên trong một bước chuyển bất lợi thực sự.

def vol_scaled_stop(entry_price, side, sigma_H, k=2.0):
    """
    entry_price : fill price
    side        : +1 long, -1 short
    sigma_H     : forecast volatility over the holding horizon (decimal)
    k           : stop width in vol units
    Returns the stop price.
    """
    stop_frac = k * sigma_H
    return entry_price * (1.0 - side * stop_frac)

var_path = res.forecast(horizon=10, reindex=False).variance.iloc[-1].values / (100.0 ** 2)
sigma_H  = np.sqrt(var_path.sum())

entry = float(px.iloc[-1])
stop  = vol_scaled_stop(entry, side=+1, sigma_H=sigma_H, k=2.0)
print(f"Entry {entry:,.0f}  |  10-day vol {sigma_H:.2%}  |  2-sigma stop {stop:,.0f}")

Bởi vì σ^t(H)\hat\sigma_t^{(H)} dùng dự báo cấu trúc kỳ hạn hồi quy về trung bình thay vì một con số lịch sử phẳng, điểm dừng tự động nới rộng khi đi vào các chế độ hỗn loạn và siết chặt khi biến động dịu đi — cấu trúc kỳ hạn tự làm việc thích ứng cho bạn. Đây chính là cùng một dự báo nuôi cả cỡ lẫn điểm dừng, và đó là một tính năng: trong một chế độ biến động cao bạn đồng thời nắm giữ ít hơn và cho vị thế nhiều khoảng trống hơn, và hai hiệu ứng ấy cộng gộp thành rủi ro đuôi thấp hơn đáng kể. Định cỡ và điểm dừng là hai phép chiếu của một quan điểm biến động, chứ không phải hai núm vặn độc lập.

Đó là mức xa nhất chúng ta đưa phần ứng dụng đến trong Phần 1. Một chiến lược thực sự phải xử lý chi phí giao dịch từ việc tái cân bằng liên tục, thời điểm khi nào dự báo được tính so với khi nào lệnh được đặt, kiểm soát vòng quay, và — trên hết — đánh giá ngoài mẫu trung thực. Tất cả những điều đó là Phần 4: chiến lược GARCH nhắm mục tiêu biến động, nơi chúng ta xây dựng và kiểm thử walk-forward toàn bộ.

Các cạm bẫy

GARCH thì dễ khớp và cũng dễ tự lừa dối mình. Các kiểu thất bại thì nhất quán.

Tỷ lệ lợi suất. Đã nói ở trên, nhưng đây là lỗi số một, nên cần nhắc lại: khớp arch trên lợi suất × 100, và quy đổi ngược mọi kết quả (phương sai chia 1002100^2, biến động chia 100100). Một lỗi 100 lần âm thầm ở đây đầu độc mọi tính toán định cỡ và điểm dừng phía sau.

Nhìn trước khi khớp. Kẻ giết người tinh vi. Nếu bạn khớp mô hình trên toàn bộ lịch sử rồi tính "các dự báo" trên chính cùng lịch sử đó, thì mỗi dự báo đã bí mật nhìn thấy tương lai — các tham số được ước lượng bằng dữ liệu từ sau ngày dự báo. Việc khớp trong mẫu sẽ trông tuyệt vời còn hiệu suất sống thì chẳng giống nó chút nào. Mọi dự báo được kiểm thử ngược phải đến từ một mô hình chỉ khớp trên dữ liệu có sẵn tại thời điểm đó: khớp lại trên một cửa sổ mở rộng hoặc trượt, dự báo một bước, cuộn về phía trước. Điều này là không thể thương lượng và nó là toàn bộ chủ đề của tối ưu hóa walk-forward. Khoảng cách giữa một GARCH trong mẫu và một GARCH walk-forward đúng đắn là khoảng cách giữa một bản demo và một hệ thống sống sót khi tiếp xúc với thị trường thực — xem thêm sự tương đồng backtest-live.

Thời điểm của dự báo. Liên quan nhưng khác biệt. Dự báo cho ngày t+1t+1 phải được tính từ thông tin có sẵn tại thời điểm đóng cửa của ngày tt (hoặc bất cứ khi nào thanh của bạn đóng), và vị thế phải có thể thực thi ở một mức giá mà bạn thực sự có thể đạt được. Tính dự báo bằng giá đóng cửa của ngày t+1t+1 rồi "giao dịch" tại giá mở cửa của ngày t+1t+1 là một sự nhìn trước âm thầm thổi phồng mọi kết quả.

Khớp quá mức các bậc cao. GARCH(1,1) hầu như luôn là đủ. Cám dỗ khớp GARCH(2,2) hay GARCH(3,1) vì nó nhích log-hợp lý trong mẫu lên thường là khớp nhiễu; các tham số dư ra hiếm khi cải thiện dự báo ngoài mẫu và thường làm bộ tối ưu bất ổn gần biên. Hãy ưu tiên mô hình tiết kiệm, và nếu bạn phải so sánh các bậc, hãy so sánh chúng bằng tổn thất dự báo ngoài mẫu trên một phân tách walk-forward, chứ không phải bằng AIC trong mẫu. Khi các chẩn đoán phần dư vẫn cho thấy một vấn đề, cách khắc phục thường là một phân phối tân biến tốt hơn hoặc một số hạng bất đối xứng (Phần 2), chứ không phải một bậc cao hơn.

Đứt gãy cấu trúc bị đọc thành tính dai dẳng. Như đã lưu ý, một dịch chuyển vĩnh viễn về mức biến động (một chế độ thị trường mới, một thay đổi trong vi cấu trúc thị trường) có thể bị GARCH hấp thụ thành tính dai dẳng cao một cách giả tạo, đẩy α+β\alpha+\beta về phía 1. Nếu ước lượng biến động dài hạn của bạn trông không ổn định qua các cửa sổ, hãy nghi ngờ một đứt gãy thay vì tin vào ước lượng điểm gần-IGARCH. Việc khớp lại theo kiểu trượt và, nơi thích hợp, một mô hình chế độ tường minh giúp phòng vệ trước điều này.

Coi các dự báo biến động như các dự báo lợi suất. GARCH dự báo độ lớn của các bước chuyển, không phải hướng của chúng. Nó cho bạn biết dao động của ngày mai có khả năng lớn đến đâu, chứ không phải theo chiều nào. Đây chính xác là lý do vì sao ngôi nhà tự nhiên của nó là quản trị rủi ro — định cỡ, điểm dừng, VaR — chứ không phải tạo tín hiệu. Đừng nhầm một dự báo phương sai tốt với một lợi thế.

Điều này dẫn tới đâu tiếp theo

GARCH(1,1) là nền tảng, và nó cố ý chưa hoàn chỉnh. Loạt bài xây dựng trên nó theo ba hướng:

  • Tính bất đối xứng và đuôi nặng — biến động tiền mã hóa thực sự phản ứng với các bước giảm mạnh hơn các bước tăng (hiệu ứng đòn bẩy), và các tân biến Gauss không thể tái tạo các đuôi. GJR-GARCH, EGARCH, và các tân biến Student-t / skewed-t là Phần 2.
  • Biến động đa biến — các tương quan giữa các tài sản tiền mã hóa bản thân chúng biến đổi theo thời gian và vọt lên trong các đợt sụp đổ. Mô hình hóa toàn bộ ma trận hiệp phương sai một cách động là Phần 3: DCC-GARCH, vốn kết nối trực tiếp với trung bình-phương sai Markowitzphân bổ dựa trên CVaR một khi hiệp phương sai đã động.
  • Chiến lược đầy đủ — định cỡ, điểm dừng, chi phí, vòng quay, và đánh giá walk-forward trung thực đến với nhau trong Phần 4.

Và nơi các phân phối biên GARCH nuôi rủi ro đồng thời: mô hình phương sai có điều kiện đơn biến ở đây chính xác là giai đoạn đầu tiên của quy trình GARCH-EVT-copula cho VaR/CVaR danh mục. Một khi bạn có các phần dư đã chuẩn hóa từ một lần khớp GARCH trên từng tài sản, bạn biến đổi chúng và dán chúng lại với nhau bằng một copula — các phân phối biên là GARCH, sự phụ thuộc là copula. Cấu trúc đó, bao gồm sự phụ thuộc đuôi và cách xử lý đuôi EVT, được trình bày sâu trong các mô hình copula cho rủi ro tiền mã hóa đồng thời; bài viết này là động cơ đơn biến nằm bên dưới nó.

Tóm tắt

  • Lợi suất tiền mã hóa thể hiện phân cụm biến động, đuôi béo, và không có tự tương quan lợi suất nhưng tự tương quan bình phương lợi suất mạnh. Bất kỳ công cụ nào giả định biến động hằng số — Black-Scholes với một σ\sigma duy nhất, VaR tĩnh, điểm dừng theo phần trăm cố định — đều bị đặc tả sai so với các sự thật này.
  • GARCH(1,1), σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\varepsilon_{t-1}^2 + \beta\sigma_{t-1}^2, mô hình hóa phương sai có điều kiện biến đổi theo thời gian với ba tham số: một mức nền ω\omega, một phản ứng cú sốc α\alpha, và một tính dai dẳng β\beta. Nó là một ARCH(\infty) với trí nhớ suy giảm theo cấp số nhân, đó là lý do nó đánh bại ARCH bậc cao.
  • Tính dừng đòi hỏi α+β<1\alpha+\beta<1; phương sai dài hạn là ω/(1αβ)\omega/(1-\alpha-\beta), tính dai dẳng là α+β\alpha+\beta, và chu kỳ bán rã của biến động là ln0.5/ln(α+β)\ln 0.5 / \ln(\alpha+\beta). Tiền mã hóa nằm trong chế độ gần-IGARCH (α+β0.99\alpha+\beta\approx 0.99): rất dai dẳng, chậm hồi quy về trung bình, và với một ước lượng phương sai dài hạn mong manh.
  • Ước lượng bằng hợp lý cực đại. Log-hợp lý Gauss là một tổng của các mật độ một bước; hãy khớp nó với arch_model(r*100, vol="Garch", p=1, q=1). Nhớ tỷ lệ ×100 và quy đổi ngược mọi kết quả một cách nhất quán.
  • Các dự báo hồi quy về trung bình theo cấp số nhân về phía phương sai dài hạn với tốc độ (α+β)h1(\alpha+\beta)^{h-1}. Tổng hợp các dự báo phương sai hàng ngày để có biến động chân trời nắm giữ — chứ không phải quy tắc ngây thơ H\sqrt{H}.
  • Kiểm chứng bằng Ljung-Box trên bình phương phần dư đã chuẩn hóa và kiểm định ARCH-LM. Vượt qua các kiểm định này xác nhận hiện tượng phân cụm đã được mô hình hóa hết; các đuôi béo phần dư còn sót lại là động lực cho Phần 2.
  • Áp dụng nó vào định cỡ nhắm mục tiêu biến động (wt=σtarget/σ^tw_t = \sigma_{\text{target}}/\hat\sigma_t, có giới hạn) và điểm dừng theo tỷ lệ biến động (kσ^t(H)k\cdot\hat\sigma_t^{(H)}). Một dự báo dẫn dắt cả hai, nên các chế độ biến động cao đồng thời nhận cỡ nhỏ hơn điểm dừng rộng hơn.
  • Các cạm bẫy quan trọng: tỷ lệ lợi suất, nhìn trước khi khớp (chỉ khớp trên dữ liệu quá khứ, luôn walk-forward), thời điểm dự báo, dùng bậc quá cao, và không bao giờ nhầm một dự báo phương sai với một dự báo hướng.

References:

  • Engle, R. F. (1982). Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation. Econometrica, 50(4), 987-1007. DOI
  • Bollerslev, T. (1986). Generalized Autoregressive Conditional Heteroskedasticity. Journal of Econometrics, 31(3), 307-327. DOI
  • Mandelbrot, B. (1963). The Variation of Certain Speculative Prices. The Journal of Business, 36(4), 394-419. DOI
  • Nelson, D. B. (1991). Conditional Heteroskedasticity in Asset Returns: A New Approach. Econometrica, 59(2), 347-370. DOI
  • Katsiampa, P. (2017). Volatility estimation for Bitcoin: A comparison of GARCH models. Economics Letters, 158, 3-6. DOI
  • Chu, J., Chan, S., Nadarajah, S., & Osterrieder, J. (2017). GARCH Modelling of Cryptocurrencies. Journal of Risk and Financial Management, 10(4), 17. DOI
  • Sheppard, K. (2023). arch: Autoregressive Conditional Heteroskedasticity (ARCH) and other tools for financial econometrics in Python. GitHub.
Tuyên bố miễn trừ trách nhiệm: Thông tin được cung cấp trong bài viết này chỉ nhằm mục đích giáo dục và thông tin, không cấu thành lời khuyên về tài chính, đầu tư hoặc giao dịch. Giao dịch tiền mã hóa tiềm ẩn rủi ro thua lỗ đáng kể.

MarketMaker.cc Team

Nghiên Cứu & Chiến Lược Định Lượng

Thảo luận trên Telegram
Newsletter

Đi Trước Thị Trường

Đăng ký nhận bản tin của chúng tôi để có những thông tin chuyên sâu độc quyền về AI trading, phân tích thị trường và các cập nhật nền tảng.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất kỳ lúc nào.