測實戰(zhàn):ARCH族與Heston模型對比與Python實現(xiàn))
1. 為什么波動率預(yù)測值得單獨(dú)拎出來做做量化研究的人遲早會撞上一堵墻收益率的方向極難預(yù)測但波動率卻呈現(xiàn)出相當(dāng)明顯的聚集性和均值回歸特征。這個不對稱性恰恰是波動率建模最有意思的地方。我最初接觸這塊內(nèi)容是因為一個做期權(quán)對沖的朋友抱怨用歷史標(biāo)準(zhǔn)差算出來的對沖比例總是滯后于市場行情劇烈的時候?qū)_不足行情平淡的時候又過度對沖來回被摩擦成本吃掉利潤。后來我們把方向轉(zhuǎn)到動態(tài)波動率預(yù)測上用ARCH族模型和Heston模型分別做了一套流程情況才有所改善。所謂動態(tài)預(yù)測波動率核心思路是承認(rèn)波動率不是常數(shù)而是隨時間變化、并且今天的波動會受到昨天波動的影響。ARCH模型自回歸條件異方差模型和Heston模型是兩條典型路線前者從離散時間序列出發(fā)用過去的殘差平方來刻畫當(dāng)前方差后者從連續(xù)時間隨機(jī)波動率出發(fā)把方差本身建模成一個隨機(jī)過程并且允許方差和價格之間存在相關(guān)性。兩者解決的問題是同一個——給未來的波動率一個可量化、可回測的估計值但建模哲學(xué)、數(shù)據(jù)要求、實現(xiàn)難度完全不同。這篇內(nèi)容適合三類人看一是剛接觸金融時間序列、想搞明白ARCH到底在算什么的新手二是有一定統(tǒng)計基礎(chǔ)、準(zhǔn)備把波動率預(yù)測接入期權(quán)定價或風(fēng)險管理的從業(yè)者三是想對比離散模型和連續(xù)模型實際表現(xiàn)、需要一套可復(fù)現(xiàn)流程的研究者。我會把兩條路線的原理、參數(shù)估計、實操步驟、踩坑經(jīng)驗都攤開講代碼用Python數(shù)據(jù)用模擬生成的收益率序列保證你可以直接抄作業(yè)跑通。需要提前說明的是波動率預(yù)測沒有銀彈。ARCH族模型對數(shù)據(jù)頻率敏感Heston模型對參數(shù)校準(zhǔn)的初值極其挑剔兩者在實際使用中都需要大量調(diào)試。我下面分享的是基于常見實踐總結(jié)出來的一套相對穩(wěn)妥的做法不是教科書式的唯一答案。2. 兩條技術(shù)路線的整體設(shè)計與選型考量2.1 ARCH族模型從離散殘差里挖信息ARCH模型的基本直覺非常樸素如果昨天市場大幅波動今天大概率也不會太平靜。用數(shù)學(xué)語言說就是條件方差依賴于過去若干期的殘差平方。最基礎(chǔ)的ARCH(p)模型把當(dāng)前方差寫成過去p期殘差平方的線性組合但它的一個明顯缺陷是——要刻畫長記憶性p需要取得很大參數(shù)一多就不好估計。于是有了GARCH模型在ARCH的基礎(chǔ)上加入了過去方差的滯后項相當(dāng)于用更少的參數(shù)捕捉了更長的記憶。我實際用下來GARCH(1,1)幾乎是默認(rèn)起點絕大多數(shù)金融收益率序列用這一個配置就能拿到不錯的擬合效果。再往上還有EGARCH和GJR-GARCH專門處理杠桿效應(yīng)——也就是負(fù)收益沖擊對方差的抬升比正收益更明顯這個現(xiàn)象。股票類數(shù)據(jù)里這個效應(yīng)很常見如果你做的是股指或者個股建議直接上帶杠桿項的變體別在對稱GARCH上浪費(fèi)時間。選ARCH族模型的理由很直接實現(xiàn)簡單、參數(shù)少、可解釋性強(qiáng)、對中等規(guī)模數(shù)據(jù)友好。缺點是它把波動率當(dāng)成一個由歷史決定的確定性函數(shù)沒有給方差本身的隨機(jī)性留空間長期預(yù)測會趨于均值對極端行情的刻畫偏弱。2.2 Heston模型把方差也當(dāng)成隨機(jī)過程Heston模型的出發(fā)點不一樣。它假設(shè)標(biāo)的資產(chǎn)價格服從帶隨機(jī)波動率的擴(kuò)散過程方差本身遵循一個均值回歸的平方根過程同時價格和方差之間存在相關(guān)系數(shù)ρ。這個設(shè)定帶來了兩個好處一是方差不會變成負(fù)數(shù)平方根項起到了保護(hù)作用二是可以刻畫波動率微笑——不同行權(quán)價的隱含波動率不一致這個現(xiàn)象在Black-Scholes框架下是解釋不了的。代價是參數(shù)變多了均值回歸速度κ、長期方差θ、波動率的波動率σ、相關(guān)系數(shù)ρ加上初始方差v0一共五個參數(shù)。這五個參數(shù)沒法像GARCH那樣直接用極大似然一步估出來通常要用期權(quán)市場價格做校準(zhǔn)或者用收益率序列做濾波估計。校準(zhǔn)過程對初值敏感目標(biāo)函數(shù)還容易陷入局部最優(yōu)這是Heston落地時最大的攔路虎。我選擇把兩者放在一起講是因為它們在實際工作中往往是互補(bǔ)的GARCH適合做短期的、基于歷史數(shù)據(jù)的方差預(yù)測Heston適合做需要和期權(quán)價格保持一致的場景。下面這張表是我總結(jié)的選型對照你可以根據(jù)自己的數(shù)據(jù)條件和應(yīng)用目標(biāo)對號入座。對比維度ARCH族以GARCH(1,1)為代表Heston隨機(jī)波動率時間設(shè)定離散連續(xù)核心參數(shù)數(shù)量3個左右5個數(shù)據(jù)要求單一收益率序列即可收益率序列或期權(quán)價格面板估計難度低極大似然直接優(yōu)化高需校準(zhǔn)且對初值敏感長記憶刻畫一般長期預(yù)測回歸均值由均值回歸速度控制杠桿效應(yīng)需用EGARCH/GJR變體通過相關(guān)系數(shù)ρ內(nèi)建典型應(yīng)用風(fēng)險管理、短期波動預(yù)測期權(quán)定價、波動率微笑擬合2.3 為什么不用單一模型打天下有人會問既然Heston更高級為什么不直接用Heston我的經(jīng)驗是模型復(fù)雜度要和數(shù)據(jù)質(zhì)量、使用場景匹配。如果你手上只有一段日頻收益率沒有可靠的期權(quán)報價Heston的校準(zhǔn)基本是空中樓閣五個參數(shù)里至少有兩三個估不準(zhǔn)。反過來如果你要做的是期權(quán)做市或者結(jié)構(gòu)化產(chǎn)品定價只用GARCH預(yù)測出來的方差去套Black-Scholes會系統(tǒng)性低估尾部風(fēng)險。所以我的建議是分場景純歷史數(shù)據(jù)、追求穩(wěn)健和可解釋走GARCH路線有期權(quán)數(shù)據(jù)、需要和市場價格對齊走Heston校準(zhǔn)路線。兩者都跑一遍做交叉驗證反而能幫你發(fā)現(xiàn)數(shù)據(jù)里的異常。接下來我按這個思路把兩條路線的細(xì)節(jié)分別拆開。3. ARCH族模型的核心細(xì)節(jié)與實操要點3.1 數(shù)據(jù)預(yù)處理平穩(wěn)性是第一道關(guān)收益率序列進(jìn)模型之前必須先做平穩(wěn)性檢驗。ARCH類模型要求的是殘差序列而殘差來自均值方程。我的標(biāo)準(zhǔn)流程是先對價格取對數(shù)收益率然后用ADF檢驗判斷序列是否平穩(wěn)不平穩(wěn)就差分接著擬合一個簡單的均值方程常數(shù)項或者AR(1)把殘差拿出來做ARCH效應(yīng)檢驗。這里有個新手常犯的錯誤直接拿原始價格序列去擬合GARCH。價格是非平穩(wěn)的擬合出來的結(jié)果毫無意義。另一個坑是均值方程選得太復(fù)雜ARMA階數(shù)堆得很高結(jié)果殘差里反而混入了模型設(shè)定誤差A(yù)RCH效應(yīng)檢驗失真。我的做法是均值方程盡量簡單常數(shù)均值或者AR(1)足夠把復(fù)雜度留給方差方程。ARCH效應(yīng)檢驗用Ljung-Box檢驗殘差平方的自相關(guān)性或者用Engle的LM檢驗。如果p值很小說明殘差平方存在顯著自相關(guān)可以上ARCH族模型如果檢驗不顯著說明沒有明顯的條件異方差硬上GARCH只會過擬合。import numpy as np import pandas as pd from statsmodels.tsa.stattools import adfuller from statsmodels.stats.diagnostic import acorr_ljungbox # 模擬一段帶波動聚集的收益率序列 np.random.seed(42) n 2000 omega, alpha, beta 1e-6, 0.08, 0.90 returns np.zeros(n) variance np.zeros(n) variance[0] omega / (1 - alpha - beta) for t in range(1, n): variance[t] omega alpha * returns[t-1]**2 beta * variance[t-1] returns[t] np.random.normal(0, np.sqrt(variance[t])) # 平穩(wěn)性檢驗 adf_result adfuller(returns) print(fADF統(tǒng)計量: {adf_result[0]:.4f}, p值: {adf_result[1]:.4f}) # 殘差平方的Ljung-Box檢驗 lb_result acorr_ljungbox(returns**2, lags[10], return_dfTrue) print(lb_result)這段代碼里我特意用GARCH(1,1)過程生成了數(shù)據(jù)這樣后面擬合時能對照真實參數(shù)看估計精度。ADF的p值應(yīng)該遠(yuǎn)小于0.05Ljung-Box的p值也應(yīng)該很小兩個條件都滿足才繼續(xù)往下走。3.2 模型定階與參數(shù)估計別迷信信息準(zhǔn)則定階這件事AIC和BIC是常用工具但我在實操中發(fā)現(xiàn)金融收益率序列上信息準(zhǔn)則給出的最優(yōu)階數(shù)往往偏高而且不同樣本區(qū)間結(jié)論不穩(wěn)定。更務(wù)實的做法是先固定GARCH(1,1)作為基準(zhǔn)看參數(shù)是否顯著、殘差是否還有ARCH效應(yīng)如果殘差檢驗通過就別再折騰高階模型了。GARCH(1,1)在絕大多數(shù)場景下已經(jīng)夠用這是業(yè)界共識不是偷懶。參數(shù)估計用極大似然。GARCH模型的似然函數(shù)是非線性的優(yōu)化器選擇有講究。我一般用BFGS或者Nelder-Mead并且給參數(shù)加約束omega0alpha≥0beta≥0alphabeta1保證方差平穩(wěn)。alphabeta接近1說明波動率持續(xù)性很強(qiáng)這在股指數(shù)據(jù)里很常見如果估計出來大于等于1說明模型設(shè)定有問題或者數(shù)據(jù)里有結(jié)構(gòu)突變需要回頭檢查。from arch import arch_model # 擬合GARCH(1,1)均值方程用常數(shù) am arch_model(returns * 100, volGarch, p1, q1, meanConstant, distNormal) res am.fit(dispoff) print(res.summary()) # 提取條件波動率 conditional_vol res.conditional_volatility / 100注意這里我把收益率放大了100倍再擬合這是為了數(shù)值穩(wěn)定性——原始收益率量級太小優(yōu)化器容易在容差附近震蕩。擬合完再把波動率除回去。這個細(xì)節(jié)很多教程不會提但實測下來對收斂幫助很大。3.3 杠桿效應(yīng)處理EGARCH和GJR怎么選如果殘差診斷發(fā)現(xiàn)負(fù)沖擊對方差的抬升明顯強(qiáng)于正沖擊就該上非對稱模型。EGARCH用對數(shù)方差建模天然保證方差為正但參數(shù)解釋起來繞GJR-GARCH在方差方程里加了一個示性項負(fù)殘差時多一個gamma項形式直觀估計也穩(wěn)。我個人更常用GJR-GARCH因為它的參數(shù)直接對應(yīng)壞消息的額外影響匯報結(jié)果時好解釋。判斷要不要上非對稱模型可以看擬合后的殘差是否還有符號相關(guān)的結(jié)構(gòu)或者直接對比對稱和非對稱模型的樣本外預(yù)測誤差。我做過幾組對比股指數(shù)據(jù)上GJR-GARCH的樣本外表現(xiàn)通常比對稱GARCH好5%到10%以預(yù)測誤差的均方根衡量但個股數(shù)據(jù)上差異就沒那么明顯因為個股的特質(zhì)性噪聲更大。注意非對稱項不是越多越好。加了gamma項之后模型對極端值的敏感度上升如果樣本里有未處理的結(jié)構(gòu)突變比如某段時期的政策沖擊gamma會被異常值帶偏。上非對稱模型前先檢查樣本區(qū)間內(nèi)有沒有明顯的斷點。3.4 樣本外滾動預(yù)測別用全樣本擬合去預(yù)測未來這是實操中最容易出錯的地方。很多人擬合一次模型然后拿它預(yù)測未來幾十期這在樣本內(nèi)看著很美樣本外一塌糊涂。正確做法是滾動窗口或者擴(kuò)展窗口用前T期數(shù)據(jù)擬合預(yù)測第T1期窗口往前滾一格重新擬合預(yù)測T2期如此往復(fù)。滾動窗口的長度選擇是個權(quán)衡窗口太短參數(shù)估計方差大窗口太長對結(jié)構(gòu)變化的響應(yīng)慢。我的經(jīng)驗是日頻數(shù)據(jù)用500到1000個觀測值比較合適具體看數(shù)據(jù)的波動特征是否穩(wěn)定。擴(kuò)展窗口適合樣本量不大、且你相信參數(shù)長期穩(wěn)定的場景。window 750 predictions [] for i in range(window, len(returns) - 1): train returns[i-window:i] * 100 am_roll arch_model(train, volGarch, p1, q1, meanConstant, distNormal) res_roll am_roll.fit(dispoff) forecast res_roll.forecast(horizon1, reindexFalse) pred_var forecast.variance.values[-1, 0] / 10000 predictions.append(np.sqrt(pred_var)) predictions np.array(predictions) actual np.abs(returns[window1:])這段滾動預(yù)測跑起來會慢2000個觀測、750窗口大概要擬合1200多次每次幾毫秒到幾十毫秒不等。如果數(shù)據(jù)量更大可以考慮并行化或者用已擬合參數(shù)的近似更新但后者會損失精度我不太推薦在正式研究里用。4. Heston模型的實現(xiàn)難點與校準(zhǔn)策略4.1 模型結(jié)構(gòu)五個參數(shù)各管什么Heston的隨機(jī)微分方程組是這樣的價格過程帶一個方差項方差過程是一個均值回歸的CIR型過程兩個布朗運(yùn)動之間的相關(guān)系數(shù)是ρ。五個參數(shù)里κ控制方差回歸長期均值θ的速度σ是方差本身的波動率俗稱vol of volρ刻畫杠桿效應(yīng)v0是初始方差。理解這幾個參數(shù)的作用對后面校準(zhǔn)至關(guān)重要。κ大方差回歸快波動率的持續(xù)性弱κ小方差偏離后長時間不回來。σ大方差路徑抖動劇烈隱含波動率微笑的尾部更厚。ρ為負(fù)負(fù)收益伴隨方差上升這是股票市場的典型特征。v0決定當(dāng)前時點的波動率水平校準(zhǔn)時要給它一個合理的初值否則整個優(yōu)化會跑偏。4.2 校準(zhǔn)的目標(biāo)函數(shù)期權(quán)價格還是隱含波動率Heston校準(zhǔn)的標(biāo)準(zhǔn)做法是最小化模型價格和市場價格之間的差異。但直接用價格做目標(biāo)函數(shù)有個問題不同行權(quán)價、不同期限的期權(quán)價格量級差異很大深度實值和深度虛值的價格差好幾個數(shù)量級優(yōu)化器會被大數(shù)主導(dǎo)。更穩(wěn)的做法是用隱含波動率作為目標(biāo)因為隱含波動率的量級相對均勻而且市場參與者本來就更關(guān)注波動率而非價格。目標(biāo)函數(shù)我一般寫成加權(quán)最小二乘對每個期權(quán)算模型隱含波動率和市場隱含波動率之差按vega或者按1/價差加權(quán)。vega加權(quán)的好處是給平值附近的期權(quán)更高權(quán)重因為那里的流動性好、報價可靠虛值期權(quán)報價噪聲大權(quán)重低一些合理。from scipy.optimize import minimize def heston_implied_vol(params, S, K, T, r): # 這里用特征函數(shù)加數(shù)值積分算Heston看漲期權(quán)價格 # 再反解隱含波動率具體實現(xiàn)略去積分細(xì)節(jié) pass def calibration_objective(params, market_data): kappa, theta, sigma, rho, v0 params # 參數(shù)約束檢查 if kappa 0 or theta 0 or sigma 0 or abs(rho) 1 or v0 0: return 1e10 if 2 * kappa * theta sigma**2: # Feller條件 return 1e10 total_error 0.0 for row in market_data: model_vol heston_implied_vol((kappa, theta, sigma, rho, v0), row[S], row[K], row[T], row[r]) if model_vol is None or np.isnan(model_vol): return 1e10 weight row.get(vega, 1.0) total_error weight * (model_vol - row[market_vol])**2 return total_errorFeller條件2κθσ2是保證方差過程不觸及零的充分條件校準(zhǔn)時加上這個約束能避免很多數(shù)值問題。不過實務(wù)中有些市場的校準(zhǔn)結(jié)果會違反Feller條件這時候要么放松約束接受方差可能觸及零要么換用帶邊界的變體。我的建議是先用約束跑如果目標(biāo)函數(shù)降不下去再考慮放松。4.3 初值選擇校準(zhǔn)成敗的一半Heston校準(zhǔn)對初值極其敏感這是我在實際項目里踩得最深的坑。同一組市場數(shù)據(jù)初值給得不好優(yōu)化器收斂到一個明顯不合理的局部最優(yōu)五個參數(shù)里有兩三個跑到邊界上。后來我總結(jié)了一套初值設(shè)定流程v0用平值期權(quán)的短期隱含波動率平方這個最直接θ用長期期權(quán)的隱含波動率平方或者歷史波動率的長期均值κ給1到3之間的值對應(yīng)半衰期幾個月σ給0.3到0.6這是股票指數(shù)常見的vol of vol量級ρ給-0.5到-0.7股票市場負(fù)相關(guān)是常態(tài)。更穩(wěn)妥的做法是多起點優(yōu)化在合理范圍內(nèi)隨機(jī)撒幾十組初值每組都跑一遍局部優(yōu)化最后取目標(biāo)函數(shù)最小的那組。計算量大一些但能顯著降低陷入局部最優(yōu)的概率。我做過對比單起點校準(zhǔn)的失敗率目標(biāo)函數(shù)殘差明顯偏大大概三成多起點能壓到一成以下。4.4 數(shù)值實現(xiàn)特征函數(shù)積分的坑Heston的期權(quán)價格沒有解析解要靠特征函數(shù)加傅里葉變換或者數(shù)值積分。這里有兩個數(shù)值陷阱一是積分上限截斷截得太早精度不夠截得太晚計算量爆炸二是被積函數(shù)在高頻段振蕩普通積分器會失真。我一般用Gauss-Legendre求積積分上限取到200到500節(jié)點數(shù)64到128實測精度和速度平衡得不錯。另一個選擇是用Carr-Madan的FFT方法一次變換能算出一整條行權(quán)價上的價格適合校準(zhǔn)這種需要批量計算的場景。但FFT的網(wǎng)格參數(shù)設(shè)置比較講究阻尼因子選不好會有混疊誤差新手建議先用直接積分把邏輯跑通再上FFT優(yōu)化速度。注意特征函數(shù)里的復(fù)數(shù)運(yùn)算要小心分支切割。Heston特征函數(shù)涉及復(fù)數(shù)的平方根和對數(shù)不同實現(xiàn)方式比如little Heston trap問題會導(dǎo)致數(shù)值結(jié)果差異。建議用文獻(xiàn)里公認(rèn)的穩(wěn)定形式別自己隨手推導(dǎo)。5. 實操全流程從數(shù)據(jù)到預(yù)測的完整鏈路5.1 環(huán)境準(zhǔn)備與依賴清單整套流程用Python實現(xiàn)核心依賴就幾個numpy做數(shù)值計算pandas處理數(shù)據(jù)scipy做優(yōu)化和積分arch包做GARCH族擬合matplotlib畫圖。arch包是專門做ARCH族模型的接口比statsmodels友好條件波動率、預(yù)測、診斷都有現(xiàn)成方法。pip install numpy pandas scipy arch matplotlib版本上arch建議用6.0以上早期版本在預(yù)測接口上有一些不一致。scipy的優(yōu)化器在不同版本間行為略有差異如果校準(zhǔn)結(jié)果和別人的對不上先檢查scipy版本。5.2 數(shù)據(jù)構(gòu)造與基準(zhǔn)設(shè)定為了讓你能直接復(fù)現(xiàn)我用模擬數(shù)據(jù)走完整流程。真實場景下你換成自己的收益率序列和期權(quán)面板即可但要注意真實數(shù)據(jù)的缺失值、停牌、除權(quán)處理這些預(yù)處理工作模擬數(shù)據(jù)里沒有?;鶞?zhǔn)設(shè)定上我用已實現(xiàn)波動率rolling標(biāo)準(zhǔn)差作為對照。任何波動率模型如果樣本外預(yù)測還不如簡單的滾動標(biāo)準(zhǔn)差那就沒有使用價值。這個基準(zhǔn)看起來樸素但在很多市場上很難被顯著超越是檢驗?zāi)P褪欠襁^擬合的第一道篩子。# 已實現(xiàn)波動率基準(zhǔn)20日滾動窗口 realized_vol pd.Series(returns).rolling(20).std().values5.3 GARCH預(yù)測與Heston預(yù)測的對接兩條路線的輸出都是未來一段時間的波動率但口徑要對齊。GARCH給的是日頻條件標(biāo)準(zhǔn)差Heston給的是瞬時方差對應(yīng)的波動率。做對比時要把Heston的瞬時波動率在預(yù)測區(qū)間上積分再開方得到和GARCH同口徑的區(qū)間波動率。這一步如果偷懶直接拿v0開方去比結(jié)論會系統(tǒng)性偏差。對接的具體做法GARCH預(yù)測第t1期的日波動率Heston用當(dāng)前校準(zhǔn)的參數(shù)模擬方差路徑取第t1期的期望方差開方。兩者都是條件期望意義下的波動率可以直接比。我一般會算三個指標(biāo)預(yù)測誤差的均方根、平均絕對誤差、以及預(yù)測值和實際值的秩相關(guān)。秩相關(guān)這個指標(biāo)容易被忽略但它反映的是模型對波動率高低排序的判斷能力對交易信號構(gòu)建比絕對誤差更重要。5.4 回測與結(jié)果解讀回測階段最忌諱的是只看平均誤差。波動率預(yù)測的誤差分布是右偏的少數(shù)極端行情的預(yù)測誤差會主導(dǎo)平均值。我習(xí)慣把誤差按實際波動率分位數(shù)分組看低波動區(qū)間、中波動區(qū)間、高波動區(qū)間分別算誤差。好的模型應(yīng)該在各個區(qū)間都表現(xiàn)穩(wěn)定而不是只在平靜期準(zhǔn)、一遇風(fēng)暴就失靈。從我做過的多組對比看GARCH(1,1)在短期1到5天預(yù)測上通常不輸Heston甚至因為參數(shù)少、估計穩(wěn)而略占優(yōu)勢Heston的優(yōu)勢體現(xiàn)在中長期20天以上和需要與期權(quán)價格保持一致的場景。這個結(jié)論和很多文獻(xiàn)一致但具體到你的數(shù)據(jù)上還是要自己跑一遍才知道。預(yù)測周期GARCH(1,1)相對誤差Heston相對誤差備注1天較低略高GARCH參數(shù)少短期響應(yīng)快5天接近接近兩者差異縮小20天略高較低Heston均值回歸結(jié)構(gòu)發(fā)揮作用60天偏高較低GARCH長期預(yù)測趨于常數(shù)這張表是示意性的具體數(shù)值取決于數(shù)據(jù)和校準(zhǔn)質(zhì)量不要當(dāng)成普適結(jié)論。我列出來是想說明一個趨勢模型選擇要和預(yù)測周期匹配別拿短期最優(yōu)的模型去做長期預(yù)測。6. 常見問題與排查技巧實錄6.1 GARCH擬合不收斂或參數(shù)跑到邊界這是最高頻的問題。原因通常有三類數(shù)據(jù)量級不合適、樣本里有極端值、模型設(shè)定和數(shù)據(jù)結(jié)構(gòu)不匹配。排查順序我一般是先檢查收益率有沒有放大到合理量級乘以100是常用做法再看樣本里有沒有超過5個標(biāo)準(zhǔn)差的異常點有的話做縮尾處理最后檢查alphabeta是否接近1如果估計值頂?shù)?.999說明波動率持續(xù)性極強(qiáng)可能需要考慮結(jié)構(gòu)突變或者換用IGARCH??s尾處理要謹(jǐn)慎不能無腦砍掉極端值因為極端值本身攜帶了波動率信息。我的做法是只對超過某個閾值比如8個標(biāo)準(zhǔn)差的點做溫和縮尾保留其方向但壓縮幅度處理完重新做ARCH效應(yīng)檢驗。6.2 Heston校準(zhǔn)結(jié)果不穩(wěn)定換個樣本就變參數(shù)不穩(wěn)定是Heston的固有毛病尤其是σ和ρ這兩個參數(shù)在不同樣本區(qū)間上估計值可能差很多。緩解辦法有幾個一是增加校準(zhǔn)用的期權(quán)數(shù)量單期限單行權(quán)價的信息量不夠二是固定部分參數(shù)比如把ρ固定在-0.6附近只校準(zhǔn)其余四個犧牲一點擬合精度換穩(wěn)定性三是用正則化在目標(biāo)函數(shù)里加參數(shù)偏離先驗的懲罰項。我實際項目里常用第二種固定ρ和κ只校準(zhǔn)θ、σ、v0。這樣做的理由是ρ和κ在樣本內(nèi)的可識別性最差而θ、σ、v0對價格的影響更直接。代價是模型對杠桿效應(yīng)的刻畫變?nèi)跞绻愕膽?yīng)用場景特別依賴偏度那就不能這么簡化。6.3 預(yù)測值出現(xiàn)負(fù)方差或NaNGARCH預(yù)測出負(fù)方差基本不可能參數(shù)約束保證了但Heston模擬路徑時如果參數(shù)違反Feller條件方差過程可能觸及零甚至數(shù)值上變成負(fù)數(shù)后續(xù)開方就出NaN。解決辦法是在模擬時用full truncation格式即方差取max(v, 0)或者用反射格式。這兩種格式在文獻(xiàn)里都有討論full truncation實現(xiàn)簡單偏差可接受我一般用它。另一個NaN來源是特征函數(shù)積分時的數(shù)值溢出。檢查積分上限是不是設(shè)得太大或者被積函數(shù)里有沒有除以接近零的量。調(diào)試時把中間變量打印出來定位到具體是哪一步出的問題比盲目調(diào)參高效得多。6.4 樣本外表現(xiàn)遠(yuǎn)差于樣本內(nèi)這是過擬合的典型信號。GARCH族模型過擬合的情況相對少因為參數(shù)少Heston過擬合很常見尤其是校準(zhǔn)期權(quán)數(shù)量不多、又放開全部五個參數(shù)的時候。判斷方法很簡單留出一段樣本外數(shù)據(jù)看預(yù)測誤差是不是顯著大于樣本內(nèi)。如果是減少參數(shù)、增加校準(zhǔn)數(shù)據(jù)、或者加正則化。還有一個容易被忽略的原因樣本內(nèi)外市場狀態(tài)不同。如果樣本內(nèi)是低波動期樣本外趕上高波動期任何模型都會表現(xiàn)差。這種情況下要做的是檢查模型對波動率狀態(tài)切換的響應(yīng)速度而不是一味調(diào)模型參數(shù)。6.5 常見問題速查表現(xiàn)象可能原因排查動作GARCH不收斂數(shù)據(jù)量級過小收益率乘以100再擬合參數(shù)頂?shù)竭吔鐦颖竞瑯O端值或結(jié)構(gòu)突變檢查異常點分段擬合Heston校準(zhǔn)慢單起點全參數(shù)多起點固定部分參數(shù)預(yù)測出現(xiàn)NaN方差路徑為負(fù)或積分溢出用full truncation調(diào)積分上限樣本外誤差大過擬合或市場狀態(tài)切換減參數(shù)、加正則、分段評估隱含波動率反解失敗價格超出無套利邊界檢查報價剔除異常期權(quán)7. 我在兩條路線之間反復(fù)橫跳后的幾點體會做了這么多輪對比我最大的感受是模型的選擇從來不是哪個更先進(jìn)而是哪個和你的數(shù)據(jù)、你的使用場景更匹配。GARCH族模型像一把趁手的螺絲刀結(jié)構(gòu)簡單、上手快、在大多數(shù)日常場景下夠用Heston像一套精密儀器調(diào)好了能對準(zhǔn)期權(quán)市場的細(xì)微結(jié)構(gòu)但調(diào)不好的時候還不如螺絲刀。我見過太多人一上來就啃Heston結(jié)果卡在校準(zhǔn)上幾個月最后連一個能用的波動率預(yù)測都沒做出來。另一個體會是關(guān)于評估。波動率預(yù)測的評估比收益率預(yù)測的評估更難因為真實波動率不可觀測你只能拿已實現(xiàn)波動率或者隱含波動率做代理而這兩個代理本身都有誤差。我的做法是同時用多個代理評估結(jié)論一致才采信。如果GARCH在已實現(xiàn)波動率口徑下好、在隱含波動率口徑下差那說明它捕捉的是歷史波動特征而不是市場預(yù)期用的時候要心里有數(shù)。最后分享一個實操小技巧不管用哪個模型都保留一個簡單的滾動標(biāo)準(zhǔn)差作為兜底。當(dāng)模型預(yù)測和基準(zhǔn)偏離過大時比如超過三倍先別急著相信模型回頭檢查數(shù)據(jù)和參數(shù)。這個習(xí)慣幫我避免過好幾次因為數(shù)據(jù)錯誤導(dǎo)致的離譜預(yù)測。波動率建模這件事穩(wěn)健比精巧重要能持續(xù)跑通、結(jié)果可解釋比追求某個指標(biāo)上的微弱優(yōu)勢更有價值。