一種不一樣的模擬
這一級的第一篇把模擬封為科學的第三根支柱,第二篇則帶你走過一場流體流動,那裡每個格點都服從一條確定性的規則——轉動離散化方程式的曲柄,同樣的初始資料永遠給出同樣的答案。計算金融也是模擬,但它的機房長得完全不同。在這裡,未來是真正不確定的:下個月的股價不是我們能算出來的一個數字,而只是我們能去抽樣的一個數字「分佈」。計算金融就是為那些價值取決於這不確定未來的合約定價、管理其風險的技藝,而它的主力不是一台亦步亦趨往前輾的偏微分方程求解器,而是一股隨機情境的洪流。
從最簡單的合約開始:一份股票的歐式買權,是一個權利(而非義務),讓你在固定的未來日期 T、以固定的「履約價」K 買進一股。若到了 T 時股票成交在 S,你只在 S 高於 K 時履約,賺進 S − K;否則你就空手離開、什麼也沒有。所以報酬是 max(S − K, 0)。整個定價問題就是:在知道今天的價格、卻不知道明天的情況下,那筆不確定的未來報酬「現在」值多少?金融數學給的深刻答案是:公平價格就是在一種特殊機率規則(風險中立測度)下報酬的「期望值」,再折現回今天。期望值是對所有可能未來取的平均——而對一個分佈取平均,骨子裡就是一個積分。
從同一方程式出發的兩條路
1973 年,Black、Scholes 與 Merton 證明:若股價依一個特定的隨機過程漫遊(幾何布朗運動,帶有固定的波動率 sigma),那麼選擇權的價值 V——作為股價與時間的函數——服從一條偏微分方程,也就是 Black-Scholes 方程式。它是一條擴散方程,與你在偏微分方程級數裡會遇到的熱方程是近親;而對最樸素的歐式買權,它甚至有乾淨的封閉解:那條以標準常態的累積分佈寫成的著名 Black-Scholes 公式。當有一條俐落的公式存在時,就「用它」——求值只是幾微秒的工作,而且比任何模擬都準得多。
那為什麼還要模擬?因為封閉解是個幸運的特例。幾乎改動任何東西——讓報酬取決於「整條路徑」(亞式選擇權對時間上的價格取平均)、讓底下有五個相關的標的資產、讓波動率本身是隨機的、讓持有人能提前履約——公式就蒸發了。此時你面對的是在一個可能有幾十、上百維度(一個資產或一個時間步一維)的空間上取期望值(一個積分)。這正是積分那幾篇警告過的那道牆:維度的詛咒。一個每軸放 100 點的網格型數值積分法,在 d 維裡需要 100^d 個點——d = 10 時就是 10^20 個點,徹底沒指望。確定性的偏微分方程那條路,在一兩維時那麼好用,到這裡卻死了。
蒙地卡羅:對隨機未來取平均
拯救我們的點子在這裡。既然價格是報酬的期望值,而期望值是許多樣本的長期平均,那就乾脆「把樣本抽出來」:模擬數千個可能的未來,在每一個裡算出選擇權的報酬,再取平均。這就是蒙地卡羅積分,它的邏輯直接得幾乎令人不好意思——就是把大數法則寫成一個演算法。要在幾何布朗運動下模擬一個未來,你只需要一樣材料:一個標準常態亂數 Z,而你用 Box-Muller 轉換從均勻亂數把它製造出來。一個 Z 給你一個到期股價;一個到期股價給你一個報酬;把一百萬個取平均再折現,就給你一個價格。
price = 0
for i = 1 .. N:
Z = standard_normal() # via Box-Muller
S_T = S0 * exp( (r - sigma^2/2)*T + sigma*sqrt(T)*Z )
price = price + max(S_T - K, 0)
price = exp(-r*T) * price / N # discount the average
error ~ C / sqrt(N) # to halve error, do 4x the work
std_error = (sample stddev of payoffs) / sqrt(N) # the bonus: free error bar有兩個性質讓這不只是個玩具。第一,蒙地卡羅誤差以 O(1/sqrt(N)) 縮小:樣本翻四倍才把誤差減半——和你先前見過的數值積分法那種 O(h^2) 或 O(h^4) 的收斂比起來,慢,慢得令人心痛。第二,而這正是魔法所在,那個 1/sqrt(N) 的速率「與維度無關」。不論報酬取決於一個資產還是三百個,誤差公式裡根本沒有 d。對網格法致命的維度詛咒,根本咬不到蒙地卡羅。這筆交易——放棄快收斂以逃離維度之牆——正是為什麼為一籃相關資產定價靠的是模擬而不是網格。
那行 std_error 是蒙地卡羅工作裡最棒的單一習慣。因為樣本是隨機的,答案本身就是一個隨機變數,而樣本標準差除以 sqrt(N) 估出你大概偏差多遠——一個約 95% 的信賴區間,大致就是答案加減兩倍那個量。報蒙地卡羅價格時,永遠別漏掉它的誤差棒;一個沒附上不確定度的數字,正藏著你究竟跑了 100 條路徑還是一億條,而它也是判斷何時該停止抽樣的唯一誠實辦法。
讓慢收斂變得可以忍受
O(1/sqrt(N)) 很殘酷:準確度提升十倍,工作量得花一百倍。所以計算金融有一大塊是變異數縮減——縮小 1/sqrt(N) 前面的那個常數 C,而不是去硬碰那個指數。速率不變,但較小的 C 意味著整條誤差曲線下移,下移的幅度往往相當於原本得多花 10 倍或 100 倍路徑才換得到的。這些技巧是聰明的改寫,用散得更少的樣本去算「同一個」期望值。
- 對偶變數法:對每個亂數抽樣 Z,也用它的鏡像 −Z。兩者負相關,誤差會部分抵消——對由對稱常態驅動的路徑,這幾乎免費地把變異數砍掉一半。
- 控制變數法:減去一個你「確實」知道精確值的相關量(例如為亞式選擇權定價時,用一個有封閉解的幾何平均版本去校正)。你只模擬那小小的殘差,而它散得少得多。
- 重點抽樣:一份深度價外的選擇權只在罕見的未來才有報酬,於是大多數樣本貢獻為零、估計值很嘈雜。優先從重要的區域抽樣,再重新加權——把力氣集中在報酬所在的地方。
另一個不同而強大的角度,是乾脆拋棄真正的隨機。擬蒙地卡羅用一個確定性的「低差異序列」取代偽隨機點——那些經過設計(Sobol、Halton)的點均勻鋪開,避開隨機點難免留下的成團與空隙。樸素的隨機抽樣會有倒楣的群聚;低差異序列把空間填得均勻得多,而對許多金融積分,誤差此時下降得更接近 O(1/N) 而非 O(1/sqrt(N))——大幅加速。誠實的代價:在真正高的有效維度裡,那個更好的速率並無保證;而且那些點不是隨機的,所以簡單的 sqrt(N) 誤差棒不再適用——你得靠把序列隨機化再重跑來估不確定度。
數字從哪來——又從哪反咬
上面每一條路徑都倚賴 'standard_normal()',它倚賴一串均勻數,而那來自一個偽隨機數產生器。那個「偽」字承重很大、值得停下來想想:這些數字根本不是隨機的。它們是一串完全確定的序列,由一個固定的遞迴關係產生,只是「模仿」隨機到足以通過統計檢定罷了。固定種子,你每次都會得到位元對位元一模一樣的那次「隨機」運行。這種確定性是優點而非缺陷——正是它讓蒙地卡羅結果可重現、可除錯——但它也意味著一個藏有結構的弱產生器(比如一個老舊的線性同餘產生器)會悄悄讓你的樣本相關、毒害答案。請伸手去拿一個經過充分檢驗的產生器,例如 Mersenne Twister,而且永遠別自己寫。
在你信任一個價格之前,還有兩個誠實的告誡。第一是這座階梯每一篇都一再重複的那句:答案是浮點的,因此是近似的。把一百萬個報酬加總會累積捨入誤差,計算 exp 與報酬也可能丟失位數——就是那個讓加法連結合律都不成立的浮點現實。在蒙地卡羅裡,這通常被遠大得多的抽樣誤差淹沒,但對於像「兩個大數的微小差」這類的價內報酬,要當心災難性抵消。第二個更危險,因為它會躲:這裡有「兩個」分開的誤差,而它們不是同一類東西。
帶上階梯的東西
把線索收攏。選擇權價格是折現後的期望報酬,那是一個對不確定未來取的積分。在低維裡,偏微分方程或 Black-Scholes 公式完勝;但路徑相依、多資產或隨機波動率的合約會爆成高維積分,那裡維度詛咒會扼殺網格。蒙地卡羅靠對隨機情境取平均來作答:它 O(1/sqrt(N)) 的收斂很慢,卻幸運地與維度無關,而變異數縮減或擬蒙地卡羅則討回大部分速度。永遠帶著誤差棒、為可重現性帶著種子,以及數值誤差與模型誤差之間那道鋒利的分界。
往前看,因為金融也正是下一篇那座雙向橋樑最先收割成果的地方。一個交易台想要的不只是價格——它要的是「Greeks」,也就是價格對輸入的敏感度(它的導數),用來避險。對每個輸入做微擾再重跑蒙地卡羅既嘈雜又昂貴;反過來,用自動微分去微分模擬本身——正是那台訓練神經網路的引擎——能在一趟掃描裡給出所有敏感度。這就是通往科學機器學習的門:同一套最佳化與自動微分的機具,既驅動一台定價引擎、也驅動一個深層網路,而點子如今雙向流動。下一篇會完整地走過那座橋。