§01學習重點
- 用一張選型地圖為任意衍生品挑定價技術:先問 payoff 依賴什麼(到期價、整條路徑、可否提前履約、幾個資產),再問模型交出了什麼(密度、特徵函數、還是只有 SDE)
- 寫出 Black–Scholes 閉式解並逐項拆解,用買賣權平價與數位選擇權說明閉式解家族的「零件化」用法
- 建立擬閉式方法的直覺:密度未知但特徵函數已知時,傅立葉反演加 FFT 為什麼能一次算出整條履約價網格
- 實作 CRR 二項樹的回溯定價,解釋美式提前履約為何天然屬於「往回走」的方法家族
- 說明有限差分把定價 PDE 變成網格遞推的三種格式(顯式、隱式、Crank–Nicolson)與各自的穩定性代價
- 實作蒙地卡羅定價,解釋 \(O(1/\sqrt{N})\) 收斂率、它與維度無關的深意,以及對偶變量等變異數縮減技術的原理
- 依路徑依賴性質為亞式、障礙、回望、數位選擇權選方法;理解最小平方蒙地卡羅如何用迴歸讓模擬也能處理美式履約
- 建立定價器的工程觀:校準與定價對速度的要求差幾個量級、希臘值的數值穩定性,以及模型誤差與方法誤差是兩筆不同的帳
§02課程內容
一、從公式到工程:定價技術的選型地圖
第 14 章建立了風險中性定價的世界觀:衍生品的價格,是它未來 payoff 在風險中性測度下的貼現期望值。這句話在數學上乾淨得像一行詩,在工程上卻只是問題的開頭——期望值三個字,要怎麼真的算出來?
這一章的主角就是「算出來」這件事。它值得專門一章,是因為第 3 章其實已經預告過它的分量:那一章我們用高斯過程替「昂貴的定價器」建快取,一次定價可能要跑幾秒鐘的那種昂貴。本章打開的正是那顆定價器的內部——你會看到它為什麼昂貴、哪些情況可以不昂貴,以及工程師在精度與速度之間怎麼討價還價。
先給全章的地圖。為一個衍生品挑定價技術,依序問兩個問題:
第一問:payoff 依賴什麼? 只依賴到期那一天的價格(歐式香草、歐式數位);依賴整條路徑(亞式看平均、障礙看有沒有觸線、回望看極值);持有人能不能中途喊停(美式、百慕達);牽涉幾個資產(單資產還是一籃子)。每多一層依賴,能用的方法就少一批。
第二問:模型交出了什麼? 最慷慨的模型給你風險中性密度的閉式(Black–Scholes 的對數常態),期望值直接積分甚至有現成公式;小氣一點的模型(Heston 這類隨機波動率模型)密度寫不出來,但特徵函數有解析式,可以走傅立葉路線;最寒酸的情況連特徵函數都沒有,只剩一條 SDE 可以逐步模擬——那就只能請出數值三本柱:格點(樹)、有限差分 PDE、蒙地卡羅。
比喻: 西裝店有三種服務。架上成衣:尺碼剛好就能直接帶走,便宜、快、品質穩定——這是閉式解,條件符合時沒有理由不用。半訂製:版型現成、細節照你的身形修改,多等幾天、多付一點——這是擬閉式,模型換了但管線不用重蓋。全訂製:什麼身形都做得出來,代價是最貴、最慢、還依賴老師傅的手藝——這是數值方法,萬能,但每一次都是重新縫一件。行家的順序永遠是:先試成衣,改不動了才訂製。
這張地圖不是裝飾。實務上最常見的浪費,是拿全訂製的工具做成衣就能解決的事——用十萬條蒙地卡羅路徑去算一個 Black–Scholes 有公式的歐式買權;最常見的事故,則是反過來硬套——用只看到期價的公式去近似一個天天看路徑的亞式。接下來各節依地圖逐站走一遍,最後回頭把「工程」這條線收攏。
二、閉式解家族:Black–Scholes 與它的親戚
閉式解的代表作當然是 Black–Scholes。標的價 \(S\)、履約價 \(K\)、無風險利率 \(r\)、波動率 \(\sigma\)、到期時間 \(T\),歐式買權的價格是:
逐項拆解:\(N(\cdot)\) 是標準常態的累積分布函數;\(N(d_2)\) 是風險中性世界裡到期價內的機率,所以 \(K e^{-rT} N(d_2)\) 讀作「只在價內才付出的履約金,先按機率打折、再按時間貼現」;\(S\,N(d_1)\) 是「拿到股票那一邊」的期望現值——\(d_1\) 比 \(d_2\) 多出的 \(\sigma\sqrt{T}\),來自「在價內的條件下股價平均比較高」的修正。一正一負相減,就是買權的期望淨值。整條公式只是把「貼現期望」對著對數常態密度老老實實積分後的收官形。
這個家族還有幾位親戚,各自守著一塊地形:Black 76 把現貨換成遠期價格,是期貨與利率選擇權的標準報價公式;Bachelier 假設價格走常態而非對數常態,容得下負值,在利差與負利率市場反而是對的工具;CEV 讓波動率隨價格水位變化,能彎出偏斜。它們的共同點是:換湯不換藥,都是「某個能積出來的密度」配上「夠簡單的 payoff」。
閉式解家族還有一個常被低估的用法——零件化。\(N(d_2)\) 這顆零件單獨拆出來,就是數位買權(到期價內付一元)的價格 \(e^{-rT}N(d_2)\);而買賣權平價 \(C - P = S - Ke^{-rT}\) 甚至不依賴任何模型,只靠無套利論證成立,因此是檢驗任何定價器的第一道免費測試。實跑看看:
import math
def norm_cdf(x):
"""標準常態累積分布函數(只用標準庫)"""
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
def bs_price(S, K, r, sigma, T, kind="call"):
"""Black-Scholes 歐式選擇權閉式解"""
d1 = (math.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
if kind == "call":
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
return K * math.exp(-r * T) * norm_cdf(-d2) - S * norm_cdf(-d1)
S, K, r, sigma, T = 100.0, 105.0, 0.02, 0.25, 0.5
call = bs_price(S, K, r, sigma, T, "call")
put = bs_price(S, K, r, sigma, T, "put")
print(f"買權 {call:.4f}|賣權 {put:.4f}")
# 輸出:買權 5.3766|賣權 9.3319
# 買賣權平價:C - P 必須等於 S - K e^{-rT},與模型無關
print(f"C - P = {call - put:.4f}|S - K e^(-rT) = {S - K*math.exp(-r*T):.4f}")
# 輸出:C - P = -3.9552|S - K e^(-rT) = -3.9552
# 數位買權(到期價內付 1 元)= e^{-rT} N(d2):BS 的「零件」單獨拿出來用
d2 = (math.log(S/K) + (r - 0.5*sigma**2)*T) / (sigma*math.sqrt(T))
print(f"數位買權 {math.exp(-r*T)*norm_cdf(d2):.4f}(風險中性價內機率 N(d2) = {norm_cdf(d2):.4f})")
# 輸出:數位買權 0.3753(風險中性價內機率 N(d2) = 0.3791)半年期、履約價 105 的買權值 5.38 美元;平價關係兩邊都是 −3.9552,分毫不差。這組數字在本章會反覆出場:它們是後面每一種數值方法的標準答案——數值方法的第一份工作面試,永遠是「你能不能把閉式解算對」。
閉式解的限界也要說清楚:它是市場用同一把波動率尺量所有履約價時才成立的世界。真實市場每個履約價隱含的波動率不同(微笑與偏斜),這正是後面幾章的主題;但即使模型換掉,BS 依然活著——它從「定價模型」退役轉任「報價語言」,市場用它的隱含波動率溝通價格。
三、擬閉式:特徵函數與傅立葉反演的直覺
往地圖右邊走一步:模型複雜到密度寫不出來,怎麼辦?以隨機波動率模型為例——波動率自己也是一條隨機過程,還跟價格相關——對數股價的密度沒有閉式。神奇的是,這類模型的特徵函數往往有解析式:
逐項拆解:\(i\) 是虛數單位,\(u\) 是頻率變數;特徵函數是「對數到期價的每個頻率成分的期望」,數學上恰好是密度函數的傅立葉變換。密度與特徵函數是同一個分布的兩張面孔——一張在「價格域」,一張在「頻率域」;知道其中一張,原則上就能反演出另一張。
比喻: 錄音室的頻譜儀。你聽不到(寫不出)那段聲音的波形本身,但頻譜儀把每個頻率的強度都顯示給你——而頻譜資訊是完整的,工程師可以從頻譜把聲音重建回來。特徵函數就是分布的頻譜:Heston 這類模型「波形」給不出來,「頻譜」卻有公式;定價就變成一場頻域到時域的重建工程。
工程上的做法可以濃縮成三句話。第一句:把「選擇權價格對履約價的函數」做傅立葉變換,會發現它可以用特徵函數的解析式表達——這就是所謂 Carr–Madan 路線的核心。第二句:直接反演的積分在數學上不收斂,解法是先乘上一個衰減因子把積分「壓」收斂,算完再除回去——因子裡的參數理論上不影響答案,實務上選壞了會給錯價,所以要掃描參數找平臺、拿 BS 特例對答案。第三句:反演積分離散化之後恰好長成 FFT 演算法吃的形狀,於是一次運算就吐出整條履約價網格上的所有價格,複雜度從逐點積分的平方階降到 \(O(N \log N)\)。
什麼時候用它?答案幾乎就寫在複雜度裡。校準要在參數空間裡反覆試錯,每一輪都要把整條波動率偏斜重算一遍——幾十個履約價一次出爐的 FFT 是天造地設的引擎。反過來,如果只要算單一一個履約價,逐點做數值積分反而更快——FFT 的優勢是「整批」,不是「單件」。這是本章第一個純粹工程性的選型判準:同一個模型、同一個 payoff,批量大小不同,最佳工具就不同。
擬閉式的邊界也很清楚:它靠「payoff 夠簡單、可以推出變換公式」吃飯,每換一種 payoff 就要重推一次公式,而路徑依賴的 payoff 根本推不出來。地圖走到這裡,只剩數值三本柱。
四、格點法:二項樹與回溯定價
樹是三本柱裡最直觀的一根。CRR 二項樹把連續的股價過程剁成 \(N\) 步,每步股價只能乘 \(u\) 上去或乘 \(d\) 下來:
逐項拆解:\(\Delta t = T/N\) 是每步的時間長度;\(u, d\) 的取法讓格子的對數步幅等於波動率該有的尺度,且 \(ud = 1\) 使格子上下對稱、節點會重合(\(N\) 步只有 \(N+1\) 個終端節點,不是 \(2^N\) 個);\(q\) 是風險中性機率——唯一讓「股票在格子裡的期望報酬率恰好等於無風險利率」的上漲機率,它來自無套利論證,跟你主觀認為股價會漲會跌毫無關係。
定價的動作是回溯(backward induction):到期那一排的價值就是 payoff,然後一排一排往回走,每個節點的價值等於下一步兩個子節點的貼現期望:
歐式選擇權走到根節點就結束了。美式選擇權多一個動作:每個節點算完「繼續持有」的價值後,跟「當場履約」的價值比大小取大者——這一步在往回走的過程裡順手就做了,這正是樹(以及下一節的 PDE)天生擅長美式的原因:提前履約是「往回推」的決策問題,而樹本來就在往回走。
比喻: 手上一張可以隨時退的機票。每到一個轉機點你都要決定:現在退票拿退款(履約價值),還是留著繼續飛(持有價值)?理性做法是從最後一段航程往回想——先想清楚「最後一段的票值多少」,才能在倒數第二站判斷退不退。美式選擇權的每個樹節點都是一個轉機點,回溯定價就是把整趟旅程從終點往回想一遍。
實作與收斂實驗:
import math
import numpy as np
def crr_tree(S, K, r, sigma, T, N, kind="put", american=False):
"""CRR 二項樹:回溯定價,american=True 時每節點比較提前履約"""
dt = T / N
u = math.exp(sigma * math.sqrt(dt)); d = 1.0 / u
q = (math.exp(r * dt) - d) / (u - d) # 風險中性上漲機率
disc = math.exp(-r * dt)
j = np.arange(N + 1)
ST = S * u**j * d**(N - j) # 到期各節點股價
V = np.maximum(K - ST, 0.0) if kind == "put" else np.maximum(ST - K, 0.0)
for n in range(N - 1, -1, -1): # 從到期往回走
V = disc * (q * V[1:] + (1 - q) * V[:-1]) # 持有價值=貼現期望
if american:
Sn = S * u**np.arange(n + 1) * d**(n - np.arange(n + 1))
ex = np.maximum(K - Sn, 0.0) if kind == "put" else np.maximum(Sn - K, 0.0)
V = np.maximum(V, ex) # 美式:跟「立刻履約」取大
return V[0]
S, K, r, sigma, T = 100.0, 105.0, 0.02, 0.25, 0.5 # 與第二節同一組參數
# BS 歐式賣權閉式解 9.3319(第二節)
for N in (10, 50, 200, 800):
eu = crr_tree(S, K, r, sigma, T, N, "put", american=False)
am = crr_tree(S, K, r, sigma, T, N, "put", american=True)
print(f"N={N:>3d}|歐式 {eu:.4f}|美式 {am:.4f}|提前履約溢價 {am-eu:.4f}")
# 輸出:
# N= 10|歐式 9.4940|美式 9.6328|提前履約溢價 0.1389
# N= 50|歐式 9.3022|美式 9.4347|提前履約溢價 0.1325
# N=200|歐式 9.3260|美式 9.4521|提前履約溢價 0.1261
# N=800|歐式 9.3311|美式 9.4556|提前履約溢價 0.1245三個觀察。第一,歐式樹價收斂到閉式解 9.3319——但不是單調滑進去的,而是一路小幅震盪(9.4940 → 9.3022 → 9.3260 → 9.3311),因為履約價相對格子節點的位置隨 \(N\) 變動,這種鋸齒是格點法的特徵指紋。第二,美式賣權比歐式貴了約 0.125 美元:深度價內時提早拿到履約金再賺利息,勝過等到期——這 0.125 就是「可以中途喊停」這項權利本身的市價。第三,這裡的誤差是離散化偏差:確定性的、系統性的,加密格子就縮小,與下下節蒙地卡羅的隨機抽樣誤差本質不同。
上圖用一棵三步小樹把整套動作攤開:每個節點標出持有價值與履約價值,其中最低的價內節點(股價 81.54)出現了 23.46 > 23.11——履約價值壓過持有價值,美式定價在該節點「喊停」。一棵看得完的小樹,勝過十段文字。
五、有限差分:把 PDE 變成網格上的遞推
同一個定價問題還有第三種問法。Black–Scholes 的世界裡,任何衍生品的價格函數 \(V(S, t)\) 都滿足同一條偏微分方程:
逐項拆解:\(\partial V/\partial t\) 是時間流逝對價值的侵蝕(theta);\(rS\,\partial V/\partial S\) 是標的以無風險利率漂移帶來的價值變化(delta 項);\(\tfrac{1}{2}\sigma^2 S^2\, \partial^2 V/\partial S^2\) 是價格曲率吃到波動的好處(gamma 項);右邊 \(rV\) 說這一切加總必須恰好等於「把錢放定存」的報酬——否則就有套利。值得注意的是:方程本身只認模型,不認商品;商品的個性全部藏在邊界條件裡——到期時價值等於 payoff、股價趨近零與趨近極大時價值各是多少。
有限差分的招數,是把 \((S, t)\) 平面鋪成網格,用相鄰格點的差商近似導數(中央差分的誤差是步長的平方階,優先採用),於是 PDE 變成網格上的代數遞推,同樣從到期往回走。三種經典格式差在「用哪個時間層的鄰居」:
- 顯式:現在這格由「未來三格」直接加權算出,一格一格獨立算,便宜;代價是穩定性有條件——時間步長必須小於一個由空間步長與波動率決定的門檻,否則誤差逐步放大、數值爆炸。
- 隱式:把未知數放在「現在」這層,每退一步要解一個三對角線性方程組,單步較貴;換來無條件穩定,網格粗細隨你選。
- Crank–Nicolson:兩者各取一半的折衷,精度升一階,仍然無條件穩定,是實務的預設選項。
跟上一節的樹對照著看會突然開竅:二項樹其實就是一種變相的顯式差分——「下一層兩個節點加權平均出這一層」與「未來三格加權出現在一格」是同一族動作;樹的 \(u, d, q\) 取法恰好保證了它天生落在穩定區域內。所以樹擅長的美式履約,PDE 一樣擅長:往回走的每一格順手跟履約價值比大小即可。
PDE 相對樹多出兩項武器與一道天塹。武器一:整個網格解完,你拿到的不是一個價格,而是整張價格曲面 \(V(S,t)\)——對 \(S\) 差分一下就是 delta 與 gamma,對風險管理是白送的禮物。武器二:邊界條件的表達力——障礙選擇權的「觸線失效」翻譯成 PDE 語言就是「在障礙價上把價值釘成零」,自然得像是為它發明的。天塹則是維度:每加一個隨機因子(隨機波動率、第二個資產),網格多一個維度、矩陣失去三對角好性質,計算量指數式上升;兩三維之後,實務上就把場子讓給蒙地卡羅。順帶一提,實務上最容易出 bug 的地方不是差分格式本身,而是邊界條件——上邊界的貼現寫錯半拍,整張曲面都會歪。
六、蒙地卡羅:路徑依賴的萬用刀
地圖的最後一根柱子最粗。蒙地卡羅的邏輯素到極點:價格是期望值,期望值可以用平均數估——在風險中性測度下模擬一萬條路徑,每條算 payoff、貼現、取平均,完事。它不挑 payoff(路徑再刁鑽也只是「沿路徑算個數」)、不挑維度(十個資產就是每步抽十個相關的隨機數),是名副其實的萬用刀。
代價寫在收斂率上。由中央極限定理,估計值的標準誤是:
逐項拆解:\(\hat{\sigma}_{\text{payoff}}\) 是單條路徑貼現 payoff 的樣本標準差——payoff 本身越發散,估得越辛苦;\(N\) 是路徑數,誤差以 \(1/\sqrt{N}\) 縮小——精度要多一位小數,路徑要多一百倍。這個速率跟一維數值積分比是恥辱級的慢,但它有一個別人都沒有的性質:與維度無關。積分格點法的成本隨維度指數爆炸,蒙地卡羅的 \(1/\sqrt{N}\) 在一維和一百維一樣——高維問題裡它不是最好的選擇,是唯一的選擇。
比喻: 選前民調。想知道全國支持率(期望值),不必問完全國,抽一千個人平均就有個誤差正負三個百分點的估計;要把誤差減半,樣本得翻四倍——這就是 \(1/\sqrt{N}\) 的日常長相。變異數縮減則是民調專家的聰明問法:與其多抽人,不如把問卷設計得讓每份樣本提供更多資訊——同樣的預算,更窄的信賴區間。
實跑收斂實驗,並示範最容易上手的變異數縮減——對偶變量(antithetic variates):每抽一個常態亂數 \(Z\) 就同時用 \(-Z\) 造一條鏡像路徑,兩條的 payoff 平均後當一個樣本。直覺:一條抽高了、鏡像那條就偏低,誤差互相抵銷一部分:
import math
import numpy as np
S, K, r, sigma, T = 100.0, 105.0, 0.02, 0.25, 0.5
rng = np.random.default_rng(15)
def mc_call(n_paths, antithetic=False):
"""歐式買權蒙地卡羅:回傳(估計值、標準誤)"""
if antithetic:
Z = rng.standard_normal(n_paths // 2)
Z = np.concatenate([Z, -Z]) # 對偶變量:每條路徑配一條鏡像
else:
Z = rng.standard_normal(n_paths)
ST = S * np.exp((r - 0.5*sigma**2)*T + sigma*math.sqrt(T)*Z)
payoff = np.exp(-r*T) * np.maximum(ST - K, 0.0)
if antithetic:
payoff = 0.5 * (payoff[:n_paths//2] + payoff[n_paths//2:]) # 成對平均
return payoff.mean(), payoff.std(ddof=1) / math.sqrt(len(payoff))
# BS 閉式解真值 5.3766(第二節)
for n in (1_000, 10_000, 100_000, 1_000_000):
est, se = mc_call(n)
est_a, se_a = mc_call(n, antithetic=True)
print(f"N={n:>9,d}|普通 {est:.4f}±{se:.4f}|對偶 {est_a:.4f}±{se_a:.4f}")
# 輸出:
# N= 1,000|普通 5.1815±0.2950|對偶 5.4303±0.2805
# N= 10,000|普通 5.4031±0.1017|對偶 5.2754±0.0846
# N= 100,000|普通 5.4258±0.0322|對偶 5.3447±0.0272
# N=1,000,000|普通 5.3851±0.0102|對偶 5.3785±0.0086讀數字。路徑數每乘十,標準誤縮成約 \(1/\sqrt{10} \approx 0.32\) 倍(0.295 → 0.102 → 0.032 → 0.010),教科書曲線分毫不差;一百萬條路徑才把誤差壓到閉式解一瞬間就給你的第三位小數——這就是「有成衣就別訂製」的量化證據。對偶變量把標準誤穩定壓到約 0.85 倍——看似不多,但等精度下路徑省了近三成,而且幾乎零成本。它對接近對稱的 payoff 最有效;本例的價外買權 payoff 不對稱,效果屬中等,作業二會在亞式選擇權上看到更漂亮的縮減。
變異數縮減是一整個工具箱,再點兩件常用的:控制變量——找一個跟目標 payoff 高度相關、期望值又有閉式的「親戚」(例如用幾何平均亞式修正算術平均亞式),拿親戚的已知答案校正模擬誤差,相關性越高省得越多;共同亂數——比較兩個情境(例如算希臘值時的上調與下調)時讓它們共用同一組路徑,讓亂數雜訊在相減時對消。這兩招在第九節的工程討論會再回鍋。
七、奇異選擇權巡禮:路徑依賴的性質決定用哪把刀
配齊了四把刀,回到地圖上把常見的奇異選擇權逐一安放。每一種的關鍵都是同一句話:它的 payoff 依賴路徑的哪個統計量?那個統計量對哪種方法友善?
亞式(Asian):payoff 看路徑的平均價。平均是最溫和的路徑統計量——平均把波動抹平,所以同條件下亞式比歐式便宜,而且 payoff 分布更集中、蒙地卡羅估起來更穩。模擬是天然解法:沿路徑求平均本來就是模擬的副產品。加分題:幾何平均版本在對數常態世界有閉式解,正好給算術平均版本當控制變量——閉式解家族退役後轉任「數值方法的校正錨」,零件化哲學的又一例。
障礙(Barrier):payoff 看路徑有沒有觸線。觸線是事件,不是量——這讓它對「監測頻率」異常敏感:連續監測與每日收盤監測的觸發機率差距可觀,定價前必須把合約條款讀清楚。方法上兩條路都通:PDE 把「觸線失效」寫成邊界條件優雅至極;模擬則要小心離散時間步「跳過」障礙的偏差——路徑在兩個觀察點之間可能碰過線又彈回來。
回望(Lookback):payoff 看路徑的極值(用最高價賣、用最低價買那種夢幻合約)。極值比平均極端得多——它對波動率與偏斜的形狀高度敏感,天然是模擬的地盤;也因為「整條路徑的最大值」這種量對分布尾部錙銖必較,它常被拿來當「模型偏斜校準得好不好」的照妖鏡。
數位(Digital):payoff 是不連續的階梯——差一分錢,全有或全無。歐式數位有閉式(第二節的 \(N(d_2)\) 零件);麻煩在希臘值:到期臨近、價格貼著履約價時,delta 與 gamma 在階梯邊緣爆炸,模擬版的希臘值更是雜訊災區。美式數位(觸價即付)則多一層路徑依賴,需要模擬或 PDE;一個實用的心智錨點:在無漂移的對稱世界裡,「觸線一次」的機率約是「到期停在線外側」機率的兩倍——反射原理——所以美式數位約值歐式數位的兩倍,真實市場偏離這個比例的程度,本身就是漂移與偏斜的訊號。
多資產(一籃子、彼此相關的結構品):payoff 本身可能不刁,刁在維度。三個資產的 PDE 已經接近工程極限,蒙地卡羅是唯一活路——外加一項前置作業:資產間的相關結構得先校準好,而相關性恰恰是市場上最難觀察的參數之一。
一句話收攏本節:路徑統計量越極端(平均 < 觸線 < 極值),對模型細節越敏感;維度越高,越早改投蒙地卡羅。選型地圖(FIG. 15-1)的右半邊就是這條規律的圖形版。
八、美式遇上蒙地卡羅:最小平方蒙地卡羅
地圖上還剩最後一個空格:美式 payoff × 高維/路徑依賴模型。樹和 PDE 擅長美式但爬不上高維;蒙地卡羅不怕高維,卻有個結構性尷尬——模擬是向前跑的,而履約決策要向後推。站在某條路徑的某個時點,要決定履約與否,你需要「繼續持有的期望價值」;可是單一路徑只告訴你後來實際發生的一種未來,期望值無從談起。
Longstaff–Schwartz 的最小平方蒙地卡羅(LSM)用一個第 1 章就埋好的工具打穿了這堵牆:迴歸。做法是先把全部路徑模擬完,然後從到期往回走;在每個時點,收集所有價內路徑的「當下股價」與「該路徑後來實現的貼現現金流」,用最小平方法迴歸出一條延續價值曲線——「股價是這樣的路徑,繼續持有平均值多少」。有了這條曲線,每條路徑就能逐一比較「立刻履約拿多少」與「曲線說繼續持有值多少」,決定停或走。
比喻: 運動員的經紀人。二十歲的選手要不要現在轉職業?轉,簽約金是眼前看得到的數字(履約價值);不轉,未來身價是個未知數。經紀人的做法不是預言這位選手的未來,而是拿同齡、同數據的一整批選手的後來際遇做迴歸——「條件像你的人,平均後來值多少」——用橫斷面的統計規律替代單一人生無法重來的期望值。LSM 在每個時點做的正是這件事:拿全體路徑的橫斷面,估出單一路徑看不見的延續價值。
這個「橫斷面迴歸估延續價值」的手法你其實見過兩次:第 1 章講過,監督式學習學的是輸入到輸出的映射,迴歸本質上就是在估計條件期望——LSM 只是把這部機器搬進定價;第 10 章的 QLBS 用橫斷面迴歸做逆向歸納解 Q 函數——LSM 正是那條思路在「純定價」場景的原型。機器學習與定價工程在這裡不是鄰居,是同一家人。
兩個實務註腳。其一,迴歸基底(多項式次數、要不要加 payoff 本身當特徵)影響結果,價內路徑才進迴歸是標準紀律——價外路徑的履約決策無關緊要,混進來只會稀釋擬合。其二,LSM 估出的政策是「迴歸近似下的最優」,略遜於真最優,所以價格帶輕微低偏——作業三會實測這件事:LSM 的答案貼著二項樹基準的下緣。這不是 bug,是方法性格,驗收時要心裡有數。
九、定價器的工程學:速度、希臘值與誠實限界
最後把「工程」這條線收攏。同一顆定價器,在機構裡至少要伺候三種節奏完全不同的客人。
第一種客人:校準。 校準是把模型參數調到重現市場報價的最佳化迴圈,每輪迭代都要對幾十個履約價與到期日重新定價,一次校準動輒數千次定價呼叫。這裡只有閉式與 FFT 級的速度撐得住——蒙地卡羅不能當校準引擎,太慢;標準工作流因此是分層的:用流動性好的歐式報價把參數校準好(快方法的地盤),再拿校準好的參數去給奇異品定價(慢方法登場)。快慢分工,各守一段。
第二種客人:報價與風控的希臘值。 第 16 章會專講希臘值與波動率曲面,這裡先鋪工程面的路:數值方法算希臘值,最普通的做法是「參數上調一次、下調一次、差分」——這意味著每個希臘值要多付兩次完整定價,而且蒙地卡羅版本還有專屬地雷:上調與下調如果各自抽各自的亂數,差分出來的希臘值會被抽樣雜訊淹沒,必須用第六節的共同亂數讓兩次模擬共享路徑。不連續 payoff(數位、障礙)的希臘值更是重災區。方法選型時「價格算得準」只是及格線,「希臘值算得穩」才是實務的錄取線——一個價格準但 delta 跳動的定價器,對沖台一天都用不下去。
第三種客人:嵌在大迴圈裡的重複定價。 組合層級的風險計量要對成千上萬個情境重估整本簿子——單次定價再快,乘上情境數都嫌貴。這正是第 3 章 GP 代理定價登場的位置:離線用真定價器算一批代表點,線上讓代理模型毫秒級回答,帶著不確定性標示。本章與第 3 章至此接成一個閉環:這一章決定真定價器怎麼造,第 3 章決定什麼時候可以不叫它出場。
收尾前,把兩筆常被混成一筆的帳分開——這是本章的誠實限界。方法誤差:數值答案與「模型的精確答案」之間的距離——樹的離散化偏差、差分的網格誤差、蒙地卡羅的抽樣誤差。這筆帳可以用錢壓低:加密格子、多抽路徑,收斂診斷會告訴你還差多遠。模型誤差:模型的精確答案與「市場真實行為」之間的距離——BS 假設常數波動率而市場有微笑,這筆帳加密格子一毛錢都還不掉。把 \(N\) 開到一百萬條路徑,你得到的是「錯誤模型的高精度答案」。分清這兩筆帳,是定價工程師與定價程式員的分水嶺;模型誤差怎麼量、怎麼對沖,是第 16 章以後的主線。
最後三件工程雜務,件件都咬過人:固定隨機種子——不可重現的定價 bug 永遠修不掉;每個數值定價器上線前先對閉式特例回歸測試——BS 算不對的蒙地卡羅引擎沒資格碰 Heston;買賣權平價這類無模型關係要做成自動檢核——它們抓到的 bug,單元測試常常抓不到。
§03原書對照
本章的選型地圖、二項樹與 LSM 展開為本課原創編排;原書以兩章篇幅處理定價技術——第 9 章歐式(印刷頁 183–222)、第 10 章奇異(印刷頁 223–264),以下依頁碼整理原書有、但本課未展開的內容。其一,quadrature 定價:矩形(左點、右點、中點)與梯形法的權重寫法、把定價積分換元到對數價格域再截斷上限的完整步驟,以及 BS 對 Bachelier 的數位選擇權比價例(pp. 184–188)。其二,FFT 定價的完整推導:傅立葉變換與特徵函數的形式定義、阻尼買權價的引入與收斂性論證、數位選擇權的變換式須另行推導(其阻尼參數取負)、外層積分的梯形離散、FFT 標準形式與網格耦合條件 \(2\pi/N = \Delta\nu\,\Delta k\)、履約價網格的對齊技巧與內插取捨(pp. 189–202)。其三,FFT 技術參數的敏感度討論:五參數僅三個自由度、阻尼參數理論上不影響價格但實務上選錯會給錯價、以及 Fractional FFT、COS 法、鞍點法三種變體的點名(pp. 202–206)。其四,求根與第一次校準:Newton 法更新式、由市場價反解隱含波動率、VIX 選擇權的買權側偏斜實例(pp. 206–209)。其五,最佳化理論的自成一節:一二階條件、Lagrange 乘數、兩資產最小變異組合閉式解與股債實例(pp. 209–217)。其六,波動率曲面校準的實務學:目標函數與權重設計的種種抉擇、參數邊界、正則化穩定參數時間序列、校準偏好無梯度法的原因(FFT 目標函數的數值導數被雜訊污染)、以及 BRLJPY 曲面的 CEV 校準例(pp. 217–222)。其七,模擬的機率基礎與亂數工程:大數法則與中央極限定理對收斂率的推導、亂數生成器選型、逆變換法與接受拒絕法的完整推導、相關常態的 Cholesky 對特徵值分解取捨(pp. 226–236)。其八,SDE 離散化的模型實作:Euler 格式、GBM 精確模擬、Heston 離散化後變異數轉負的三種處置(吸收、截斷、反射)及其偏差方向、Variance Gamma 的 gamma 時鐘模擬(pp. 236–241)。其九,變異數縮減工具箱的另外兩件:控制變量最適係數的推導、重要性抽樣與測度變換(pp. 241–244);以及 Heston 偏斜對回望選擇權價格影響的完整實驗(pp. 246–247)。其十,PDE 數值解的嚴格展開:四種差分的 Taylor 推導、三種格式的三對角矩陣形式、顯式格式的穩定性條件、多維 PDE 與 PIDE 的困難(pp. 247–261)。其十一,美式數位與反射原理二倍法則的推導及其作為相對價值訊號的用法(pp. 261–263)、單資產對多資產的選型總綱(pp. 263–264)。注意:原書並未展開二項樹,Longstaff–Schwartz 亦僅兩處點名(pp. 245, 261)——本課第四、八節是為銜接第 10、14 章而做的原創補充。
§04作業和解答
作業一:美式買權什麼時候值得提前履約?
用第四節的 CRR 樹加上連續股利率 \(\delta\)(風險中性機率改為 \(q = (e^{(r-\delta)\Delta t} - d)/(u - d)\)),對 \(S=100\)、\(K=95\)、\(r=3\%\)、\(\sigma=25\%\)、\(T=1\)、\(N=800\),分別在 \(\delta = 0\%, 3\%, 6\%\) 下計算歐式與美式買權價格。解釋觀察到的提前履約溢價模式,並說明它與第四節美式賣權的差異。
解答 SOLUTION
import math
import numpy as np
def crr(S, K, r, delta, sigma, T, N, kind, american):
"""CRR 二項樹,含連續股利率 delta"""
dt = T / N
u = math.exp(sigma * math.sqrt(dt)); d = 1.0 / u
q = (math.exp((r - delta) * dt) - d) / (u - d)
disc = math.exp(-r * dt)
j = np.arange(N + 1)
ST = S * u**j * d**(N - j)
V = np.maximum(ST - K, 0.0) if kind == "call" else np.maximum(K - ST, 0.0)
for n in range(N - 1, -1, -1):
V = disc * (q * V[1:] + (1 - q) * V[:-1])
if american:
Sn = S * u**np.arange(n + 1) * d**(n - np.arange(n + 1))
ex = np.maximum(Sn - K, 0.0) if kind == "call" else np.maximum(K - Sn, 0.0)
V = np.maximum(V, ex)
return V[0]
S, K, r, sigma, T, N = 100.0, 95.0, 0.03, 0.25, 1.0, 800
for delta in (0.0, 0.03, 0.06):
eu = crr(S, K, r, delta, sigma, T, N, "call", False)
am = crr(S, K, r, delta, sigma, T, N, "call", True)
print(f"股利率 {delta:.0%}|歐式 {eu:.4f}|美式 {am:.4f}|提前履約溢價 {am-eu:.4f}")
# 輸出:
# 股利率 0%|歐式 13.9603|美式 13.9603|提前履約溢價 0.0000
# 股利率 3%|歐式 12.0339|美式 12.1194|提前履約溢價 0.0855
# 股利率 6%|歐式 10.2942|美式 10.8173|提前履約溢價 0.5231無股利時溢價精確為零:提前履約拿到的是內在價值,但持有買權等於「延後付履約金」——履約金晚付可以多賺利息,加上選擇權的時間價值恆為正,理性持有人絕不提前履約,美式買權與歐式同價。這也是個有用的定價器測試:你的美式引擎在 \(\delta=0\) 的買權上若算出正溢價,必有 bug。股利出現後天平反轉:持有買權錯過股利,股利率越高、「早點拿到股票開始領股利」越誘人,溢價從 0.09 一路升到 0.52。對照第四節:美式賣權不需要股利就有溢價(提早拿到履約金賺利息),美式買權的提前履約完全是股利驅動的——同一個機制(現金流的時間價值),方向相反的兩張臉。
作業二:亞式選擇權與對偶變量實測
對 \(S=100\)、\(K=100\)、\(r=2\%\)、\(\sigma=25\%\)、\(T=0.5\)、每日觀察(63 個觀察點)的算術平均亞式買權,用 10 萬條路徑分別以普通蒙地卡羅與對偶變量定價,比較標準誤並換算等精度的成本節省。另外解釋:為什麼亞式的價格明顯低於同參數的歐式買權(第六節真值 5.3766)?
解答 SOLUTION
import math
import numpy as np
S, K, r, sigma, T = 100.0, 100.0, 0.02, 0.25, 0.5
M = 63 # 每日觀察:半年約 63 個交易日
dt = T / M
rng = np.random.default_rng(152)
def asian_mc(n_paths, antithetic=False):
"""算術平均亞式買權:整條路徑模擬"""
half = n_paths // 2
Z = rng.standard_normal((half, M))
Z = np.vstack([Z, -Z]) if antithetic else np.vstack([Z, rng.standard_normal((n_paths - half, M))])
logS = np.log(S) + np.cumsum((r - 0.5*sigma**2)*dt + sigma*math.sqrt(dt)*Z, axis=1)
A = np.exp(logS).mean(axis=1) # 路徑上的算術平均價
payoff = np.exp(-r*T) * np.maximum(A - K, 0.0)
if antithetic:
payoff = 0.5 * (payoff[:half] + payoff[half:])
return payoff.mean(), payoff.std(ddof=1) / math.sqrt(len(payoff))
n = 100_000
est_p, se_p = asian_mc(n)
est_a, se_a = asian_mc(n, antithetic=True)
print(f"普通 MC :{est_p:.4f} ± {se_p:.4f}")
print(f"對偶變量:{est_a:.4f} ± {se_a:.4f}")
print(f"標準誤縮為 {se_a/se_p:.2f} 倍;等精度所需路徑約 {(se_a/se_p)**2:.2f} 倍")
# 輸出:
# 普通 MC :4.3512 ± 0.0209
# 對偶變量:4.3491 ± 0.0158
# 標準誤縮為 0.76 倍;等精度所需路徑約 0.57 倍對偶變量把標準誤壓到 0.76 倍——等精度只需 57% 的路徑,效果比第六節的價外歐式買權(約 0.85 倍)更好,因為平價亞式的 payoff 對「路徑整體偏高或偏低」更接近單調對稱,鏡像抵銷更徹底。價格層面:亞式 4.35 對歐式 5.38(注意兩者履約價不同,嚴格比較應同參數重算,方向結論不變)——平均價的波動天生小於單日到期價(平均把日間波動抹掉一截),payoff 的離散度縮小,選擇權自然便宜。這也解釋了亞式在實需避險市場的人氣:進出口商在乎的本來就是「這一季的平均匯率」,而且它比歐式便宜。
作業三:Longstaff–Schwartz 最小可行版
用 10 萬條路徑、50 個履約時點、二次多項式基底,實作 LSM 為第四節同參數(\(S=100, K=105, r=2\%, \sigma=25\%, T=0.5\))的美式賣權定價,與二項樹 \(N=800\) 的基準 9.4556 對照。說明:(1) 為什麼只用價內路徑做迴歸;(2) 結果為何略低於樹的基準。
解答 SOLUTION
import math
import numpy as np
S, K, r, sigma, T = 100.0, 105.0, 0.02, 0.25, 0.5
M = 50 # 履約時點數
dt = T / M
disc = math.exp(-r * dt)
rng = np.random.default_rng(153)
n_paths = 100_000
Z = rng.standard_normal((n_paths, M))
logS = np.log(S) + np.cumsum((r - 0.5*sigma**2)*dt + sigma*math.sqrt(dt)*Z, axis=1)
paths = np.exp(logS) # (n_paths, M)
cash = np.maximum(K - paths[:, -1], 0.0) # 到期現金流
for t in range(M - 2, -1, -1): # 從到期倒數第二個時點往回走
cash *= disc # 現金流先往回貼現一步
St = paths[:, t]
itm = K - St > 0 # 只挑價內路徑
X = St[itm]
basis = np.column_stack([np.ones_like(X), X, X**2]) # 二次多項式基底
coef, *_ = np.linalg.lstsq(basis, cash[itm], rcond=None)
cont = basis @ coef # 迴歸出的延續價值
ex = K - X # 立刻履約的價值
exercise = ex > cont
idx = np.where(itm)[0][exercise]
cash[idx] = ex[exercise] # 這些路徑改領履約現金流
price = disc * cash.mean() # 貼回 t=0
se = disc * cash.std(ddof=1) / math.sqrt(n_paths)
print(f"LSM 美式賣權 {price:.4f} ± {se:.4f}(二項樹 N=800 基準 9.4556)")
# 輸出:LSM 美式賣權 9.4252 ± 0.0276(二項樹 N=800 基準 9.4556)(1) 價外路徑當下履約價值為零,履約決策必然是「繼續持有」,不存在需要估計的比較;把它們塞進迴歸,等於拿一堆與決策無關的樣本去拉扯延續價值曲線在價內區的形狀——決策發生在價內,迴歸就該只餵價內。(2) LSM 的 9.4252 貼著基準 9.4556 的下緣(差約 0.03,超出一個標準誤)。機制:迴歸曲線只是真延續價值的近似,照著近似曲線做的停止決策是次優政策,而任何次優政策算出的期望現金流都不會超過真最優——所以 LSM 天生帶輕微低偏,基底越貧乏低偏越重。實務驗收的紀律:換基底(加三次項、加 payoff 函數)看價格是否穩定,並永遠拿低維特例對照樹或 PDE 的基準——就像這裡做的一樣。
作業四:選型地圖實戰
替下列四張單子各選一種定價技術(閉式、FFT、樹或 PDE、蒙地卡羅),並用選型地圖的兩問(payoff 依賴什麼?模型給了什麼?)各寫兩三句理由:(a) Heston 模型下,為整條履約價網格的歐式選擇權報價做每日參數校準;(b) BS 假設下的單一歐式數位選擇權;(c) 五檔股票的一籃子平均價亞式買權;(d) BS 假設下的單一美式賣權,並要求輸出整條「股價 × 時間」的價值曲面供風控使用。
解答 SOLUTION
(a) FFT。payoff 只依賴到期價(歐式),模型密度未知但特徵函數有解析式——擬閉式的教科書場景;且校準迴圈每輪要重算整條履約價網格幾千次,只有「一次 FFT 出整批價格」的吞吐量撐得起最佳化迭代。蒙地卡羅在這裡直接出局:不是不準,是等不起。
(b) 閉式。payoff 只看到期價、模型給了完整密度,答案就是 \(e^{-rT}N(d_2)\) 一行字——動用任何數值方法都是浪費。唯一要小心的是它的希臘值在到期前後的爆炸行為,那是合約性質,換方法也躲不掉。
(c) 蒙地卡羅。payoff 同時依賴路徑(平均價)與五個資產(維度五),樹與 PDE 在五維網格上成本爆炸,閉式與 FFT 對這種 payoff 推不出公式——地圖上只剩一格。配套:先校準五檔資產的相關結構,並考慮用幾何平均亞式當控制變量壓變異數。
(d) 樹或 PDE,且以 PDE 為佳。美式履約需要往回走的方法;模型一維、payoff 簡單,正是格點法的主場。既然風控指定要整張 \(V(S,t)\) 曲面,PDE 勝出——它解完網格本來就交出整張曲面,delta 與 gamma 差分即得;樹要湊出同樣的輸出反而繞路。蒙地卡羅加 LSM 雖然也能算美式,但在一維問題上是拿萬用刀削鉛筆。
§05參考資料
- Black, F., & Scholes, M. (1973). The Pricing of Options and Corporate Liabilities. Journal of Political Economy 81(3) — 閉式解家族的奠基論文,本章第二節公式的原始出處。
- Cox, J. C., Ross, S. A., & Rubinstein, M. (1979). Option Pricing: A Simplified Approach. Journal of Financial Economics 7(3) — CRR 二項樹的原始論文:離散格子上的無套利定價,極限收斂到 BS。
- Carr, P., & Madan, D. B. (1999). Option Valuation Using the Fast Fourier Transform. Journal of Computational Finance 2(4) — 特徵函數定價與 FFT 的經典路線,本章第三節直覺的嚴格版。
- Longstaff, F. A., & Schwartz, E. S. (2001). Valuing American Options by Simulation: A Simple Least-Squares Approach. Review of Financial Studies 14(1) — LSM 原始論文:橫斷面最小平方迴歸估延續價值,本章第八節與作業三的依據。
- Glasserman, P. (2003). Monte Carlo Methods in Financial Engineering. Springer — 金融蒙地卡羅的標準參考書:路徑生成、變異數縮減、美式模擬定價的系統處理。
- Kelliher, C. (2022). Quantitative Finance with Python: A Practical Guide to Investment Management, Trading, and Financial Engineering. Chapman and Hall/CRC — 本課程 Part 4 對照之原書,定價技術見第 9 章(pp. 183–222)與第 10 章(pp. 223–264)。