ARK · 金融機器學習CHAPTER 14 / 19

CHAPTER 14 / 19 · PART 4 · 量化金融實務

隨機模型與風險中性定價

Stochastic Models & Risk-Neutral Pricing

定價不靠預測:無套利與複製撐起風險中性測度,隨機模型各自修補一項市場事實。

§01學習重點

§02課程內容

一、兩個世界:預測的世界與定價的世界

第 10 章我們見過一件奇事:QLBS 用 Q-learning 從模擬資料裡同時解出選擇權的價格與對沖,而教科書上的 Black-Scholes 公式退位成它在「連續重平衡、零風險趨避」極限下的角落特例。當時我們把 BS 當成一個已知的對照組在用。本章回頭把這個對照組的地基挖開:BS 到底站在什麼理論上?為什麼一條定價公式裡看不到任何「對明天漲跌的看法」?

答案藏在一個常被初學者忽略的分界線上。量化金融其實住著兩個平行世界,用的機率不是同一套。

實體測度 \(\mathbb{P}\) 是「真實世界的機率」:明天上漲的真實可能性、報酬的真實分布。買方機構——基金、自營、資產管理——活在這個世界,他們的工作是預測:用歷史資料估計報酬分布,找出勝率偏向自己的部位,長期下來把優勢累積成損益。本課程第一到第三部教的所有機器學習,本質上都是 \(\mathbb{P}\) 世界的武器:監督式學習預測報酬、時序模型預測波動、強化學習學交易政策,全部以「猜得準」為榮。

風險中性測度 \(\mathbb{Q}\) 則是「定價專用的記帳機率」。衍生性商品的賣方——投資銀行的交易台——活在這個世界。他們的工作不是預測,而是開價:客戶要買一張三個月後到期的台指買權,交易台現在就要報出一個數字。神奇的是,這個數字的計算過程完全不需要「大盤三個月後漲的機率」。為什麼可以不需要?因為賣方報完價不是坐著等開獎——他會立刻用標的資產把自己的風險對沖掉。只要對沖(更精確地說:複製)做得到,漲跌就與他無關;而做這件事的成本,就是他該收的價格。

比喻: 運動彩券的莊家開賠率時,並不是在預測哪隊會贏。他的目標是讓兩邊的押注金額互相平衡——A 隊贏就用 B 隊押金賠付,反之亦然——自己穩收抽成。所以賠率反映的不是「勝率的預測」,而是「把自己風險軋平的成本結構」。把賠率倒數換算成的那組機率,就是莊家世界的 \(\mathbb{Q}\):一組為了記帳而存在的機率。真正的勝率 \(\mathbb{P}\) 是分析師和賭客關心的事,莊家可以完全不表態。

這條分界線威力極大。\(\mathbb{P}\) 世界的預測是全金融業最難的問題——市場接近有效,訊號微弱、雜訊震天。而 \(\mathbb{Q}\) 世界繞開了它:定價的正確性不建立在預測準確上,只建立在「複製做不做得到」上。這也解釋了為什麼衍生性商品定價理論在 1970 年代就大致完工,而報酬預測到今天仍是機器學習的未竟之業——兩者根本不是同一道題。

本章路線圖:第二節把「複製」講到底,在二項樹上親手做一次無套利定價;第三、四節裝備最小限度的隨機微積分,搭出幾何布朗運動;第五節雙軌推 Black-Scholes;第六節巡禮 GBM 之後的模型家族,看每個模型各自修補哪個市場事實;第七、八節談校準與模型風險——\(\mathbb{Q}\) 世界的參數從哪來、什麼時候會騙你。

二、無套利與複製:一價定律的白話

套利是「不承擔風險、不動用淨資金,卻能鎖定利潤」的交易。無套利原則說:市場上這種機會不存在——就算短暫出現,也會被交易者立刻吃掉,價格隨即回到均衡。它是整個定價理論唯一的公理,其餘一切都是推論。

無套利的第一個推論是一價定律:兩個未來現金流完全相同的東西,今天必須同價。若不同價,買便宜的、賣貴的,到期現金流互相抵銷,價差就是無風險利潤——與無套利矛盾。

比喻: 一座組合櫃在賣場標價 8,000 元,而它的全部零件——板材、五金、層架——散買總共只要 6,500 元,而且組裝不花力氣。那麼任何人都可以買零件、組起來、用 7,900 元賣給想買櫃子的人,穩賺不賠。這種好事不會持久:要嘛櫃子跌價、要嘛零件漲價,直到「成品價=零件組合價」為止。衍生性商品就是那座組合櫃——如果它的 payoff 能用更簡單的零件(股票+現金)拼出來,它的價格就被零件價格鎖死,跟「你多喜歡這座櫃子」(真實機率、風險偏好)毫無關係。

把這件事做成一個最小可運轉的例子。股價今天 80 元,一年後只有兩種可能:漲到 100 元或跌到 64 元。無風險利率 3%。要為一張履約價 85 元的買權定價:到期時,股價 100 元則買權值 15 元,股價 64 元則一文不值。

複製的做法:找一個「持有 \(\Delta\) 股股票+存 \(B\) 元現金」的組合,讓它在兩種未來都跟買權的 payoff 一模一樣。兩個未知數、兩個狀態、兩條方程式:

$$ \Delta \cdot 100 + B e^{r} = 15, \qquad \Delta \cdot 64 + B e^{r} = 0 $$

逐項拆解:左式是「漲」的世界裡組合的價值——股票部位值 \(\Delta \times 100\),現金滾了一年利息變成 \(Be^{r}\)——要求它等於買權在該世界的 payoff 15 元;右式是「跌」的世界,同理對齊 0。兩式相減得 \(\Delta = 15/36 \approx 0.4167\)(每張買權用約 0.42 股對沖),代回得 \(B \approx -25.88\)——負號表示借錢。組合今天的成本 \(\Delta \cdot 80 + B \approx 7.45\) 元,就是買權唯一的無套利價格:貴了就賣買權、買組合;便宜了反向操作。

現在看魔術的另一面。把定價式整理一下,可以改寫成「期望值」的樣子:

$$ c_0 = e^{-r\Delta t}\left[\, q\, c_u + (1-q)\, c_d \,\right], \qquad q = \frac{e^{r\Delta t} - d}{u - d} $$

逐項拆解:\(c_u, c_d\) 是上下兩個世界的 payoff;\(u=1.25\)、\(d=0.8\) 是上漲與下跌倍數;\(q\) 是一個由 \(u\)、\(d\)、\(r\) 純機械算出來的權重,本例約 0.512;整條式子讀作「用 \(q\) 當機率算 payoff 的期望值,再用無風險利率折現」。這個 \(q\) 就是風險中性機率——注意它的出身:它不是任何人對漲跌的預測,而是複製組合的成本換了一種記法。真實的上漲機率 \(p\) 從頭到尾沒有出現。用代碼把這兩面對質一次:

PYTHON
import math

S0, u, d = 80.0, 1.25, 0.8        # 今天 80 元,一年後 100 元或 64 元
K, r, dt = 85.0, 0.03, 1.0        # 履約價 85 元,無風險利率 3%
R = math.exp(r * dt)
cu, cd = max(u * S0 - K, 0), max(d * S0 - K, 0)   # payoff: 15 與 0

# 路一:複製組合(解兩條線性方程)
Delta = (cu - cd) / (u * S0 - d * S0)
B = (cd - Delta * d * S0) / R
cost = Delta * S0 + B
print(f"Delta = {Delta:.4f}, 借款 B = {B:.4f}, 複製成本 = {cost:.4f}")
# 輸出:Delta = 0.4167, 借款 B = -25.8785, 複製成本 = 7.4548

# 路二:風險中性期望
q = (R - d) / (u - d)
price_q = math.exp(-r * dt) * (q * cu + (1 - q) * cd)
print(f"q = {q:.4f}, 風險中性定價 = {price_q:.4f}")
print(f"兩者差 = {abs(cost - price_q):.2e}")
# 輸出:q = 0.5121, 風險中性定價 = 7.4548
# 輸出:兩者差 = 2.66e-15

# 真實機率 p 完全不影響價格——因為它根本不在式子裡
for p in (0.3, 0.5, 0.9):
    print(f"真實 P(上漲) = {p} -> 價格仍是 {cost:.4f}")

兩條路差 \(2.66\times 10^{-15}\)——浮點精度極限,數學上同一個數。這個小例子就是資產定價第一基本定理的縮影:市場無套利,若且唯若存在一個風險中性測度 \(\mathbb{Q}\),使得任何可複製商品的價格都等於「payoff 在 \(\mathbb{Q}\) 下的期望值折現」:

$$ p_0 = e^{-rT}\, \mathbb{E}^{\mathbb{Q}}\!\left[\, V(S_T) \,\right] $$

逐項拆解:\(V(S_T)\) 是到期 payoff(買權就是 \(\max(S_T-K,0)\));期望值上標 \(\mathbb{Q}\) 提醒你機率是記帳用的那套、不是真實那套;\(e^{-rT}\) 用無風險利率折現——不用加風險溢酬,因為風險已經被複製策略消掉了,這正是「風險中性」四個字的意思。順帶一提,還有一個雙世界共用的關鍵字:在 \(\mathbb{Q}\) 之下,折現後的股價是一個(martingale)——條件期望等於現值,沒有可預測的超額漂移。作業二會請你親手驗證這件事。

多提醒一句實務語感:把 \(q\approx 0.512\) 讀成「市場認為漲跌各半」是常見誤讀。\(q\) 偏離真實機率的程度,反映的是風險溢酬——投資人願意為「壞狀態的一塊錢」付更高價格,於是壞狀態在 \(\mathbb{Q}\) 裡被「加權放大」。\(\mathbb{P}\) 與 \(\mathbb{Q}\) 的差,本身就是市場風險偏好的地圖,這也是第 16 章從選擇權價格反推市場預期時要用的視角。

三、布朗運動:隨機微積分的最小裝備

二項樹一期只有兩種未來,真實價格卻是連續刷新的。把樹的步長切細、步數加多,極限就是連續時間的隨機過程。這一節裝備三樣最小限度的工具——夠用就好,嚴格證明留給教科書。

工具一:布朗運動 \(W_t\)。 想像一個每步 \(\pm 1\) 的公平隨機漫步,把時間切成 \(n\) 步、每步縮成 \(1/\sqrt{n}\),讓 \(n\to\infty\)。極限就是布朗運動:起點為零;任兩時點間的增量服從常態分布 \(W_t - W_s \sim \mathcal{N}(0,\, t-s)\);不重疊的增量彼此獨立。變異數等於時間長度——這是縮放係數取 \(1/\sqrt{n}\) 的原因:只有這個縮放,讓「一年的不確定性」不隨你把一年切成幾步而改變。

工具二:處處連續、處處不可微。 布朗路徑連在一起(沒有跳空),但放大任何一段,看到的都是同樣鋸齒——它在每一個點都像絕對值函數在原點那樣「折」著,沒有切線可言。這不是數學家的潔癖,而是有實際後果的:普通微積分靠「局部近似成直線」運作,對一條永遠不直的路徑,整套鏈鎖律都要重修。

工具三:二次變差。 把 \([0,T]\) 切成 \(n\) 小段,把每段增量的平方加總。對任何平滑函數,這個和隨 \(n\to\infty\) 收斂到 0(每段增量約 \(\Delta t\) 量級,平方後是 \(\Delta t^2\),加總後仍趨於零)。但布朗運動不同:每段增量是 \(\sqrt{\Delta t}\) 量級,平方後恰是 \(\Delta t\) 量級,加總後收斂到 \(T\) 本身。記成一條操作規則:

$$ dW_t\, dW_t = dt $$

逐項拆解:左邊是「布朗增量的平方」,右邊是「流逝的時間」;意思是布朗增量的平方不是可忽略的高階小量,而是一階的、確定的 \(dt\)。與之對照,\(dt\cdot dt\) 與 \(dt\cdot dW_t\) 都是真正的高階小量,可以照常丟掉。

比喻: 量一段平滑的公路,用一公里的尺量和用一公尺的尺量,結果幾乎一樣——平滑曲線沒有藏細節。量一段碎形海岸線就不同了:尺越短,量出來的長度越長,因為每次放大都冒出新的鋸齒。布朗路徑就是那條海岸線。而二次變差是海岸線世界裡罕見的「守恆量」:鋸齒的平方和不發散也不歸零,恰好等於你走過的時間。整套隨機微積分,就是為了把這個守恆量記進帳本而重寫的微積分。

三樣工具就位,主定理只有一條。Itô 引理(使用法版本):設 \(S_t\) 服從 \(dS_t = \mu(S_t,t)\,dt + \sigma(S_t,t)\,dW_t\),你關心它的函數 \(f(S_t, t)\),那麼

$$ df = \frac{\partial f}{\partial t}\,dt + \frac{\partial f}{\partial S}\,dS_t + \frac{1}{2}\frac{\partial^2 f}{\partial S^2}\,\sigma^2(S_t,t)\,dt $$

逐項拆解:前兩項就是普通微積分的鏈鎖律——時間變一點、\(S\) 變一點,\(f\) 跟著變;第三項是Itô 修正項,整套理論的心臟:因為 \(dS^2\) 裡含有 \(dW^2 = dt\),泰勒展開的二階項升格成一階量,丟不得。使用心法就一句:對隨機過程做泰勒展開時,多留一個二階項,並把 \(dW^2\) 換成 \(dt\)。凸函數(\(\partial^2 f/\partial S^2 > 0\))在震盪中平均而言被「往上推」,凹函數被「往下拉」——這個效應在下一節馬上兌現成一個著名的 \(-\sigma^2/2\)。

四、幾何布朗運動:金融的預設隨機模型

有了布朗運動當亂源,就能寫隨機微分方程(SDE)來描述價格。金融最常用的一條,是把「報酬率」而非「價格」設成常態:

$$ dS_t = \mu S_t\, dt + \sigma S_t\, dW_t $$

逐項拆解:兩邊同除 \(S_t\) 更好讀——\(dS_t/S_t\) 是瞬間報酬率,等於固定漂移 \(\mu\,dt\) 加上波動 \(\sigma\,dW_t\);波動項帶著 \(S_t\),表示 \(\sigma\) 是百分比波動率:股價 80 元漲跌的元數自然比 8 元時大十倍,但報酬率的震盪幅度不變。價格永遠不會變負——跌得越低、絕對波動越小,像有個地板煞車。這就是幾何布朗運動(GBM)。在 \(\mathbb{Q}\) 世界定價時,把 \(\mu\) 換成 \(r\):上一節說過,複製消掉風險後,所有資產在記帳世界裡都只賺無風險利率。

對 \(f = \log S_t\) 用一次 Itô 引理(這是 Itô 最經典的練習:一階導 \(1/S\)、二階導 \(-1/S^2\),代入後波動項的平方貢獻出一個常數),可以把 SDE 解出來:

$$ S_T = S_0 \exp\!\left[\left(r - \tfrac{1}{2}\sigma^2\right) T + \sigma W_T\right] $$

逐項拆解:指數裡是一個常態隨機變數——均值 \((r-\sigma^2/2)T\)、標準差 \(\sigma\sqrt{T}\)——所以 \(\log S_T\) 服從常態、\(S_T\) 服從對數常態分布。最值得盯住的是 \(-\sigma^2/2\):它正是 Itô 修正項的帳單。白話:\(\log\) 是凹函數,震盪平均而言把它往下拉,波動越大拉得越兇;若少了這項,\(\mathbb{E}[S_T]\) 就不再等於 \(S_0 e^{rT}\),折現股價就不是鞅,記帳就出錯。完整推導在原書 pp.42–44,此處不展開。

用模擬驗證這一切不是空話:

PYTHON
import numpy as np, math

rng = np.random.default_rng(14)
S0, r, sigma, T = 80.0, 0.03, 0.25, 1.0
n_steps, n_paths = 252, 100_000
dt = T / n_steps

Z = rng.standard_normal((n_paths, n_steps))
logret = (r - 0.5 * sigma**2) * dt + sigma * math.sqrt(dt) * Z
ST = S0 * np.exp(logret.sum(axis=1))          # 十萬條路徑的終端價
logST = np.log(ST)

m_th = math.log(S0) + (r - 0.5 * sigma**2) * T
s_th = sigma * math.sqrt(T)
print(f"log S_T 平均:模擬 {logST.mean():.4f} vs 理論 {m_th:.4f}")
print(f"log S_T 標準差:模擬 {logST.std():.4f} vs 理論 {s_th:.4f}")
print(f"E[S_T]:模擬 {ST.mean():.4f} vs 理論 S0*e^rT = {S0 * math.exp(r * T):.4f}")
# 輸出:log S_T 平均:模擬 4.3800 vs 理論 4.3808
# 輸出:log S_T 標準差:模擬 0.2504 vs 理論 0.2500
# 輸出:E[S_T]:模擬 82.3794 vs 理論 S0*e^rT = 82.4364

十萬條路徑的統計與閉式解對得整整齊齊:對數價格的均值與標準差命中理論值,終端價的期望值等於本金滾無風險利率。注意分布的形狀:對數常態右尾長、左尾短——同一條 GBM,中位數約 79.9 元,比平均數 82.4 元低,因為少數大漲路徑把平均拉高了。

五、Black-Scholes:同一個價格的兩條路

把二項樹的複製邏輯搬進連續時間,就是 Black-Scholes。同一個公式有兩條等價的推導路線,各自照亮不同的直覺——值得兩條都走一遍(思路版,長推導見原書頁碼)。

路線一:對沖消風險,得 PDE。 設買權價格是某個未知函數 \(c(S_t, t)\)。用 Itô 引理展開 \(dc\),會發現它的隨機成分是 \(\frac{\partial c}{\partial S}\sigma S_t\,dW_t\)——只有一個亂源。於是持有一單位買權、放空 \(\frac{\partial c}{\partial S}\) 股股票,兩邊的 \(dW_t\) 恰好對消,組合瞬間變成無風險。無套利說:無風險組合只能賺 \(r\)。把「Itô 算出來的組合變化」與「無風險增值」畫上等號,整理後隨機項全滅,剩下一條確定性的偏微分方程:

$$ \frac{\partial c}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 c}{\partial S^2} + r S \frac{\partial c}{\partial S} - r c = 0 $$

逐項拆解:第一項是時間流逝對權利金的侵蝕(theta);第二項帶著二階導(gamma)與 \(\sigma^2\)——凸性在波動中的收益,Itô 修正項的化身;第三、四項合起來是「記帳世界裡一切都以 \(r\) 增值」的無套利約束。最該注意的是誰不在場:\(\mu\) 被對沖抵銷,從方程裡徹底消失了——這就是「定價不需要預測漲跌」在連續時間的精確版本。配上到期條件 \(c(S_T,T)=\max(S_T-K,0)\),這條 PDE 恰好有閉式解。

路線二:風險中性期望。 直接套第二節的定價公式:\(c_0 = e^{-rT}\,\mathbb{E}^{\mathbb{Q}}[\max(S_T-K,0)]\),其中 \(S_T\) 是上一節那個對數常態變數。這是一個常態分布下的積分,拆成兩塊各自積出來就是答案。兩條路線殊途同歸不是巧合:Feynman-Kac 公式保證「這一類 PDE 的解」與「這一類條件期望」是同一個東西的兩種寫法——PDE 是複製語言,期望是機率語言,中間的橋正是折現價格在 \(\mathbb{Q}\) 下是鞅。

積分的結果就是 BS 公式:

$$ C_0 = S_0\, \Phi(d_1) - K e^{-rT}\, \Phi(d_2), \qquad d_{1} = \frac{\ln(S_0/K) + (r + \sigma^2/2)T}{\sigma\sqrt{T}}, \quad d_2 = d_1 - \sigma\sqrt{T} $$

逐項拆解:\(\Phi\) 是標準常態的累積分布函數。從右往左讀最白話——\(\Phi(d_2)\) 是 \(\mathbb{Q}\) 世界裡「到期時履約」(\(S_T > K\))的機率,所以第二項是「預期付出的履約款的現值」:履約價乘以履約機率再折現。第一項是「履約時預期收到的股票的現值」——它不是 \(S_0\Phi(d_2)\),因為履約多半發生在股價偏高的路徑上,條件期望被抬高,抬高的量恰好把 \(d_2\) 修成 \(d_1\)。\(\Phi(d_1)\) 同時是複製組合該持有的股數——delta,第 10 章離散對沖實驗裡每期重算的那個數,第 16 章 Greeks 的第一位主角。整條公式就是「買股票的錢減去借款」——第二節那個 \(\Delta \cdot S_0 + B\) 的連續版。

期望的寫法還送我們一個免費的數值方法:期望值可以用抽樣平均逼近。在 \(\mathbb{Q}\) 下模擬 \(S_T\)、算 payoff、折現、平均——蒙地卡羅定價:

PYTHON
import numpy as np, math

def bs_call(S0, K, r, sigma, T):
    d1 = (math.log(S0 / K) + (r + 0.5 * sigma**2) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    N = lambda x: 0.5 * (1 + math.erf(x / math.sqrt(2)))
    return S0 * N(d1) - K * math.exp(-r * T) * N(d2)

C_bs = bs_call(80, 85, 0.03, 0.25, 1.0)
print(f"BS 閉式解 = {C_bs:.4f}")           # 6.8982

rng = np.random.default_rng(14)
for n in (1_000, 10_000, 100_000, 1_000_000):
    Z = rng.standard_normal(n)
    ST = 80 * np.exp((0.03 - 0.5 * 0.25**2) + 0.25 * Z)   # T=1 的終端價
    disc = math.exp(-0.03) * np.maximum(ST - 85, 0.0)
    se = disc.std(ddof=1) / math.sqrt(n)
    print(f"N={n:>9,}|MC 價 {disc.mean():.4f}|誤差 {disc.mean() - C_bs:+.4f}|標準誤 {se:.4f}")
# 輸出:
# N=    1,000|MC 價 6.6378|誤差 -0.2604|標準誤 0.3858
# N=   10,000|MC 價 7.0424|誤差 +0.1442|標準誤 0.1279
# N=  100,000|MC 價 6.8729|誤差 -0.0253|標準誤 0.0401
# N=1,000,000|MC 價 6.8835|誤差 -0.0146|標準誤 0.0127

樣本每加十倍,標準誤縮 \(\sqrt{10}\approx 3.16\) 倍(0.386→0.128→0.040→0.013),誤差始終落在標準誤的量級內——蒙地卡羅以 \(1/\sqrt{N}\) 的速度收斂到閉式解。BS 是少數有閉式解的幸運兒;第六節那些更真實的模型多半沒有,蒙地卡羅、樹、PDE 數值解就成了主力,那是第 15 章的正題。

最後把第 10 章的帳結清。BS 的複製之所以「完美」,靠兩個理想化:連續重平衡、零交易成本。第 10 章算過,現實中一天調一次倉,殘餘風險以 \(1/\sqrt{N}\) 的速度收縮但永不歸零,於是價格與對沖政策綁死、定價變成序列決策——QLBS 的世界。兩章合起來是一幅完整地圖:本章給出理想極限的解析解,第 10 章給出離開極限後的資料解

六、模型巡禮:GBM 修不動的市場事實

GBM 優雅、可解、參數只有一個 \(\sigma\)。但拿它對照真實市場,至少三個事實對不上:

事實一:肥尾。 GBM 說對數報酬是常態分布,真實股市報酬的極端值卻遠比常態預測的多。台股歷史上單日重挫超過百分之六的次數,若用常態分布估算,機率小到幾輩子都不該遇上一次——但它就是一再發生。

事實二:波動率微笑與偏斜。 若 BS 是對的,同一標的、同一到期日、不同履約價的選擇權,反推出的隱含波動率應該是同一個 \(\sigma\)(一條水平線)。實際上股權市場低履約價的隱含波動率系統性偏高——畫出來是一條左高右低的偏斜(skew),有時兩端都翹起像微笑。市場用腳投票:它不相信對數常態,願意為下跌保護付更高的「單位保費」。

事實三:期限結構。 不同到期日的隱含波動率也不同,而且整張「履約價 × 到期日」的曲面會隨市場情緒變形。單一常數 \(\sigma\) 連一個到期日都貼不滿,更不用說整張曲面。

後 BS 的模型家族,每一支都是對著其中一項事實動刀。判讀的竅門是問一句:它把 GBM 的哪個零件換掉了?

換掉「\(\sigma\) 乘 \(S\)」的形狀——Bachelier 與 CEV。 Bachelier 模型把波動項改成常數 \(\sigma\,dW_t\)(不乘 \(S_t\)):價格本身呈常態、可以變負。聽起來是缺陷,在利率與原物料市場卻是需求——2020 年油價期貨真的跌成負值,負利率更是歐日多年的日常。CEV 模型再把兩者連成光譜:波動項寫成 \(\sigma S_t^{\beta}\),\(\beta=1\) 回到 GBM、\(\beta=0\) 回到 Bachelier,中間的 \(\beta\) 直接控制偏斜的斜率。它們修的是「分布的形狀該長怎樣」這個最底層的選擇。

把 \(\sigma\) 變成狀態的函數——局部波動率。 讓 \(\sigma(S_t, t)\) 成為「現在價格與時間」的確定性函數:價格跌到哪、波動率就查表調到哪。Dupire 公式給出驚人的結論:這張表不必猜,整張可以從市場選擇權價格反解出來——把買權價格對到期日的一階導數、對履約價的二階導數代進一條公式,局部波動率曲面唯一確定,模型可以把整張隱含波動率曲面精確貼合。代價在後面:公式吃的是價格的導數,而導數要靠對相鄰履約價的報價做差分來估——買賣價差的一點雜訊會被差分放大,所以局部波動率只在報價最密的市場裡站得穩。它修的是「曲面貼合」這個工程問題。

讓 \(\sigma\) 自己也隨機——隨機波動率(Heston)。 現實裡波動率會自己起伏、會群聚、還跟價格反向連動(大跌時波動飆高)。Heston 模型把這三件事全部內建:

$$ dS_t = r S_t\, dt + \sqrt{v_t}\, S_t\, dW_t^{(1)}, \qquad dv_t = \kappa(\theta - v_t)\, dt + \xi \sqrt{v_t}\, dW_t^{(2)} $$

逐項拆解:第一條還是 GBM 的樣子,只是波動率換成隨機的 \(\sqrt{v_t}\);第二條讓變異數 \(v_t\) 做均值回歸——被 \(\kappa\) 的力道拉回長期水位 \(\theta\),自己的波動由 \(\xi\)(波動率的波動率)決定;兩個布朗運動的相關係數 \(\rho\) 通常是負的——價跌波動升。每個參數對到曲面的一個特徵:\(\rho\) 控制偏斜方向、\(\xi\) 控制微笑弧度、\(\kappa\) 與 \(\theta\) 控制期限結構。一組參數能同時描述所有到期日,這是它比逐期校準的模型(如 SABR)優雅之處。它修的是「波動率的動力學」。

允許價格跳空——跳躍擴散(Merton)。 連續路徑有個天生的難處:要讓「一週後暴跌三成」有可觀機率,擴散項得配上離譜的波動率。但市場確實會跳——財報、地緣衝突、疫情,開盤直接跳空。Merton 模型在 GBM 上疊一個泊松跳躍:以強度 \(\lambda\) 隨機到來、跳幅本身服從對數常態。跳躍讓短天期的深度價外選擇權有了合理的定價——修的是短天期的極端偏斜與肥尾。用模擬直接看肥尾長出來:

PYTHON
import numpy as np, math

rng = np.random.default_rng(3)
n, T1 = 100_000, 1 / 12                     # 模擬十萬個「一個月」
sigma_d, lam, mu_j, sig_j = 0.16, 8.0, -0.02, 0.05

# GBM 的月對數報酬(純擴散)
gbm = -0.5 * sigma_d**2 * T1 + sigma_d * math.sqrt(T1) * rng.standard_normal(n)
# Merton:擴散 + 泊松跳(每次跳幅 ~ N(-2%, 5%))
Nj = rng.poisson(lam * T1, n)
jumps = np.array([rng.normal(mu_j, sig_j, k).sum() if k else 0.0 for k in Nj])
mert = gbm + jumps

def ex_kurt(x):
    z = (x - x.mean()) / x.std()
    return (z**4).mean() - 3

print(f"GBM    月報酬:std {gbm.std():.4f},超額峰度 {ex_kurt(gbm):+.3f}")
print(f"Merton 月報酬:std {mert.std():.4f},超額峰度 {ex_kurt(mert):+.3f}")
print(f"當月至少跳一次的比例:{(Nj > 0).mean():.3f}")
# 輸出:GBM    月報酬:std 0.0461,超額峰度 -0.009
# 輸出:Merton 月報酬:std 0.0638,超額峰度 +0.960
# 輸出:當月至少跳一次的比例:0.487

純擴散的超額峰度是 0(常態的定義);疊上平均每月不到一次的小跳躍,超額峰度立刻升到約 1——尾巴肥了,而且是用「偶爾跳一下」這種符合市場敘事的方式肥的,不是靠把日常波動調大。再往上還有混血模型:SVJ 在 Heston 上加跳躍、隨機局部波動率(SLV)把 Heston 與查表式波動率合體、Variance Gamma 干脆讓「交易時鐘」本身隨機——但零件就是這三種:波動率查表、波動率隨機、價格會跳

七、校準 vs 估計:兩個世界的參數從哪來

模型選好了,參數從哪來?這個問題把兩個世界的分野再演一次,而且這次直接關係到你的日常工作流。

\(\mathbb{P}\) 世界用估計:拿歷史資料,最大概似、貝葉斯後驗、最小平方——第 2 章的整套武器。估出來的 \(\sigma\) 叫歷史波動率,回答「過去的報酬震盪多大」。

\(\mathbb{Q}\) 世界用校準:拿今天的市場選擇權報價,反過來調模型參數,讓模型價格貼近市場價格——解一個最佳化問題 \(\min_{\Theta}\sum_i \big(C^{\text{model}}_i(\Theta) - C^{\text{mkt}}_i\big)^2\)。校出來的 \(\sigma\) 叫隱含波動率,回答「市場現在為未來的震盪開什麼價」。

比喻: 鋼琴技師調音時,把琴弦調到與音叉共鳴為止——音叉(市場報價)就是標準答案,他不需要弦的物理理論也能調準。這是校準。聲學家則錄下琴音,用物理模型反推弦的張力與密度——他要的是理解與預測,這是估計。同一條弦,兩種人問的問題不同:技師問「怎麼跟市場對齊」,聲學家問「它真實的性質是什麼」。搞混兩者的典型災難,是拿調音的結果當物理定律用——拿隱含波動率當歷史波動率的預測值,或反過來。

兩者的差不是誤差,是資訊:隱含波動率通常高於歷史波動率,差額是選擇權賣方收的風險溢酬——和第二節「\(q\) 偏離 \(p\) 的程度就是風險偏好」是同一件事的兩種化身。

校準在技術上是一個逆問題,而逆問題的毛病你在第 2 章都見過。其一,不適定:Heston 五個參數對上整張曲面幾十個報價,不同參數組合可能給出幾乎一樣的貼合度(\(\rho\) 與 \(\xi\) 在偏斜上高度互相代償),解不唯一、對資料雜訊敏感——這正是「需要先驗、需要正則化」的訊號,貝葉斯視角在 \(\mathbb{Q}\) 世界同樣管用。其二,過度貼合的誘惑:局部波動率能把今天的曲面貼到分毫不差,但貼得越死、對報價雜訊越敏感,明天曲面一動就得整張重解——像第 1 章那條 U 形曲線在定價世界的翻版:貼合度不是唯一的美德,穩定性也是。其三,速度約束:校準要在參數空間裡反覆試誤,每一步都要對幾十個商品重新定價,所以模型「算得快不快」不是奢侈品而是生存條件——這解釋了為什麼實務偏愛有閉式解或半閉式解的模型,也是第 15 章數值方法的開場動機。

實務的模型選擇因此是一組三角取捨:參數少的模型(BS、Bachelier)貼不滿曲面,但穩健、直觀、快,適合當報價語言;參數多的模型(Heston、SVJ)貼得住曲面、動力學合理,但校準難、解不唯一;查表式模型(局部波動率)貼合完美,但吃資料品質。沒有全能者,只有「這個市場、這個商品、這個用途下的合適者」。

八、誠實限界

收尾之前,把本章每個環節的裂縫攤開來。

無套利是公理,不是事實。 定價理論的一切建立在「套利機會不存在」上。多數時候市場確實如此,但壓力時刻——流動性枯竭、融券禁令、漲跌停鎖死——套利者動彈不得,價格可以長時間偏離理論值。理論沒有錯,是它的前提暫時休假。

完備市場是理想,不完備是常態。 複製論證要求「亂源數 ≤ 對沖工具數」。BS 世界一個亂源、一支股票,剛好完備。加入隨機波動率就多了第二個亂源,得再拿一張選擇權當對沖工具;加入跳躍更麻煩——跳幅是連續分布,理論上要無限多種工具才能完全複製。不完備市場裡沒有唯一的無套利價格,只有一個區間,價格落點取決於風險偏好——第 10 章的風險趨避係數 \(\lambda\) 從後門重新進場。「風險中性」的純粹性,只在完備市場裡成立。

參數會漂移。 校準好的 Heston 參數理論上該是常數,實務上每天重校每天不同——市場在動,模型結構性地跟不上。交易台的因應不是假裝參數穩定,而是把「重校準的頻率與幅度」本身當成模型健康度的監控指標:參數劇烈跳動的模型,說明它的動力學少了什麼。

模型風險是職業風險。 用錯模型定價、對沖,虧損是真金白銀。歷史上多次衍生性商品災難的共同劇本,是模型在平靜期表現良好,於是被延伸到它的假設早已失效的市場。所以模型選擇一半是科學、一半是手藝:科學的部分本章教了,手藝的部分只能來自對每個模型失效邊界的敬畏——知道 Heston 的尾巴和 Variance Gamma 的尾巴不一樣厚,價外選擇權的報價就不敢照單全收。

\(\mathbb{Q}\) 世界不回答賺不賺錢。 風險中性定價告訴你一張選擇權「值」多少,不告訴你「買它會不會賺」——後者是 \(\mathbb{P}\) 世界的問題,需要預測,而預測是另一場仗(本課程前三部的仗)。兩個世界各司其職:\(\mathbb{Q}\) 管公道價,\(\mathbb{P}\) 管好生意。把公道價誤當好生意,是新手在衍生性商品市場最貴的一課。

下一章接棒的是實作:有了模型,怎麼把價格真的算出來——樹、蒙地卡羅、PDE 數值解與傅立葉方法,第 15 章〈選擇權定價實務〉見。

§03原書對照

本章以白話重組了 Kelliher《Quantitative Finance with Python》第 2、8 章與第 3 章開頭的骨架,以下內容原書有、本課未展開,按印刷頁碼列出供深入。其一,隨機微積分前置數學的完整鋪陳:縮放隨機漫步的均值與變異數推導、時間網格的建構(pp.28–29,式 2.4–2.14),以及二項樹在中央極限定理下收斂到常態的論證(p.32)。其二,二項樹參數的標定式:以目標年化波動率與利率反推 \(u\)、\(d\)、\(p\) 的公式組(p.31,式 2.16–2.18)。其三,布朗運動性質的完整清單與圖解,包括以絕對值函數的折點類比處處不可微、共變異數 \(\min(s,t)\) 的推導(pp.34–37)。其四,Itô 引理的泰勒展開動機與無風險債券暖身練習——無擴散項時 Itô 退回普通微積分(pp.40–42),以及 GBM 閉式解的逐步推導(pp.42–44)。其五,BS PDE 的完整推導與 delta 對沖組合的逐項消去過程(pp.44–46),加上 Feynman-Kac 公式把 PDE 與條件期望接通的一般化陳述(pp.47–48)。其六,Girsanov 定理與 Radon-Nikodym 導數的直覺化處理:以「換一個資產當記帳單位」解讀測度變換,並預告其在利率、外匯與稀有事件模擬的應用(pp.48–50)。其七,實體測度一側的世界觀:預測 vs 複製的分工、效率市場假說的弱式/半強式/強式三形式與各自否定的策略類型、動能/價值溢酬/規模效應/元月效應等文獻異常、行為財務以損失趨避重新詮釋異常為可收割的風險溢酬——原書並以賣保險為風險溢酬的原型例:買方為尾部保護願付溢價、賣方因承擔壞狀態的集中虧損而長期收租(pp.51–54)。其八,Bachelier 模型的完整定價公式與負價格的市場脈絡(pp.159–160)、CEV 模型的非中心卡方閉式解與 \(\beta\) 對偏斜斜率的圖解(pp.161–162)。其九,OU 與 CIR 均值回歸過程——積分因子解法與其在利率市場的角色(pp.162–164)。其十,Heston 與 SABR 的特徵函數及漸近公式全文(pp.166–170):SABR 以 CEV 價格過程搭配對數常態波動率、無均值回歸,因此貼得住單一到期日的微笑卻要逐期各校一組參數,與 Heston 一組參數管整張曲面形成對照——特徵函數是原書第 9 章 FFT 定價的輸入,本課第 15 章會再回來。其十一,跳躍模型的完整族譜:Merton 特徵函數、SVJ、Variance Gamma 的隨機時鐘與 VGSA(pp.172–177)。其十二,Dupire 公式的推導脈絡與有限差分實作、S&P 局部波動率曲面實例、SLV 模型(pp.178–180),以及模型比較與校準實務的收官討論——原書以模型選擇是「a combination of art and science」作結(p.182)。

§04作業和解答

作業一:把二項樹磨成 Black-Scholes

用 CRR 參數化(\(u = e^{\sigma\sqrt{\Delta t}}\)、\(d = 1/u\)、\(q = (e^{r\Delta t}-d)/(u-d)\))寫一個 \(n\) 期二項樹定價器,對本章的例子(\(S_0=80\)、\(K=85\)、\(r=3\%\)、\(\sigma=25\%\)、\(T=1\))取 \(n = 1, 5, 25, 125, 625\),觀察樹價如何逼近 BS 閉式解 6.8982,並解釋為什麼收斂成立。

解答 SOLUTION
PYTHON
import numpy as np, math

def crr_call(S0, K, r, sigma, T, n):
    dt = T / n
    u = math.exp(sigma * math.sqrt(dt)); d = 1 / u
    q = (math.exp(r * dt) - d) / (u - d)
    disc = math.exp(-r * dt)
    j = np.arange(n + 1)
    c = np.maximum(S0 * u**j * d**(n - j) - K, 0.0)   # 終端 payoff
    for _ in range(n):                                  # 逐期倒推
        c = disc * (q * c[1:] + (1 - q) * c[:-1])
    return c[0]

for n in (1, 5, 25, 125, 625):
    p = crr_call(80, 85, 0.03, 0.25, 1.0, n)
    print(f"n={n:>4}|樹價 {p:.4f}|與 BS 差 {p - 6.8982:+.4f}")
# 輸出:
# n=   1|樹價 8.5665|與 BS 差 +1.6683
# n=   5|樹價 7.0485|與 BS 差 +0.1503
# n=  25|樹價 6.8736|與 BS 差 -0.0246
# n= 125|樹價 6.8971|與 BS 差 -0.0011
# n= 625|樹價 6.9011|與 BS 差 +0.0029

解讀:一期樹誤差高達 1.67 元,因為它硬把整年壓成一次二選一;五期就縮到 0.15,625 期在千分之幾內震盪。收斂的機理是第三節的縮放隨機漫步:CRR 每期漲跌幅取 \(e^{\pm\sigma\sqrt{\Delta t}}\),正是 \(1/\sqrt{n}\) 縮放,於是 \(n\to\infty\) 時終端對數價格依中央極限定理趨向常態——樹的世界極限就是 GBM 的世界,兩邊的無套利價格自然會合。注意收斂不是單調的(625 期反而比 125 期偏差略大):樹的節點與履約價的相對位置造成奇偶震盪,實務上常取相鄰兩個 \(n\) 的平均來消。

作業二:折現股價的鞅檢驗

在 \(\mathbb{Q}\) 下(漂移 \(=r=3\%\))與 \(\mathbb{P}\) 下(漂移 \(=\mu=12\%\))各模擬二十萬條 GBM 路徑(\(S_0=80\)、\(\sigma=25\%\)、月頻、一年),兩者都用無風險利率折現,檢驗 \(\mathbb{E}[e^{-rt}S_t]\) 是否守在 80 元。解釋結果與「風險中性」的關係。

解答 SOLUTION
PYTHON
import numpy as np, math

rng = np.random.default_rng(21)
n_paths, n_steps, T = 200_000, 12, 1.0
dt = T / n_steps
for label, drift in (("Q(漂移 3%)", 0.03), ("P(漂移 12%)", 0.12)):
    Z = rng.standard_normal((n_paths, n_steps))
    logS = np.log(80) + np.cumsum(
        (drift - 0.5 * 0.25**2) * dt + 0.25 * math.sqrt(dt) * Z, axis=1)
    t_grid = dt * np.arange(1, n_steps + 1)
    discS = np.exp(-0.03 * t_grid) * np.exp(logS)
    v = discS.mean(axis=0)
    print(f"{label}: t=1月 {v[0]:.3f}|t=6月 {v[5]:.3f}|t=12月 {v[11]:.3f}")
# 輸出:
# Q(漂移 3%): t=1月 79.987|t=6月 79.975|t=12月 79.976
# P(漂移 12%): t=1月 80.605|t=6月 83.699|t=12月 87.586

解讀:\(\mathbb{Q}\) 之下,折現股價在整段期間守在 80 元附近(偏差在蒙地卡羅誤差內)——條件期望等於現值,這就是鞅:記帳世界裡沒有任何可預測的超額報酬可撿。\(\mathbb{P}\) 之下折現股價一路走高——期望超額報酬 \(\mu - r = 9\%\) 是真實世界的風險溢酬:持有風險資產的人應該期待賺得比定存多,否則沒人肯承擔風險。兩張圖合起來就是本章的中心思想:風險溢酬在 \(\mathbb{P}\) 裡是實實在在的報酬來源,在 \(\mathbb{Q}\) 裡被測度變換吸收掉——不是它不存在,而是定價這件事刻意選了一套「它看起來是零」的記帳座標。

作業三:親手把波動率微笑挖出來

用 Merton 跳躍模型的級數解(對跳躍次數展開,每一項是一個調整參數後的 BS 公式)生成一組「市場價」(\(S_0=80\)、\(r=3\%\)、\(T=0.25\)、擴散波動率 18%、跳躍強度 1.2、平均跳幅 −10%、跳幅標準差 12%),再對每個履約價用二分法反推 BS 隱含波動率。若 BS 是對的,反推出的曲線應是水平線——實際會看到什麼?

解答 SOLUTION
PYTHON
import math

def bs_call(S0, K, r, sigma, T):
    d1 = (math.log(S0 / K) + (r + 0.5 * sigma**2) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    N = lambda x: 0.5 * (1 + math.erf(x / math.sqrt(2)))
    return S0 * N(d1) - K * math.exp(-r * T) * N(d2)

def merton_call(S0, K, r, sigma, T, lam, mu_j, sig_j, n_terms=60):
    m = math.exp(mu_j + 0.5 * sig_j**2) - 1        # 單次跳的期望相對跳幅
    lam2 = lam * (1 + m)
    total = 0.0
    for k in range(n_terms):                        # 對「跳 k 次」加權求和
        w = math.exp(-lam2 * T) * (lam2 * T)**k / math.factorial(k)
        sig_k = math.sqrt(sigma**2 + k * sig_j**2 / T)
        r_k = r - lam * m + k * (mu_j + 0.5 * sig_j**2) / T
        total += w * bs_call(S0, K, r_k, sig_k, T)
    return total

def implied_vol(price, S0, K, r, T, lo=1e-4, hi=3.0):
    for _ in range(100):                            # 二分法反解 BS
        mid = 0.5 * (lo + hi)
        if bs_call(S0, K, r, mid, T) > price: hi = mid
        else: lo = mid
    return 0.5 * (lo + hi)

for K in (64, 72, 80, 88, 96):
    p = merton_call(80, K, 0.03, 0.18, 0.25, 1.2, -0.10, 0.12)
    print(f"K={K:>2}|市場價 {p:>8.4f}|隱含波動率 {implied_vol(p, 80, K, 0.03, 0.25):.4f}")
# 輸出:
# K=64|市場價  16.7648|隱含波動率 0.2999
# K=72|市場價   9.5917|隱含波動率 0.2609
# K=80|市場價   3.9806|隱含波動率 0.2312
# K=88|市場價   1.0717|隱含波動率 0.2170
# K=96|市場價   0.1960|隱含波動率 0.2131

解讀:隱含波動率從深度價內的 30% 一路滑到價外的 21%——一條清楚的左高右低偏斜,而「真實」的擴散波動率只有 18%。這示範了兩件事。第一,微笑曲線是 BS 模型錯置的指紋:真實世界(這裡由 Merton 扮演)帶著向下跳躍的肥尾,硬用對數常態的 BS 去讀價格,低履約價那端只好用更高的 \(\sigma\) 來湊——曲線的形狀洩露了被 BS 忽略的分布特徵。第二,這正是交易台每天做的事的縮影:市場報價(本題的 Merton 價)是給定的,隱含波動率是反推出來的座標——第 16 章的波動率曲面,就是把這個練習擴到整個「履約價 × 到期日」平面。

作業四:二次變差親手量一次

對 \([0,1]\) 上的布朗路徑與平滑函數 \(\sin(2\pi t)\),各取 \(n = 100,\ 10^4,\ 10^6\) 個分割點,計算增量平方和。驗證第三節的斷言:布朗路徑的二次變差趨於區間長度 \(T=1\),平滑函數趨於 0,並說明這與 Itô 修正項的關係。

解答 SOLUTION
PYTHON
import numpy as np, math

rng = np.random.default_rng(5)
T = 1.0
for n in (100, 10_000, 1_000_000):
    dt = T / n
    dW = math.sqrt(dt) * rng.standard_normal(n)     # 布朗增量
    qv_bm = (dW**2).sum()
    t = np.linspace(0, T, n + 1)
    qv_f = (np.diff(np.sin(2 * np.pi * t))**2).sum()  # 平滑函數增量
    print(f"n={n:>9,}|布朗 {qv_bm:.4f}(理論→1)|sin {qv_f:.6f}(理論→0)")
# 輸出:
# n=      100|布朗 0.8293(理論→1)|sin 0.197327(理論→0)
# n=   10,000|布朗 1.0136(理論→1)|sin 0.001974(理論→0)
# n=1,000,000|布朗 1.0005(理論→1)|sin 0.000020(理論→0)

解讀:平滑函數的增量是 \(O(\Delta t)\),平方後 \(O(\Delta t^2)\),加總 \(n\) 項仍是 \(O(\Delta t)\)——切越細越接近零(0.197→0.002→0.00002,每次約縮百倍,正是 \(1/n\) 的速度)。布朗增量是 \(O(\sqrt{\Delta t})\),平方後恰好 \(O(\Delta t)\),加總後收斂到確定的 1——不隨機、不消失。這就是 \(dW^2 = dt\) 的實驗版。Itô 修正項 \(\frac{1}{2}f''\sigma^2\,dt\) 的全部來歷都在這裡:對布朗路徑做泰勒展開,二階項的期望貢獻不是高階小量,而是一筆確定的、按時間累積的帳——第四節 GBM 解裡的 \(-\sigma^2/2\)、第五節 BS PDE 裡的 gamma 項,都是這筆帳的化身。

§05參考資料