Volatility Targeting và giao dịch với dự báo GARCH
Ba phần đầu của loạt bài này đã dạy bạn cách dự báo biến động. Chúng ta đã xây dựng một mô hình GARCH(1,1) đơn biến trong Phần 1, thêm đòn bẩy và đuôi dày với GJR và các sai số đổi mới Student-t trong Phần 2, và mô hình hóa toàn bộ ma trận hiệp phương sai theo thời gian với DCC-GARCH trong Phần 3. Ở cuối mỗi phần, chúng ta in ra một con số: biến động kỳ vọng của ngày mai. Và rồi, nếu thành thật mà nói, chúng ta dừng lại — như thể việc tạo ra dự báo mới là điểm mấu chốt.
Không phải vậy. Một dự báo biến động không phải là P&L. Chưa ai từng được trả tiền cho một điểm QLIKE thấp. Một dự báo chỉ trở nên có giá trị đúng vào khoảnh khắc nó thay đổi một quyết định mà lẽ ra bạn đã làm khác đi — mua bao nhiêu, khi nào cắt, phân bổ bao nhiêu vốn. Nếu dự báo của bạn không làm dịch chuyển một vị thế, thì độ chính xác thống kê của nó chỉ là một thú vui riêng tư.
Phần cuối cùng này nói về việc khép lại vòng lặp đó. Chúng ta lấy các dự báo từ Phần 1-3 và đưa chúng vào làm việc trong quyết định sạch sẽ nhất có thể: volatility targeting — định cỡ một vị thế sao cho biến động thực tế của danh mục đạt một mục tiêu không đổi. Rồi chúng ta làm điều mà blog này quan tâm hơn bất kỳ mô hình đơn lẻ nào: đánh giá một cách trung thực. Chúng ta so chuẩn GARCH với những baseline ngờ nghệch nhưng mạnh (rolling realized vol, EWMA), chúng ta dùng các hàm mất mát bền vững trước thực tế là ta không bao giờ quan sát được biến động thực, chúng ta chạy một backtest walk-forward có tính chi phí và không nhìn trước tương lai, và chúng ta nói thẳng volatility targeting mang lại cho bạn điều gì và không mang lại điều gì. Tiết lộ trước: nó cải thiện lợi nhuận điều chỉnh theo rủi ro và thuần hóa drawdown một cách đáng tin cậy hơn nhiều so với việc tạo ra alpha.
Vì sao Volatility Targeting là phép thử đúng
Có những cách sang trọng hơn để dùng một dự báo biến động — định giá quyền chọn, giới hạn VaR, phòng hộ động — nhưng volatility targeting là cách cô lập giá trị của dự báo với ít nhiễm bẩn nhất từ các cược khác. Ý tưởng chỉ là một phương trình duy nhất.
Nắm giữ một tài sản rủi ro với một hướng do tín hiệu ngụ ý (tạm thời, chỉ là "long"). Thay vì một vị thế cố định, hãy điều chỉnh mức phơi nhiễm tỷ lệ nghịch với biến động dự báo:
trong đó là dự báo của bạn về biến động kỳ tiếp theo (chỉ dùng dữ liệu đến ), và là mức biến động thường niên hóa mà bạn muốn chiến lược vận hành ở đó — chẳng hạn 15% hoặc 20%. Khi mô hình dự báo một thị trường bình lặng, bạn tăng đòn bẩy tiến tới (hoặc vượt quá) 1.0; khi nó dự báo bão tố, bạn thu nhỏ lại. Biến động thực tế của vị thế đã điều chỉnh cỡ, xấp xỉ bậc nhất, là
bất cứ khi nào . Vậy nên toàn bộ chất lượng của bài toán này nằm ở một điều: dự báo của bạn gần với biến động thực tế của kỳ tiếp theo đến mức nào. Một dự báo tốt hơn tạo ra một hồ sơ biến động thực tế phẳng hơn và — như ta sẽ thấy — một Sharpe ratio tốt hơn. Đó là lý do đây là phép thử đúng. Dự báo không phải là đồ trang trí; nó là mẫu số.
Vì sao điều này nâng Sharpe và kiểm soát drawdown
Hai sự thật thực nghiệm làm nên chuyện ở đây.
Biến động dễ dự báo hơn nhiều so với lợi suất. Hướng của lợi suất BTC ngày mai gần như tung đồng xu ở tần suất ngày; còn độ lớn thì không. Biến động tụ cụm — biến động lớn theo sau biến động lớn — đó chính là toàn bộ lý do GARCH tồn tại (Phần 1 đã suy ra cấu trúc AR(1)-trong-phương-sai mã hóa điều này). Một khoảng 0.4-0.6 cho phương sai một-ngày-tới là chuyện thường; con số tương tự cho lợi suất sẽ là một tín hiệu đẳng cấp Renaissance. Volatility targeting khai thác đại lượng dự báo được và giữ thái độ bất khả tri với đại lượng không dự báo được.
Sharpe ratio không cố định theo thời gian; nó giảm khi biến động vọt lên. Các chế độ biến động cao trong crypto — các thác giảm đòn bẩy, sự sụp đổ của sàn giao dịch, những ngày mọi thứ nhảy gap 30% — có xu hướng có lợi-suất-trên-đơn-vị-rủi-ro tệ hơn, chứ không phải tốt hơn. Bằng cách cơ học cắt phơi nhiễm đúng lúc biến động dự báo cao, bạn giảm tỷ trọng những giai đoạn đóng góp nhiều nhất vào drawdown và ít nhất vào lợi nhuận gộp kép. Moreira và Muir (2017) đã cho thấy đối với cổ phiếu rằng các danh mục quản lý theo biến động — chính cách điều chỉnh cỡ này — nâng Sharpe ratio và tạo ra alpha dương so với factor không được quản lý. Cơ chế không phải phép màu; nó là việc từ chối nắm giữ một vị thế đô-la không đổi vào những cửa sổ được dự báo là hỗn loạn.
Lợi ích về drawdown còn trực tiếp hơn. Drawdown tối đa bị chi phối bởi đuôi của phân phối lợi suất vị thế. Vì có biến động ghim gần , cái đuôi trái dày mà một chiến lược danh nghĩa cố định phải chịu trong một vụ bùng nổ biến động bị nén lại: bạn vốn đã nhỏ khi bước vào. Volatility targeting không dự đoán các cú sụp, nhưng nó có hệ thống bị phơi nhiễm thấp khi thị trường bị kích động, và kích động là lúc các cú sụp xảy ra.
Quan hệ với Kelly và định cỡ theo phân số
Volatility targeting là anh em họ gần của tiêu chí Kelly. Với một tài sản đơn lẻ có lợi suất vượt trội kỳ vọng và phương sai , phân số tối ưu về tăng trưởng (full-Kelly) là
Nếu bạn giả định Sharpe ratio gần như không đổi — một giả định mạnh, nhưng là giả định ngầm trong "thị trường trả một giá ổn định cho rủi ro" — thì và , đó chính xác là volatility targeting với . Nói cách khác, volatility targeting là định cỡ Kelly dưới giả định rằng lợi suất kỳ vọng tỷ lệ với biến động. Chúng ta phân tích cặn kẽ full và fractional Kelly, cùng lý do không ai tỉnh táo lại giao dịch full Kelly, trong tiêu chí Kelly và định cỡ chiến lược. Bài học thực tiễn từ đó vẫn áp dụng: dùng một phân số của cỡ lý thuyết, bởi sai số ước lượng ở mẫu số (dự báo biến động của bạn) và đặc biệt ở tử số (lợi suất kỳ vọng) khiến định cỡ đầy đủ trở nên hung hăng một cách nguy hiểm.
Còn hai mối liên hệ nữa đáng ghi nhớ. Thứ nhất, volatility targeting định cỡ theo độ phân tán đối xứng của lợi suất, nhưng các khoản payoff của crypto không đối xứng — chi phí của một ngày giảm 20% không phải là bản phản chiếu của một ngày tăng 20% một khi đòn bẩy và thanh lý dính vào. Chúng ta xử lý sự bất đối xứng đó một cách trực tiếp trong bất đối xứng lãi-lỗ, và một dự báo GJR/EGARCH (Phần 2) đã nướng sẵn một phần của nó vào bằng cách phản ứng mạnh hơn với các cú sốc âm. Thứ hai, một dự báo biến động là một ước lượng điểm; một cái nhìn rủi ro trọn vẹn hơn gắn một khoảng vào đó. Dự đoán bảo giác cho giao dịch cho thấy cách biến đầu ra của mô hình thành các khoảng không phụ thuộc phân phối mà bạn có thể định cỡ dựa vào, điều này ghép rất tự nhiên với chủ đề đánh-giá-trung-thực của bài viết này.
Các đối thủ: GARCH phải đánh bại ai
Đây là kỷ luật tách một đánh giá thực khỏi một bản demo. Trước khi bạn phong vương cho GARCH, bạn phải cho nó những đối thủ rẻ, hiển nhiên, và đánh bại khó đến bất ngờ. Nếu mô hình GJR-t công phu của bạn không thể vượt trội một EWMA năm dòng, bạn đã học được điều gì đó quý giá và tiết kiệm cho mình rất nhiều độ phức tạp trong sản xuất.
Chúng ta so chuẩn bốn bộ dự báo biến động của kỳ tiếp theo.
(a) Biến động thực tế lùi (độ lệch chuẩn cuộn)
Dự báo ngây thơ nhất: biến động ngày mai bằng độ lệch chuẩn mẫu của lợi suất ngày gần nhất.
Nó có một siêu tham số (cửa sổ , thường 20-60 ngày) và không có mô hình. Khuyết điểm của nó là mọi quan sát trong cửa sổ đều nhận trọng số bằng nhau rồi đột ngột rơi khỏi vực khi thoát ra — hiệu ứng "ghosting" hay "echo", nơi một ngày sụp đổ duy nhất thổi phồng dự báo trong đúng ngày rồi biến mất qua một đêm, bất kể thị trường có thực sự lắng xuống hay không.
(b) EWMA / RiskMetrics ()
Trung bình động có trọng số mũ khắc phục vấn đề echo bằng cách gán trọng số suy giảm hình học cho các lợi suất bình phương cũ hơn:
Đây là bộ ước lượng RiskMetrics (J.P. Morgan, 1996). Với chuẩn tắc cho dữ liệu ngày, bộ nhớ hiệu dụng khoảng ngày, nhưng độ suy giảm mượt mà — không có vực. Chú ý EWMA thực chất là gì: nó là một GARCH(1,1) tích hợp với và , tức GARCH không có hồi quy về trung bình và không có phương sai dài hạn. Nó có không tham số tự do nào nếu bạn chấp nhận , và nó là baseline khó nhằn nhất duy nhất trong toàn bộ bài viết này. Một phần lớn các bài báo kiểu "GARCH đánh bại X" lặng lẽ thất bại trong việc đánh bại EWMA ngoài mẫu.
import numpy as np
import pandas as pd
def ewma_vol(returns: pd.Series, lam: float = 0.94, sigma0: float | None = None) -> pd.Series:
"""RiskMetrics EWMA conditional volatility (returns in decimal, e.g. 0.03).
sigma2_t = lam * sigma2_{t-1} + (1 - lam) * r_t^2
Returns a series aligned to `returns` where value at t uses info up to t.
"""
r2 = np.square(returns.values)
var = np.empty_like(r2)
var[0] = sigma0**2 if sigma0 is not None else r2[0]
for t in range(1, len(r2)):
var[t] = lam * var[t - 1] + (1.0 - lam) * r2[t - 1] # note: r_{t-1}, no look-ahead
return pd.Series(np.sqrt(var), index=returns.index, name="ewma_vol")
Điều tinh tế duy nhất khiến người ta vấp: dự báo cho kỳ (dùng được để định cỡ một vị thế nắm giữ qua ) phải được xây dựng từ những lợi suất quan sát trước . Trong đệ quy trên, var[t] dùng r2[t-1], nên chuỗi này là một dự báo một-bước-tới đúng nghĩa. Lấy chỉ số này cho đúng chính là sự khác biệt giữa một backtest và một ảo tưởng — sẽ nói thêm ở phần walk-forward.
(c) GARCH(1,1) và GJR-t (Phần 1-2)
Các nhân vật chính của chúng ta. GARCH(1,1) chuẩn:
với phương sai dài hạn và dự báo một bước rơi thẳng ra từ đệ quy (Phần 1). Phần mở rộng GJR-GARCH thêm một số hạng đòn bẩy để các cú sốc âm nâng phương sai nhiều hơn các cú sốc dương:
và ghép với các sai số đổi mới Student-t để xử lý đuôi dày của crypto, đây là GJR-t của Phần 2. Lý do GARCH có thể đánh bại EWMA là hồi quy về trung bình: sau một cú sốc, GARCH kéo dự báo trở lại về phía với tốc độ do chi phối, trong khi EWMA (vốn tích hợp) không bao giờ hồi quy. Khi biến động vọt lên rồi bình thường hóa — trường hợp phổ biến — dự báo của GARCH suy giảm trở lại nhanh hơn và chính xác hơn. Khi biến động thực sự dai dẳng, hai cái gần như không phân biệt được.
(d) HAR-RV trên phương sai thực tế (nếu bạn có dữ liệu nội ngày)
Nếu bạn có các thanh nội ngày — và trong thị trường crypto 24/7 thì gần như luôn có — bạn có thể dựng một proxy biến động ít nhiễu hơn nhiều so với lợi suất bình phương theo ngày: phương sai thực tế (realized variance), tổng các lợi suất nội ngày bình phương trong ngày.
Mô hình Heterogeneous Autoregressive của Corsi (2009) dự báo phương sai thực tế của ngày mai từ trung bình theo ngày, tuần và tháng của quá khứ — một cách thô nhưng hiệu quả đáng kể để nắm bắt tính dai dẳng bộ nhớ dài với ba biến hồi quy:
trong đó và là trung bình lùi 5-ngày và 22-ngày của theo ngày. Đó là một hồi quy OLS thuần túy, nó khai thác proxy nội ngày chất lượng cao hơn, và nó thường là bộ dự báo biến-động-ngày tốt nhất trong bốn cái — thường đánh bại GARCH chính xác vì là một mục tiêu sạch hơn .
import numpy as np
import pandas as pd
def realized_variance(intraday_returns: pd.Series, day_index) -> pd.Series:
"""Daily realized variance = sum of squared intraday (log) returns per day.
`intraday_returns` indexed by timestamp; `day_index` maps to calendar day.
"""
return intraday_returns.pow(2).groupby(day_index).sum()
def har_features(rv: pd.Series) -> pd.DataFrame:
"""Build HAR regressors from a daily realized-variance series."""
df = pd.DataFrame({"rv": rv})
df["rv_d"] = df["rv"].shift(1) # yesterday
df["rv_w"] = df["rv"].shift(1).rolling(5).mean() # trailing week
df["rv_m"] = df["rv"].shift(1).rolling(22).mean() # trailing month
df["target"] = df["rv"] # predict today's RV
return df.dropna()
def fit_har(rv: pd.Series):
"""Fit HAR-RV by OLS. Returns (coef_dict, predict_fn)."""
df = har_features(rv)
X = np.column_stack([np.ones(len(df)), df["rv_d"], df["rv_w"], df["rv_m"]])
y = df["target"].values
beta, *_ = np.linalg.lstsq(X, y, rcond=None)
names = ["const", "rv_d", "rv_w", "rv_m"]
def predict(rv_d, rv_w, rv_m):
return float(beta @ np.array([1.0, rv_d, rv_w, rv_m]))
return dict(zip(names, beta)), predict
Một lưu ý về log-HAR: vì lệch phải và dương chặt, nhiều người thực hành hồi quy trên các đặc trưng HAR dạng log, điều này cải thiện độ khớp và bảo đảm các dự báo dương. Khi bạn lũy thừa ngược lại, bạn nên cộng một hiệu chỉnh Jensen nửa-phương-sai, , nếu không bạn sẽ dự báo thiếu một cách có hệ thống.
Với bốn bộ dự báo trong tay — RV, EWMA, GARCH/GJR-t, HAR — câu hỏi trở thành: làm sao ta quyết định cái nào tốt nhất, khi ta không bao giờ nhìn thấy thứ mà tất cả chúng đều đang cố dự đoán?
Đánh giá một dự báo biến động một cách trung thực
Đây là bài học cốt lõi của bài viết, nên hãy chậm lại ở đây.
Bạn muốn so sánh các dự báo với phương sai điều kiện thực . Nhưng là một đại lượng tiềm ẩn — nó là một tham số của quá trình sinh dữ liệu, không bao giờ quan sát trực tiếp được. Tất cả những gì bạn có là một lợi suất thực tế mỗi ngày. Vậy nên mọi đánh giá biến động thực chất là so sánh dự báo của bạn với một proxy nhiễu cho sự thật. Hai proxy chuẩn:
- Lợi suất bình phương . Không thiên lệch cho dưới một mô hình trung bình bằng không (), nhưng cực kỳ nhiễu: một lợi suất ngày đơn lẻ là một ước lượng một-quan-sát của một độ lệch chuẩn. Proxy có thể bằng 0 (một ngày phẳng) ngay cả khi biến động thực cao, hoặc khổng lồ vào một ngày đuôi may mắn.
- Phương sai thực tế từ dữ liệu nội ngày. Ít nhiễu hơn nhiều — việc lấy mẫu nội ngày làm trung bình hóa nhiễu lợi-suất-đơn-lẻ đặc thù — đó chính là lý do HAR-RV hoạt động và lý do bạn nên dùng làm proxy nếu bạn có bất kỳ dữ liệu nội ngày nào.
Điều tinh tế bẫy gần như tất cả mọi người: vì proxy có nhiễu, việc chọn hàm mất mát không hề vô hại. Xếp hạng hai dự báo với hàm mất mát sai và proxy nhiễu có thể đảo ngược thứ hạng, nói với bạn rằng dự báo tệ hơn mới là tốt hơn. Patton (2011) đã tìm ra chính xác những hàm mất mát nào là "bền vững" theo nghĩa rằng xếp hạng các dự báo theo mất mát kỳ vọng trên proxy nhiễu cho cùng thứ hạng mà bạn sẽ có trên phương sai thực (không quan sát được). Chỉ một họ cụ thể đủ điều kiện. Hai thành viên có ý nghĩa trong thực tế.
MSE so với QLIKE
Sai số bình phương trung bình trên phương sai:
trong đó là dự báo và được proxy bởi hoặc . MSE bền vững theo nghĩa của Patton (thứ hạng của nó nhất quán với proxy), nhưng nó đối xứng và phụ thuộc thang đo: nó phạt một dự báo thừa và một dự báo thiếu cùng độ lớn tuyệt đối như nhau, và nó gán trọng số cho các sai số trong các giai đoạn biến động cao lớn hơn rất nhiều so với các sai số trong các giai đoạn bình lặng. Một mô hình bắt trúng 95% ngày bình lặng nhưng nổ tung các dự báo phương sai vào ba ngày khủng hoảng sẽ trông thật tệ dưới MSE, ngay cả khi hành vi khủng hoảng của nó chính là thứ bạn thực sự muốn.
Mất mát QLIKE (quasi-likelihood) là con ngựa kéo cày:
Nó là mất mát ngụ ý bởi một likelihood Gauss trên phương sai, nó cũng bền vững theo nghĩa của Patton, và nó có hai tính chất khiến nó là lựa chọn ưa thích cho biến động. Thứ nhất, nó bất đối xứng theo đúng hướng: nó phạt việc dự báo thiếu phương sai nhiều hơn dự báo thừa. Với một người quản lý rủi ro hay một người vol-target, đó là sự bất đối xứng đúng — dự báo thiếu biến động nghĩa là bạn nhận quá nhiều cỡ ngay trước khi nó trở nên quan trọng, đó là sai lầm đắt giá. Thứ hai, nó (đại khái) bất biến theo thang đo: vì nó phụ thuộc vào tỷ số , một sai số dự báo 10% tốn xấp xỉ như nhau dù nó xảy ra vào ngày bình lặng hay ngày khủng hoảng, nên đánh giá không bị cướp diễn đàn bởi một nhúm quan sát phương sai cao như cách MSE bị. Sự bền vững đó trước tính phương sai thay đổi của proxy chính là thứ bạn muốn khi toàn bộ điểm mấu chốt là biến động dao động dữ dội.
Lưu ý , với đẳng thức khi và chỉ khi . Thấp hơn là tốt hơn, giống như MSE.
import numpy as np
def qlike(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
"""Per-observation QLIKE loss. `proxy` is r^2 or RV (a variance proxy),
`forecast_var` is h = sigma_hat^2. Both strictly positive, same units.
"""
ratio = proxy / forecast_var
return ratio - np.log(ratio) - 1.0
def mse_var(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
"""Per-observation MSE on the variance scale."""
return np.square(proxy - forecast_var)
Hai cảnh báo vận hành. Giữ proxy và dự báo trong cùng đơn vị y hệt (cả hai đều là phương sai theo ngày, hoặc cả hai thường niên hóa) nếu không tỷ số vô nghĩa. Và không bao giờ để forecast_var chạm không — kẹp nó về một sàn nhỏ, bởi sẽ đầu độc toàn bộ trung bình.
Hồi quy Mincer-Zarnowitz
Một con số mất mát đơn lẻ cho bạn biết dự báo nào tốt hơn; nó không cho bạn biết một dự báo sai như thế nào. Hồi quy Mincer-Zarnowitz (1969) thì có. Hồi quy proxy trên dự báo:
Dưới một dự báo tối ưu, không thiên lệch, và : trung bình thì phương sai thực tế bằng dự báo. Các độ lệch chẩn đoán bệnh lý:
- với : chữ ký kinh điển của một dự báo quá biến động — nó phản ứng thái quá, dự đoán những cực trị không thành hiện thực đầy đủ. Rất phổ biến với các mô hình thô do lợi suất bình phương dẫn dắt.
- : dự báo phản ứng dưới mức, tỷ lệ quá ít với phương sai thực.
- hồi quy thấp: ngay cả khi trông ổn về trung bình, dự báo vẫn theo dõi phương sai kém từ ngày này qua ngày khác. Vì proxy quá nhiễu, đừng hoảng khi của MZ so với thường chỉ là 0.05-0.20; so với nó sẽ cao hơn nhiều. so với bị chặn dưới 1 khá xa bất kể dự báo tốt đến đâu, thuần túy vì nhiễu proxy.
Một kiểm định đồng thời của cho một kiểm tra hiệu chỉnh chính thức. Trong thực tế, dùng MZ như một công cụ chẩn đoán để hiểu một dự báo, và QLIKE để xếp hạng các dự báo.
Diebold-Mariano: khác biệt có thực không?
Giả sử QLIKE trung bình của GARCH là 0.183 và của EWMA là 0.191. GARCH "thắng." Nhưng 0.008 có phải là một lợi thế thực hay là nhiễu lấy mẫu? Kiểm định Diebold-Mariano (1995) trả lời chính xác điều này. Định nghĩa chênh lệch mất mát theo từng kỳ
cho hai dự báo và (ở đây = QLIKE). Giả thuyết không là độ chính xác dự đoán bằng nhau, . Thống kê là chênh lệch trung bình được chuẩn hóa bởi sai số chuẩn dài hạn (HAC) của nó, bởi có tương quan chuỗi:
trong đó là một ước lượng phương sai dài hạn kiểu Newey-West. Một thống kê DM vượt quá bác bỏ độ chính xác bằng nhau ở mức 5%. Quan trọng là, DM là một kiểm định về các dự báo, không phải các mô hình lồng nhau, và nó xử lý sự phụ thuộc chuỗi trong chuỗi mất mát mà một kiểm định ngây thơ trên sẽ bỏ qua.
import numpy as np
from scipy import stats
def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1):
"""Diebold-Mariano test of equal predictive accuracy.
loss_a, loss_b: per-period losses (e.g. QLIKE) for forecasts A and B.
h: forecast horizon; Newey-West lag = h - 1 (>=0), plus a small-sample buffer.
Returns (DM_stat, p_value). Negative DM => A has lower loss (A better).
"""
d = np.asarray(loss_a) - np.asarray(loss_b)
T = len(d)
d_bar = d.mean()
lag = max(h - 1, 0)
gamma0 = np.mean((d - d_bar) ** 2)
lrv = gamma0
for k in range(1, lag + 1):
w = 1.0 - k / (lag + 1)
cov = np.mean((d[k:] - d_bar) * (d[:-k] - d_bar))
lrv += 2.0 * w * cov
dm = d_bar / np.sqrt(lrv / T)
adj = np.sqrt((T + 1 - 2 * h + h * (h - 1) / T) / T)
dm *= adj
p = 2.0 * (1.0 - stats.t.cdf(abs(dm), df=T - 1))
return float(dm), float(p)
Kết quả minh họa trong comment đó là kết cục trung thực và phổ biến, và nó là toàn bộ lý do phần này tồn tại: GARCH thường ghi được một mất mát trung bình thấp hơn EWMA một chút, và cũng thường như vậy lợi thế đó không vượt qua được rào ý nghĩa DM. Nếu bạn chỉ luôn báo cáo QLIKE trung bình, bạn sẽ tự thuyết phục mình về những lợi thế mà một kiểm định DM lẽ ra đã phủ quyết. Hãy báo cáo thống kê DM. Đây là cùng kỷ luật chúng ta áp dụng cho lợi suất chiến lược trong đánh giá trung thực khi không có lợi thế bền vững — một ước lượng điểm đánh bại một benchmark không phải là một lợi thế cho đến khi bạn đã loại trừ khả năng đó là nhiễu.
Backtest: một chiến lược Vol-Target Walk-Forward
Bây giờ chúng ta kết hợp hai nửa — một bộ dự báo và một quy tắc định cỡ — thành một chiến lược và đánh giá nó theo cách duy nhất có ý nghĩa: walk-forward, ngoài mẫu, có chi phí.
Chiến lược cố ý đơn giản, bởi chính sự đơn giản cho phép chúng ta quy kết kết quả cho dự báo biến động chứ không phải cho một tín hiệu tinh khôn. BTC chỉ-long, vol-target. Mỗi ngày, dự báo biến động ngày tới, đặt vị thế thành , giữ qua đêm, và lặp lại. Một biến thể long/flat khóa vị thế lại khi một bộ lọc xu hướng âm; một biến thể danh mục nhỏ định cỡ theo ma trận hiệp phương sai DCC từ Phần 3 thay vì phương sai của một tài sản đơn lẻ. Chúng ta mô tả trọn vẹn trường hợp chỉ-long và ghi chú các mở rộng.
Cơ chế walk-forward và hợp đồng không-nhìn-trước
Tính chất quan trọng bậc nhất của backtest này là mọi đại lượng dùng để định cỡ vị thế vào ngày đều tính được chỉ bằng dữ liệu có sẵn tại phiên đóng cửa của ngày . Các tham số GARCH được ước lượng lại trên một cửa sổ cuộn kết thúc tại ; dự báo là một-bước-tới từ lần khớp đó; vị thế được đặt từ dự báo đó; và lợi suất kiếm được là , trong đó là lợi suất của ngày tiếp theo, thứ mà mô hình chưa bao giờ thấy. Khớp lại GARCH trên toàn bộ mẫu rồi "dự báo" quá khứ là cách phổ biến nhất người ta vô tình chế ra một backtest tuyệt vời. Chúng ta xử lý bẫy nhìn-trước này và phương pháp luận tổng quát trong tối ưu hóa walk-forward.
import numpy as np
import pandas as pd
from arch import arch_model
def walk_forward_voltarget(
returns: pd.Series, # daily log returns in decimal (e.g. 0.021)
proxy_var: pd.Series, # variance proxy aligned to returns (RV or r^2)
target_vol_annual: float = 0.20,
window: int = 750, # rolling estimation window (days)
refit_every: int = 5, # refit GARCH weekly, forecast daily (cost saver)
w_max: float = 3.0, # leverage cap
cost_bps: float = 5.0, # per-unit-turnover cost in basis points
ann: int = 365, # crypto trades 365 days/yr
):
"""Long-only vol-targeted BTC, GARCH(1,1)-t forecasts, strictly walk-forward.
Returns a DataFrame with position, forecast vol, net returns, and turnover.
"""
idx = returns.index
target_daily = target_vol_annual / np.sqrt(ann)
fcast_vol = pd.Series(index=idx, dtype=float, name="fcast_vol")
last_res = None
for i in range(window, len(returns) - 1):
if (i - window) % refit_every == 0 or last_res is None:
train = returns.iloc[i - window:i + 1] * 100.0 # scale for the optimizer
am = arch_model(train, mean="Constant", vol="GARCH",
p=1, o=1, q=1, dist="t") # GJR-t, Part 2
last_res = am.fit(disp="off")
f = last_res.forecast(horizon=1, reindex=False)
var_next = f.variance.values[-1, 0] / (100.0 ** 2) # unscale
fcast_vol.iloc[i + 1] = np.sqrt(var_next)
raw_w = (target_daily / fcast_vol).clip(upper=w_max)
position = raw_w.shift(0) # w_{i+1} known at close i
gross_ret = position * returns # earned on day i+1
turnover = position.diff().abs().fillna(0.0)
cost = turnover * (cost_bps / 1e4)
net_ret = (gross_ret - cost).dropna()
out = pd.DataFrame({
"position": position,
"fcast_vol": fcast_vol,
"gross_ret": gross_ret,
"turnover": turnover,
"net_ret": net_ret,
}).dropna()
return out
def performance_stats(net_ret: pd.Series, ann: int = 365) -> dict:
"""Sharpe, realized vol, max drawdown, CAGR, annual turnover."""
mu = net_ret.mean() * ann
sigma = net_ret.std() * np.sqrt(ann)
sharpe = mu / sigma if sigma > 0 else np.nan
equity = (1.0 + net_ret).cumprod()
peak = equity.cummax()
max_dd = (equity / peak - 1.0).min()
cagr = equity.iloc[-1] ** (ann / len(net_ret)) - 1.0
return {
"sharpe": round(sharpe, 2),
"realized_vol": round(sigma, 3),
"max_drawdown": round(max_dd, 3),
"cagr": round(cagr, 3),
}
Vài ghi chú triển khai quan trọng hơn vẻ ngoài của chúng:
- Điều chỉnh thang đo cho bộ tối ưu. Các lần khớp
archhạnh phúc hơn về mặt số học khi lợi suất ở dạng phần trăm, do đó* 100và/ 100**2tương ứng khi bỏ điều chỉnh thang đo phương sai. Quên bỏ điều chỉnh thang đo và mục tiêu biến động của bạn lệch đi 10,000 lần. - Nhịp khớp lại. Ước lượng lại các tham số GARCH mỗi ngày là tốn kém và gần như không thêm gì — các tham số ổn định từ tuần này qua tuần khác. Khớp lại hàng tuần (
refit_every=5) trong khi dự báo hàng ngày (đệ quy cập nhật từ các lợi suất mới ngay cả khi không khớp lại) là thỏa hiệp tiêu chuẩn. Điều này phản chiếu lời khuyên caching từ pipeline copula trong các mô hình copula cho rủi ro chung. - Trần không phải để làm cảnh. Khi biến động dự báo sụp đổ trong một chế độ tĩnh lặng như chết, có thể bùng lên 5x, 10x đòn bẩy. Volatility targeting không trần sẽ vui vẻ trao cho bạn đòn bẩy thảm họa ngay trước một cú thay đổi chế độ biến động — đúng khoảnh khắc dự báo sắp sai nhất. Kẹp nó (3x ở đây) và nhận ra rằng trần sẽ ràng buộc chính xác trong các giai đoạn bình lặng nhất, nguy hiểm-nhất-khi-nhìn-lại.
- Chi phí tỷ lệ với vòng quay, và volatility targeting là một cỗ máy vòng quay. Mọi rung lắc trong dự báo đều định cỡ lại vị thế. Trên một tài sản biến động thấp với một dự báo giật cục, bạn có thể quay sổ hàng ngày. Số hạng
cost_bpskhông phải chi tiết làm tròn; với một vol-target vòng quay cao, nó có thể ăn một phần đáng kể của cải thiện Sharpe gộp.
Đầu ra trông như thế nào (minh họa)
Chạy điều này trên dữ liệu BTC theo ngày qua một cửa sổ nhiều năm, so sánh bốn bộ dự báo làm mẫu số định cỡ, có xu hướng cho ra một bảng với hình dạng sau. Các con số bên dưới là minh họa — được chọn bằng tay để thể hiện mẫu hình điển hình, không phải đầu ra của một backtest thực — nhưng thứ tự và độ lớn là đại diện cho những gì người thực hành báo cáo.
| Dự báo định cỡ | Sharpe | Realized vol | Target vol | Max drawdown | Vòng quay/năm |
|---|---|---|---|---|---|
| Danh nghĩa cố định (không target) | 0.71 | 0.68 | — | -0.78 | 0.1x |
| Rolling RV (60d) | 0.94 | 0.24 | 0.20 | -0.41 | 12x |
| EWMA () | 1.02 | 0.21 | 0.20 | -0.35 | 19x |
| GARCH(1,1)-t | 1.05 | 0.21 | 0.20 | -0.33 | 22x |
| HAR-RV (proxy nội ngày) | 1.09 | 0.20 | 0.20 | -0.31 | 20x |
Hai biến thể đáng xây dựng
Trường hợp chỉ-long cô lập dự báo, nhưng hai mở rộng đủ phổ biến để trình bày rõ ràng.
Long/flat với một cổng xu hướng. Volatility targeting định cỡ vị thế nhưng không có quan điểm về hướng — nó luôn long. Một cải thiện rẻ và trung thực là khóa vị thế lại khi một bộ lọc xu hướng chậm chuyển âm, để bạn chỉ giữ vị thế long vol-target trong các xu hướng tăng và ngồi phẳng nếu không. Điều này giữ logic định cỡ y hệt và xếp một bộ lọc chế độ thô lên trên; nó không giả vờ canh thời điểm vào lệnh, chỉ tránh nắm giữ xuyên qua các xu hướng giảm rõ ràng.
def apply_trend_gate(position: pd.Series, price: pd.Series, fast: int = 20, slow: int = 100):
"""Zero out the (already vol-targeted) position when the fast SMA is below
the slow SMA. Both SMAs use only past prices, so no look-ahead is introduced.
"""
fast_ma = price.rolling(fast).mean().shift(1) # shift: known at prior close
slow_ma = price.rolling(slow).mean().shift(1)
gate = (fast_ma > slow_ma).astype(float) # 1.0 in uptrend, 0.0 otherwise
return position * gate.reindex(position.index).fillna(0.0)
Cổng xu hướng cắt vòng quay ở phía giảm (bạn ngừng quay một vị thế đang co lại trong một thị trường gấu) nhưng thêm rủi ro chế độ riêng của nó — nó bị whipsaw trong các thị trường đi ngang lộn xộn và trễ ở các bước ngoặt. Liệu nó có giúp ích hay không là một câu hỏi thực nghiệm mà bạn phải trả lời với cùng sự nghiêm ngặt walk-forward, kiểm định DM như chính quy tắc định cỡ; một bộ lọc xu hướng đúng là loại phần thêm trông tuyệt vời trong mẫu và bốc hơi ngoài mẫu.
Volatility targeting danh mục trên hiệp phương sai DCC. Với một sổ nhiều tài sản, dự báo vô hướng trở thành biến động danh mục , trong đó là ma trận hiệp phương sai biến đổi theo thời gian từ DCC-GARCH của Phần 3. Bạn chọn các trọng số nền (trọng số bằng nhau, vốn hóa thị trường, hoặc một độ nghiêng mean-variance), tính biến động dự báo của danh mục dưới , và điều chỉnh cỡ toàn bộ vector trọng số để đạt mục tiêu danh mục.
def portfolio_voltarget_weights(base_w, cov_forecast, target_vol_daily, w_gross_max=3.0):
"""Scale a base weight vector so forecast portfolio vol hits the target.
base_w: (n,) base allocation (need not sum to 1).
cov_forecast: (n, n) one-step-ahead covariance from DCC-GARCH (daily units).
"""
base_w = np.asarray(base_w, dtype=float)
port_var = float(base_w @ cov_forecast @ base_w)
port_vol = np.sqrt(max(port_var, 1e-12))
scale = min(target_vol_daily / port_vol, w_gross_max / np.abs(base_w).sum())
return scale * base_w
Đây là cây cầu tự nhiên tới văn liệu xây dựng danh mục: các trọng số nền có thể đến từ mean-variance Markowitz hoặc một phương pháp dựa-trên-rủi-ro như HRP/CVaR, và volatility targeting khi đó ngồi bên trên như một lớp phủ điều chỉnh rủi ro tổng hợp về một hằng số. Ma trận DCC quan trọng vì các tương quan vọt lên trong các cú sụp (Phần 3) — một danh mục trông có vẻ đa dạng hóa trong các thị trường bình lặng có thể có biến động dự báo cao hơn nhiều so với những gì một hiệp phương sai tĩnh ngụ ý, đúng lúc nó trở nên quan trọng, và lớp phủ cắt phơi nhiễm gộp để phản ứng.
Chẩn đoán bạn luôn nên vẽ
Đừng bao giờ chỉ tin bảng tóm tắt. Với bất kỳ vol-target nào, hãy vẽ ba thứ và mắt thường nhìn qua chúng trước khi bạn tin bất kỳ con số Sharpe nào. Thứ nhất, biến động cuộn thực tế của chiến lược so với đường mục tiêu — nó nên ôm sát mục tiêu; sự trôi dạt có hệ thống lên trên nó nghĩa là dự báo của bạn thiên lệch thấp (hướng đắt giá). Thứ hai, chuỗi vị thế/đòn bẩy — tìm trần đang ràng buộc và các đợt vọt đòn bẩy ngay trước các drawdown, chữ ký của một dự báo bị bắt hụt bởi một cú thay đổi chế độ. Thứ ba, đồ thị phân tán dự báo-so-với-proxy (bức tranh Mincer-Zarnowitz) — một đám mây với độ dốc lệch xa 1 cho bạn biết dự báo bị định thang đo sai theo cách mà trung bình QLIKE có thể che giấu. Ba đồ thị này bắt được nhiều lỗi và nhiều sự tự lừa dối hơn bất kỳ thống kê đơn lẻ nào.
Đọc bảng này theo cách bạn nên đọc mọi bảng backtest: nhìn vào cái gì bền vững và cái gì cận biên. Các sự thật bền vững nhảy ra ngay. Mọi biến thể vol-target đều nghiền nát danh nghĩa cố định về Sharpe và, ấn tượng hơn, về drawdown và độ ổn định của biến động thực tế — chiến lược danh nghĩa cố định chạy ở 68% biến động thường niên với một drawdown 78%, đơn giản là không thể đầu tư được. Và mọi phương pháp targeting đều mang lại biến động thực tế gần với mục tiêu 20%, đó là toàn bộ lời hứa của việc cơ chế này vận hành. Các sự thật cận biên là những khác biệt giữa các bộ dự báo: HAR nhỉnh hơn GARCH nhỉnh hơn EWMA nhỉnh hơn rolling RV, nhưng các khoảng cách nhỏ — một phần mười điểm Sharpe — và, khi kiểm định với Diebold-Mariano trên các dự báo hoặc bootstrap trên các lợi suất, sẽ thường xuyên không vượt qua ngưỡng ý nghĩa. Khoảng cách nhỏ, mong manh, phụ thuộc chế độ đó giữa bộ dự báo tinh vi và bộ dự báo ngây thơ chính là tiêu đề trung thực của cả loạt bài này.
Trung thực về những gì điều này mang lại cho bạn
Blog này có cả một bộ sưu tập về backtest mà không tự lừa mình, nên hãy áp dụng nó vào chính kết quả của chúng ta thay vì lặng lẽ hy vọng bạn không làm vậy.
Volatility targeting cải thiện lợi nhuận điều chỉnh theo rủi ro và các drawdown. Nó không chế tạo alpha từ hư không. Nhìn lại bảng. Cải thiện Sharpe từ targeting là thực và đáng có — nhưng phân rã nó ra thì phần lớn đến từ việc không nắm giữ một vị thế không đổi vào các chế độ biến động cao, điều này về mặt cơ học tránh được các drawdown tệ nhất và ổn định đường gộp kép. Chiến lược vẫn là long BTC; nó không có quan điểm nào mà thị trường không trao cho. Nếu BTC có một Sharpe âm trên mẫu của bạn, volatility targeting sẽ trao cho bạn một Sharpe âm ít tệ hơn, không phải một Sharpe dương. Nó tái định hình phân phối lợi suất — đuôi mỏng hơn, biến động vững hơn, gộp kép hình học tốt hơn — nhưng lợi thế hướng thô là bất cứ gì mà vị thế long nền tảng có. Đừng để một đường equity đẹp lừa bạn tin rằng bạn đã tìm thấy alpha trong khi bạn đã tìm thấy quản lý rủi ro. Moreira-Muir tìm thấy alpha thực trong các factor cổ phiếu từ việc quản lý biến động, nhưng kết quả đó nói về sự đánh đổi rủi ro-lợi nhuận biến đổi theo thời gian của factor, và nó không tự động chuyển sang một tài sản crypto đơn lẻ trên một mẫu khác.
Lợi thế chất lượng dự báo của GARCH so với EWMA thường nhỏ và phụ thuộc chế độ. Đây là phần thưởng khó chịu của Phần 1-3. Bạn đã xây các mô hình ngày càng tinh vi — các số hạng đòn bẩy, đuôi Student-t, các tương quan động — và đóng góp cận biên của mỗi cái vào một P&L vol-target, so với một EWMA ngây thơ, thường nằm trong dải nhiễu. Lợi thế của GARCH (hồi quy về trung bình sau các cú sốc) chủ yếu xuất hiện trong các chế độ cụ thể: các cú vọt sắc nét rồi bình thường hóa. Trong các xu hướng nghiền hoặc các chế độ biến động cao dai dẳng, nó khác EWMA rất ít. Điều này không làm GARCH vô dụng — cấu trúc hồi quy về trung bình, các tham số diễn giải được, khả năng mô phỏng các đường đi tới và định giá quyền chọn dựa trên dự báo đều có giá trị mà EWMA thiếu — nhưng nếu công dụng duy nhất của bạn là định cỡ, hãy chạy kiểm định DM trước khi bạn trả cái giá phức tạp, và biết rằng phát hiện chế độ đang nói với bạn cùng điều đó từ một góc độ khác: mô hình chiến thắng phụ thuộc vào chế độ.
Sharpe backtest là một chặn trên của Sharpe thực, và volatility targeting nới rộng khoảng cách. Vì chiến lược nặng vòng quay và được điều chỉnh theo đòn bẩy, nó nhạy cảm bất thường với các ma sát mà một backtest ngây thơ bỏ qua: các lệnh khớp của bạn tệ hơn giá đóng cửa mà bạn định cỡ theo, chi phí funding trên các vị thế perp có đòn bẩy tích lũy liên tục, và trần đòn bẩy tương tác với các cơ chế ký quỹ và thanh lý mà một phép w * return đơn giản bỏ qua. Mỗi cái trong số này làm cho thực tế tệ hơn backtest. Chúng ta xử lý khoảng cách này một cách có hệ thống trong tương đồng backtest-thực; riêng với volatility targeting, hãy dự trù cho nó bằng cách dùng chi phí bảo thủ, một trần đòn bẩy thực tế (thấp), và bằng cách thực thi ở giá mở cửa của thanh tiếp theo thay vì giá đóng cửa mà bạn đã tính tín hiệu từ đó.
Một chút lạc đề về phần bù rủi ro biến động. Mọi thứ ở trên dự báo biến động thực tế. Có một đối tượng song song, có thể giao dịch: biến động ngụ ý (implied volatility), được định giá vào quyền chọn, mà trung bình nằm trên biến động thực tế sau đó — phần bù rủi ro biến động, khoản đền bù cho việc gánh chịu rủi ro một cú vọt biến động. Khoảng cách đó tự nó là một nguồn lợi nhuận (bán variance thu hoạch nó, mua nó phòng hộ rủi ro đuôi), và nó là một trò chơi thực sự khác với volatility targeting: nó là một cược vào giá của biến động chứ không phải sự sử dụng một dự báo của biến động. Chúng ta không theo đuổi nó ở đây, nhưng bộ máy bắt đầu với mô hình định giá trong định giá quyền chọn Black-Scholes, và một dự báo biến-động-thực-tế tốt (Phần 1-2) chính là đầu vào bạn cần để phán xét liệu implied vol đắt hay rẻ. So sánh dự báo GARCH của bạn với implied vol của thị trường quyền chọn là một trong những công dụng trung thực hơn cả của mọi thứ bạn đã xây trong loạt bài này.
Các cân nhắc thực tiễn
Một túi hỗn hợp những thứ tách một vol-target hoạt động khỏi một cái mong manh.
- Ước lượng trên đúng chân trời. Nếu bạn định cỡ một vị thế nắm giữ một ngày, hãy dự báo biến động một ngày. Nếu bạn tái cân bằng hàng tuần, hãy dự báo (và target) biến động hàng tuần, hoặc tổng hợp dự báo GARCH theo ngày qua chân trời — dự báo GARCH đa-bước hồi quy về , điều mà phép điều chỉnh ngây thơ "" bỏ qua. Phần 1 bao quát dự báo GARCH đa-bước.
- Thường niên hóa trong các thị trường 24/7. Crypto giao dịch 365 ngày một năm không có cuối tuần hay ngày lễ, nên hãy thường niên hóa biến động ngày với , không phải của cổ phiếu. Làm sai điều này lặng lẽ định thang đo sai mục tiêu của bạn khoảng ~20%.
- Mẫu số có thể là một ma trận hiệp phương sai. Với một sổ nhiều tài sản, hãy thay vô hướng bằng biến động danh mục từ DCC-GARCH của Phần 3, và điều chỉnh cỡ toàn bộ vector trọng số để đạt biến động mục tiêu danh mục. Điều này nối volatility targeting với định cỡ mean-variance (Markowitz cho crypto) và phân bổ dựa-trên-rủi-ro (các pipeline HRP và CVaR) — volatility targeting là trường hợp đặc biệt tài-sản-đơn của việc điều chỉnh cỡ về một ngân sách rủi ro danh mục.
- Volatility targeting thuận chu kỳ theo một cách tinh tế. Khi mọi người cùng chạy quy tắc như nhau, một cú vọt biến động buộc giảm đòn bẩy đồng bộ, đẩy giá xuống, làm tăng biến động thực tế, buộc giảm đòn bẩy nhiều hơn. Vòng phản hồi này (được ghi chép kỹ trong vụ "volmageddon" 2018 và các thác giảm đòn bẩy crypto khác nhau) nghĩa là quy tắc hoạt động kém hơn đúng vào lúc nhiều người chơi dùng nó. Đó không phải lý do để từ bỏ nó, nhưng là lý do để kẹp đòn bẩy và không giả định rằng các lệnh khớp của bạn trong một cú vọt biến động sẽ giống các lệnh khớp thị-trường-bình-lặng.
- Sàn và kẹp dự báo. Một biến động dự báo bằng không hoặc gần không tạo ra đòn bẩy vô hạn. Luôn đặt sàn ở một mức tối thiểu hợp lý và kẹp vị thế, và ghi log tần suất mỗi cái ràng buộc — nếu trần ràng buộc phần lớn thời gian, mục tiêu của bạn quá hung hăng đối với tài sản đó.
Tóm tắt
- Một dự báo biến động không có giá trị cho đến khi nó thay đổi một quyết định. Volatility targeting — định cỡ phơi nhiễm thành (có trần) — là phép thử sạch nhất về giá trị của một dự báo, bởi chất lượng dự báo ánh xạ trực tiếp tới một hồ sơ biến động thực tế phẳng hơn và một Sharpe cao hơn.
- Volatility targeting nâng lợi nhuận điều chỉnh theo rủi ro và, đặc biệt, kiểm soát các drawdown, bởi biến động dự báo được (nó tụ cụm) trong khi hướng thì không, và bởi các Sharpe ratio giảm trong các chế độ biến động cao mà quy tắc tự động giảm tỷ trọng. Nó là định cỡ Kelly dưới giả định rằng lợi suất kỳ vọng tỷ lệ với biến động.
- So chuẩn GARCH một cách trung thực với các baseline mạnh: rolling realized vol, EWMA/RiskMetrics (, một IGARCH với không tham số tự do), và HAR-RV trên một proxy phương sai thực tế nội ngày. EWMA và HAR khó đánh bại.
- Bạn không thể quan sát biến động thực, nên hãy đánh giá dựa trên một proxy ( hoặc, tốt hơn nhiều, ) dùng các hàm mất mát bền vững trước nhiễu proxy. Ưu tiên QLIKE hơn MSE: nó phạt dự báo thiếu nhiều hơn (sai lầm đắt giá) và bất biến theo thang đo, nên không bị cướp diễn đàn bởi vài ngày biến động cao. Dùng Mincer-Zarnowitz để chẩn đoán thiên lệch và kiểm định Diebold-Mariano để quyết định liệu lợi thế của một dự báo là thực hay nhiễu.
- Trong một backtest walk-forward, có tính chi phí, volatility targeting đánh bại danh nghĩa cố định về Sharpe và drawdown một cách đáng tin cậy, và bốn bộ dự báo tụ cụm sát nhau — lợi thế của GARCH-so-với-EWMA nhỏ, phụ thuộc chế độ, và thường không có ý nghĩa thống kê. Hãy báo cáo kiểm định DM, không chỉ mất mát trung bình.
- Hãy trung thực: volatility targeting là quản lý rủi ro, không phải alpha. Nó tái định hình phân phối lợi suất của bất kỳ cược hướng nào bạn đã có; nó không tạo lợi thế từ hư không. Và nó nặng vòng quay và được điều chỉnh theo đòn bẩy, nên các kết quả thực trễ so với backtest nhiều hơn thường lệ.
Tài liệu tham khảo:
- Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. DOI
- Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174-196. DOI
- Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253-263. DOI
- Mincer, J., & Zarnowitz, V. (1969). The evaluation of economic forecasts. In Economic Forecasts and Expectations, NBER.
- Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611-1644. DOI
- J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th ed.
- Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. DOI
- Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
- Harvey, D., Leybourne, S., & Newbold, P. (1997). Testing the equality of prediction mean squared errors. International Journal of Forecasting, 13(2), 281-291. DOI
MarketMaker.cc Team
Nghiên Cứu & Chiến Lược Định Lượng