M3.4 每條路徑對,還是最後的分佈對:Weak 與 Strong Convergence
本篇重用M3.1水流加亂流:SDE 是加了噪聲的 ODE·M2.3導航每 30 秒更新一次:Euler 法與它的誤差·M3.0醉漢一小時後在哪:Random Walk 到 Brownian Motion
一百條假的股價
你寫了一個程式模擬股價:每天的漲跌有一個平均趨勢,加上隨機波動——就是 M3.1 的 SDE,用 Euler–Maruyama 一天一步跑一年。老闆問:「這個模擬準不準?」
你跑了一百條路徑,畫出來像一百條真的股價圖。但「準」是什麼意思?有兩種可能的回答,它們聽起來差不多、要求卻差很多:
- 每一條路徑都對。 如果真實世界擲出了某一串隨機的漲跌(同一組硬幣),我的模擬走出來的那條線,要跟「用同一串硬幣、但以無限小的步長算出來」的真實路徑幾乎重合。
- 最後的分佈對。 我不在乎哪一條線對哪一條,只在乎一年後價格的分佈——平均、變異、超過某個門檻的機率——跟真實的一樣。
先用直覺想:這兩個要求哪個比較嚴格?「一天一步」對哪一個來說夠?如果要把誤差減半,兩個要求各需要把步長縮小多少?寫下你有多確定。
課堂提問Q1
把兩個要求翻成數學。「同一串硬幣」在 SDE 的語言裡是什麼?兩個要求各在比較哪個量?
先想一想,再展開看整理後的答案
最容易卡住的是「同一串硬幣」這個說法。M3.0 說 SDE 裡的隨機性是一條 Brownian motion ;「同一串硬幣」就是同一條 的實現。真實路徑 是用這條 走出來的極限,模擬路徑 是用同一條 在步長 下、每步只看 走出來的。兩者共用噪聲,所以可以逐條相減。
要求一(strong)比較的是同一條噪聲下的終點差距,取期望:
要求二(weak)不共用噪聲——真實與模擬各自抽自己的樣本,只比較某個統計量:
對一類夠光滑的測試函數 (平均是 、二階動差是 、超過門檻的機率是一個平滑化的階梯函數)。weak 說的是分佈接近,strong 說的是路徑接近。
兩者的關係一句話:strong 蘊含 weak(路徑都對了,分佈當然對),反之不成立——分佈對了,每條路徑可以完全對不上。
先看畫面:兩把尺
想像兩位評審在看你的模擬。
第一位拿著真實路徑的描圖紙,把你的每一條線疊上去比,量每一對線終點的差距,取平均。這是 strong 的尺——它在意「這一條對這一條」。
第二位根本不看哪條對哪條。她把你的一百個終點倒進一個直方圖,把真實的一百個終點倒進另一個直方圖,比兩個直方圖像不像。這是 weak 的尺。
第二位評審寬鬆得多:只要你的路徑「在統計上」走得像,就算每一條都跟真實的錯開,她也給滿分。而寬鬆的尺會給出更快的收斂——同樣的步長縮小一半,weak 誤差減半,strong 誤差只減到原來的 。
寫成數學:一個方法,兩個階數
M2.3 對 ODE 說 Euler 的全域誤差是 。對 SDE,Euler–Maruyama 的結論是 [1, 2]:
我們說 Euler–Maruyama 有 strong order 、weak order 。同一個演算法,兩個速率。這不是兩個定理巧合地不一樣,而是同一件事的兩面,可以在一個小例子裡看清楚。
看最簡單的 SDE (沒有 drift,噪聲乘在 上——這正是股價模型的骨架)。Euler–Maruyama 一步是 。真實的一步(用 Itô 的結果,這門課只引用)是 。把指數展開到二階:
Euler 少掉的那一項是 。現在用兩把尺量它:
- Strong 的尺看它的大小。 的典型大小是 (M3.0:),所以 的標準差是 。每步漏掉的量 ,但這些漏掉的量是隨機的、正負互相獨立, 步累積起來像 random walk:總和 。這就是 。
- Weak 的尺看它的平均。——這一項在平均下完全消失。剩下的偏差來自更高階的項,每步 , 步累積成 。這就是 。
一句話:Euler 每步漏掉的主要誤差是一個零均值的隨機量。 逐路徑比,它累積成 ;只比分佈,它平均掉了,剩下的是 。
展開細節一般 SDE 的版本:為什麼 strong 是 1/2、weak 是 1(Kloeden & Platen 的兩個定理)
一般 dx = f(x)dt + g(x)dW。Euler–Maruyama 的單步展開比真實解少掉的首項是 ½ g(x)g′(x)[(ΔW)² − h](Itô–Taylor 展開的下一項;補上它就是 Milstein 方法,strong order 升到 1)。
Strong:這一項的 L² 大小是 O(h),各步近乎獨立,N = T/h 步以「平方和開根號」累積 → O(√(N h²)) = O(h^{1/2})。若 g 是常數(additive noise),這一項恆為零,Euler–Maruyama 的 strong order 直接變成 1。
Weak:對光滑的 φ,令 u(t,x) = E[φ(x_T) | x_t = x](它滿足向後的 Kolmogorov 方程)。單步的 weak 誤差是 E[u(t+h, x̂_{t+h})] − E[u(t+h, x_{t+h})];把 u 對 x 展開,零均值的隨機項全部被期望消掉,剩下的首項是 O(h²);N 步累積成 O(h)。條件:φ、f、g 要夠光滑(一般要求 φ 有四階以上的有界導數);φ 是不光滑的指標函數時,weak order 可能掉到 1/2。這門課只用結論,證明見 Kloeden & Platen [1] 第 10 與 14 章、Milstein & Tretyakov [4]。
回到股價:該拿哪把尺
回答老闆。「準不準」取決於他要拿模擬做什麼:
- 若他要的是一年後價格的分佈——平均報酬、風險值、超過某門檻的機率——那是 weak 的問題。一天一步()給 的偏差,通常已經遠小於這些統計量本身的抽樣誤差(一百條路徑的 Monte Carlo 誤差 )。把步長縮小一半,偏差減半。
- 若他要的是逐日對照某條真實走勢——例如拿模擬去對沖一條特定路徑、或做路徑相依的產品定價時需要每條路徑本身準——那是 strong 的問題。一天一步的誤差是 ,要減半得把步長縮到四分之一。
多數「模擬」的目的其實都是第一種:我們要的是樣本,不是某一條特定的路徑。這時 strong error 是過度嚴格的尺——你為一個沒人要求的目標付出了四倍的計算。這就是為什麼「用 SDE 抽樣本」的世界裡,看的永遠是 weak error。
這個判斷依賴兩個假設。第一,被比較的統計量夠光滑——weak order 是對光滑 說的,若你要的是「價格恰好超過 100 的機率」這種階梯函數,階數會掉。第二,你不需要共用噪聲——一旦你的用途要求「同一組隨機數下模擬與真實對上」(例如把模擬拿去和真實資料逐日對比),你就回到了 strong 的世界。
回到股價:把兩條斜率量出來
import numpy as np
rng = np.random.default_rng(1)
sigma, T, M = 1.0, 1.0, 20000 # M = 路徑數(步數在下面叫 N = T/h)
W_fine = np.cumsum(np.sqrt(1/4096) * rng.standard_normal((M, 4096)), axis=1) # 一條「真實」Brownian motion
x_true = np.exp(sigma * W_fine[:, -1] - 0.5 * sigma**2 * T) # dx = σ x dW 的精確解(Itô)
for h in [1/16, 1/64, 1/256]:
k = int(4096 * h)
dW = np.diff(np.concatenate([np.zeros((M, 1)), W_fine[:, k-1::k]], axis=1), axis=1) # 同一條 W,粗步長
x_em = np.prod(1 + sigma * dW, axis=1)
strong = np.abs(x_em - x_true).mean() # 共用噪聲,逐路徑比
weak_exact = abs((1 + sigma**2 * h)**(T/h) - np.exp(sigma**2 * T)) # φ(x)=x²:E[x̂²] 有 closed form,真值是 e
weak_mc = abs((x_em**2).mean() - np.exp(sigma**2 * T)) # 同一個量用 20000 條路徑估
print(f"h={h:.4f} strong={strong:.3f} weak(exact)={weak_exact:.4f} weak(MC)={weak_mc:.3f}")
# 期待:h 縮 4 倍,strong 約減半(order 1/2)、weak(exact) 約減 4 倍(order 1);weak(MC) 被抽樣誤差蓋住
三個步長下,strong error 大約是 ——步長每縮 4 倍誤差減半,斜率 。weak error 對 可以精確算(,真值是 ):,每次減 4 倍,斜率 。把兩條線畫在 log–log 圖上,一條 、一條 。
順帶看 weak(MC) 那一欄:用兩萬條路徑估同一個量,數字大約在 – 之間跳、幾乎不隨 下降——因為 的抽樣誤差()早就大過離散化偏差。這正是後面 quiz 要問的事:瓶頸已經不在步長。
(為什麼不用 ?因為 對任何 都精確成立——Euler–Maruyama 保住了這個 SDE 的平均,weak error 恰為零。挑一個會出錯的 才量得到斜率。)
刻意違反一個假設。 把 換成 (超過起始價的機率)。weak error 的斜率會從 1 掉下來——階梯函數不光滑,展開框裡「把 對 展開」的步驟失效。再把 換成模擬與真實各自獨立抽的噪聲:strong error 不再隨 下降(兩條路徑本來就不該對上),只剩 weak error 有意義。
先消化一下
參考文獻
- Kloeden, P. E., Platen, E. Numerical Solution of Stochastic Differential Equations. Springer, 1992.(第 9.6 節 strong convergence 定義、第 9.7 節 weak convergence 定義;第 10.2 節 Euler 的 strong order 1/2;第 14.1 節 weak order 1。)
- Higham, D. J. An Algorithmic Introduction to Numerical Simulation of Stochastic Differential Equations. SIAM Review 43(3), 2001.(用 逐段實作並量出兩個階數的教學文章;本篇程式的原型。)
- Särkkä, S., Solin, A. Applied Stochastic Differential Equations. Cambridge University Press, 2019.(第 8 章:Euler–Maruyama、Milstein、strong 與 weak order。)
- Milstein, G. N., Tretyakov, M. V. Stochastic Numerics for Mathematical Physics. Springer, 2004.(weak approximation 的一般理論與對 光滑性的要求。)