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