2014:波動太粗糙了——Rough Volatility 探案#
「布朗運動是個替罪羊,真兇比它粗糙得多。」——高頻數據審訊室牆上的塗鴉。
| 案件檔案 | 內容 |
|---|---|
| 案號 | RV-2014-002 |
| 案發時間 | 2014 年 arXiv 立案 |
| 案發地點 | 交易所高頻報價序列,S&P 與外匯期權櫃檯 |
| 報案人 | Jim Gatheral、Thibault Jaisson、Mathieu Rosenbaum |
| 受害者 | Heston、CIR 與一切均值回歸的光滑波動模型 |
| 兇器 | Hurst 指數 \(H \approx 0.1\) 的對數波動 |
| 共犯 | Zumbach 效應(歷史趨勢反哺未來波動) |
| 症狀 | 短端微笑爆發,偏斜按冪律爆炸 |
| 狀態 | 已結案,波動建模典範轉移 |
案發現場#
2014 年之前,華爾街的波動模型像一間佈置整齊的客廳。
Heston 模型說,方差 \(v_t\) 服從 CIR 過程,均值回歸、路徑 Hölder 指數接近 \(1/2\) ,一切歲月靜好。
然而期權櫃檯天天收到投訴:短到期日的隱含波動微笑陡得離譜,標準隨機波動模型怎麼調參都壓不平。
與此同時,高頻數據庫裡堆積了數十億筆報價,Rosenbaum 團隊決定不再相信模型,改為直接審問數據。
他們用變差法估計已實現波動的對數序列 \(\log \sigma_t\) ,計算其 \(q\) 階矩的標度:
結果讓所有人大吃一驚:斜率顯示 \(H \approx 0.1\) ,遠小於布朗運動的 \(H = 0.5\) 。
這意味著對數波動的路徑比布朗運動粗糙得多,幾乎是鋸齒上的鋸齒。
更詭異的是第二具屍體——Zumbach 效應。
經典時間序列模型(如 GARCH)假設波動只依賴過去的平方收益,然而數據顯示,過去的價格趨勢本身會推高未來的波動。
換言之,市場記得「怎麼跌下來的」,而不只記得「跌了多少」,時間反演對稱性在此碎裂。
案發現場留下兩行血字:波動很粗糙,記憶不對稱。
偵查過程#
偵探三人組的審訊分三輪。
第一輪是測量粗糙度,兇器就是 Hurst 指數 \(H\) 。
他們對多種資產、多個時間尺度重複實驗,發現標度律驚人地穩定。
下表是卷宗中的關鍵證詞摘要:
| 資產 | 估計的 \(H\) | 尺度範圍 \(\Delta\) | 結論 |
|---|---|---|---|
| S&P 500 實現波動 | \(0.08\) | 1 天至 2 個月 | 顯著粗糙 |
| DAX 實現波動 | \(0.10\) | 1 天至 2 個月 | 顯著粗糙 |
| 外匯已實現核估計 | \(0.12\) | 日內至日間 | 顯著粗糙 |
| 模擬布朗對照組 | \(0.50\) | 相同窗口 | 光滑對照 |
為了排除微結構噪聲的栽贓,他們改用無噪聲的預平均估計量, \(H \approx 0.1\) 依然屹立不搖。
於是他們寫下本案的核心模型——Rough Fractional Stochastic Volatility(RFSV):
其中 \(W\) 是布朗運動, \(\nu > 0\) 是波動之波動, \(m \in \mathbb{R}\) 是均值水平,而 \(H \approx 0.1\) 是本案編號。
注意核函數 \((t-s)^{H-1/2}\) 在 \(s \to t\) 時奇異,這正是粗糙的來源,也是長期記憶與短期爆發並存的機關。
第二輪審訊對準 Zumbach 效應。
偵探們檢驗了如下回歸:未來已實現方差 \(RV_{t+\Delta}\) 對過去趨勢項 \(R_{t}^2\) 的依賴,其中 \(R_t\) 是過去收益率的加權平均。
他們發現,加入趨勢項後, \(R^2\) 顯著上升,而純 GARCH 型模型無法複製此現象。
這說明波動不是馬可夫的,它對路徑有記憶,且記憶核恰好是分數型的。
在 Rough Heston 的後續版本中,這被寫成 Volterra 方程:
其中分數核 \(K(u) = u^{H-1/2} / \Gamma(H+1/2)\) 同時解釋了粗糙與 Zumbach 記憶。
第三輪是動機驗證:粗糙能否解釋短端微笑爆發?
期權市場的經驗律是:平值偏斜 \(\psi(\tau)\) 隨到期日 \(\tau \to 0\) 按冪律爆炸,
若 \(H = 0.5\) ,則偏斜趨於常數,與市場矛盾;若 \(H \approx 0.1\) ,則偏斜按 \(\tau^{-0.4}\) 爆炸,與市場吻合。
下表對比了嫌疑人的不在場證明:
| 模型 | 隱含 \(H\) | 短端偏斜行為 | 是否符合市場 |
|---|---|---|---|
| Heston/SABR 經典版 | \(0.5\) | 趨於常數 | 否 |
| 跳躍擴散模型 | 名義 \(0.5\) 加跳 | 靠跳躍硬撐 | 部分符合但參數漂移 |
| Rough Vol( \(H \approx 0.1\) ) | \(0.1\) | 按 \(\tau^{-0.4}\) 爆發 | 是 |
| 分數布朗對照( \(H > 0.5\) ) | \(0.7\) | 偏斜塌陷 | 否 |
證據鏈閉環:高頻時間序列的 \(H\) 與期權橫截面的 \(H\) 指向同一個數字。
結案報告#
Gatheral、Jaisson 與 Rosenbaum 在 2014 年的論文題目直白得像結案陳詞:波動是粗糙的。
本案推翻了沿用二十年的光滑波動假設,確立了三條新誡律。
第一,對數波動的正則性由 \(H \approx 0.1\) 刻畫,任何 Hölder 指數高於此的模型在高頻顯微鏡下都會現形。
第二,Rough Heston 與 RFSV 模型僅用三、四個參數,就能同時擬合歷史波動路徑與全期限微笑曲面,終結了為短端單獨打補丁的時代。
第三,Zumbach 效應被重新發現為分數記憶的必然推論,推動了 Volterra 型隨機波動方程與粗糙路徑定價理論的大發展。
後續影響同樣深遠:數值定價被迫改用混合imin 格式與多因子 Markov 近似,因為分數核既非半鞅又非馬可夫;機器學習校準則因參數大幅減少而變得可行。
探長在報告末尾寫道:「市場從不光滑,是我們的模型太渴望光滑。」
粗糙不是噪聲,而是資訊——這句話後來被刻在了 Rough Vol 每一篇後續論文的致謝之前。
證據與工具#
核心證物一:標度律 \(m(q,\Delta) \sim \Delta^{qH}\) 與 \(H \approx 0.1\) 的普適估計,橫跨股票與外匯。
核心證物二:RFSV 積分錶示與分數核 \(K(u) = u^{H-1/2}\) ,粗糙與記憶的統一兇器。
核心證物三:短端偏斜公式 \(\psi(\tau) \sim \tau^{H-1/2}\) ,連接時間序列與期權橫截面的指紋比對。
| 工具 | 用途 | 出處 |
|---|---|---|
| 已實現變差與預平均 | 高頻波動估計,排除微結構噪聲 | Barndorff-Nielsen 等 |
| Hurst 標度回歸 | 從 \(\log m\) 對 \(\log \Delta\) 讀出 \(H\) | Gatheral–Jaisson–Rosenbaum 2014 |
| 分數 Ornstein–Uhlenbeck | 粗糙波動的平穩版本 | Comte–Renault 1998 先驅 |
| Rough Heston 定價 | 分數 Riccati 方程的傅立葉定價 | El Euch–Rosenbaum 2019 |
| Zumbach 回歸檢驗 | 趨勢項對未來方差的增量解釋力 | Zumbach 2009,Rosenbaum 覆核 |
辦案守則:先讓數據說出 \(H\) ,再讓模型解釋微笑,凡不能同時通過兩堂審訊的波動模型,一律視為嫌疑人。
補充:程式實作#
對應程式#
本節對應程式為 1998-fbm_hurst.py ,以變異數標度迴歸重現 Hurst 指數估計,本程式與 1998 年 Lyons 粗糙路徑篇共用,此處從金融實證的角度解讀。
理論呼應#
本文核心證據是對數波動滿足 \(m(q, \Delta) \sim \Delta^{qH}\) 標度律且 \(H \approx 0.1\) 左右。 程式驗證的正是同一標度律 \(Var B(t) = t^{2H}\) 關係,只是把已實現波動換成分數布朗運動。 \(H = 0.1\) 一組對應市場實測的粗糙波動,其 Hölder 正則性遠低於布朗運動 \(H = 0.5\) 情形。 而短端偏斜公式 \(\psi(\tau) \sim \tau^{H-1/2}\) 冪律正是這種粗糙度的期權市場指紋。
執行方式#
在 隨機微積分 目錄下執行 python3 _code/1998-fbm_hurst.py 即可重現結果,只需 numpy。
實測輸出#
H = 0.1: slope = 0.2264, target 2H = 0.2000, err = 0.0264
H = 0.7: slope = 1.4560, target 2H = 1.4000, err = 0.0560
VERIFY slope_H01=0.2264 slope_H07=1.4560
\(H = 0.1\) 組斜率還原 \(0.2264\) 誤差僅 \(0.0264\) ,呼應文中各資產 \(H\) 皆落在 \(0.1\) 附近的實證發現。
讀者實驗#
將路徑數 M = 500 改為 M = 2000 後重跑,觀察 \(H = 0.1\) 組斜率是否更貼近 \(0.2\) 目標。
完整程式如下:
"""1998 分數布朗運動 Hurst 估計(Cholesky 生成)。
對應 wiki:Mandelbrot–Van Ness (1968) fBM 定義;此處驗證自相似性
Var B(t) = t^{2H},即 log Var 對 log t 斜率 = 2H。
生成:時格 t_i = i/N (N=256,含 0 共 257 點),
共變異 C(s,t) = (s^{2H}+t^{2H}-|t-s|^{2H})/2,Cholesky L,路徑 = L z。
實驗:H = 0.1 與 0.7,各 500 條;逐 t 樣本變異數,
線性迴歸 log Var ~ log t 得斜率,容忍 |slope - 2H| < 0.15。
只用 numpy,固定種子,不畫圖。
"""
import numpy as np
rng = np.random.default_rng(3)
N = 256
M = 500
Hs = (0.1, 0.7)
t = np.arange(N + 1) / N # 含 0
slopes = {}
for H in Hs:
p = 2.0 * H
ti = t[:, None]
tj = t[None, :]
C = 0.5 * (ti ** p + tj ** p - np.abs(ti - tj) ** p)
C += 1e-12 * np.eye(N + 1) # 數值 jitter(H=0.1 時近奇異)
L = np.linalg.cholesky(C)
Z = rng.standard_normal((N + 1, M))
paths = L @ Z # (257, 500)
var_t = np.var(paths[1:, :], axis=1, ddof=1) # 去掉 t=0
logt = np.log(t[1:])
logv = np.log(var_t)
slope, intercept = np.polyfit(logt, logv, 1)
slopes[H] = float(slope)
print(f"H = {H}: slope = {slope:.4f}, target 2H = {p:.4f}, err = {abs(slope - p):.4f}")
print(f"VERIFY slope_H01={slopes[0.1]:.4f} slope_H07={slopes[0.7]:.4f}")
assert abs(slopes[0.1] - 0.2) < 0.15, f"H=0.1 斜率偏差過大: {slopes[0.1]}"
assert abs(slopes[0.7] - 1.4) < 0.15, f"H=0.7 斜率偏差過大: {slopes[0.7]}"