第7節 蒙卡模擬計算路徑依賴型期權價格

bifnhlp發表於2020-11-08

第7節 蒙卡模擬計算路徑依賴型期權價格

7.1 簡介

       
蒙特卡羅模擬計算期權價格是將股票價格變化過程離散化,通過隨機數產生器對每一小段股價變化進行抽樣,累計得到一次股價變化過程抽樣結果,然後計算出對應的期權價格。進行多次股價變化過程抽樣計算出期權價格的平均價並貼現,即為蒙卡模擬得出的期權價格。
       
由於抽樣股價過程可以得到完整的股價變化路徑,所以可以直接由抽樣結果得到路徑依賴型期權的價格。這是蒙特卡羅模擬計算期權價格相對於樹形計算期權價格的一個優勢。

7.2 蒙卡模擬計算回望/亞式期權價格演算法

       
以浮動回望看漲期權和亞式平均價格看漲期權為例。浮動回望看漲期權執行時的價格為 max ⁡ ( S T − S m i n ,   0 ) \max(S_T-S_{min}, \, 0) max(STSmin,0) S T S_T ST為執行時刻股票價格, S m i n S_{min} Smin為歷史股價極小值;平均價格看漲期權執行時價格為 max ⁡ ( S a v e − K ,   0 ) \max(S_{ave}-K,\,0) max(SaveK,0) K K K為約定執行價格, S a v e S_{ave} Save為歷史平均股價。

  1. 根據給定引數,確定股價變化離散化後過程,這裡我們使用指數形式。
    S ( t + Δ t ) = S ( t )   e ( r − 1 2 σ 2 ) Δ t + ε σ Δ t ,      ε ∼ N ( 0 , 1 ) ,      Δ t = T N . S(t+\Delta t)=S(t)\,e^{(r-\frac{1}{2}\sigma^2)\Delta t+\varepsilon \sigma\sqrt{\Delta t}},\;\; \varepsilon \sim \mathcal N(0, 1), \;\; \Delta t =\frac{T}{N} . S(t+Δt)=S(t)e(r21σ2)Δt+εσΔt ,εN(0,1),Δt=NT.
  2. S ( t = 0 ) = S 0 S(t=0)=S_0 S(t=0)=S0開始,依照股價離散化變化過程進行抽樣,共 N N N次。得到一條股價變化的抽樣路徑。
  3. 對於浮動回望看漲:由抽樣股價變化路徑計算出 max ⁡ ( S T − S m i n ,   0 ) \max(S_T-S_{min},\,0) max(STSmin,0),乘以貼現因子 e − r T e^{-rT} erT,得到浮動看漲期權的一次抽樣價格;對於平均價格看漲:由抽樣股價變化路徑計算出 max ⁡ ( S a v e − K ,   0 ) \max(S_{ave}-K,\, 0) max(SaveK,0),乘以貼現因子 e − r T e^{-rT} erT,得到平均價格期權的一次抽樣價格。
  4. 重複步驟2、3共 M M M次,對得到的期權價格取平均值,即為蒙卡模擬計算出的目標期權價格。

7.3 演算法Python程式碼實現

import numpy as np
import math

E = math.e

def sample_S_path(r, sigma, S_0, T, N):
    S = S_0
    path = [S]
    dt = T/N
    for i in range(N):
        S *= E**((r-0.5*sigma*sigma)*dt+sigma*np.random.normal()*dt**0.5)
        path.append(S)
    return path

def MC_float_lookback_call(r, sigma, S_0, T, N, M):
    call_price = 0
    for i in range(M):
        path = sample_S_path(r, sigma, S_0, T, N)
        call_price += 1.0/M*max(0, path[-1]-min(path))
    return call_price*E**(-r*T)

def MC_average_price_call(r, sigma, S_0, K, T, N, M):
    call_price = 0
    for i in range(M):
        path = sample_S_path(r, sigma, S_0, T, N)
        call_price += 1.0/M*max(0, np.average(path)-K)
    return call_price*E**(-r*T)

7.4 計算示例

       
考慮當 r = 0.1 ,    σ = 0.4 ,    S 0 = 50 ,    T = 1 r=0.1, \; \sigma = 0.4, \; S_0 = 50, \; T=1 r=0.1,σ=0.4,S0=50,T=1,離散化步數 N = 150 N=150 N=150,蒙卡抽樣股價變化路徑數 M = 40000 M=40000 M=40000。且對於亞式平均價格看漲期權,執行價格 K = 50 K=50 K=50。計算浮動回望看漲和平均價格看漲期權價格結果分別如下:

float_lookback_call = MC_float_lookback_call(0.1, 0.4, 50, 1, 150, 40000)
average_price_call = MC_average_price_call(0.1, 0.4, 50, 50, 1, 150, 40000)
print("歐式浮動回望看漲期權價格:{0:.5f}".format(float_lookback_call))
print("亞式平均價格看漲期權價格:{0:.5f}".format(average_price_call))
歐式浮動回望看漲期權價格:15.42357
亞式平均價格看漲期權價格:5.59780

7.5 相關說明

7.5.1 由均勻分佈產生正態分佈隨機數

       
雖然一般程式語言常用庫中都有正態分佈隨機數產生器。但有些情況下我們可能希望使用比較高質量的均勻分佈隨機數產生器來產生正態分佈樣本。一般而言,使用均勻分佈抽樣其它分佈,需要使用目標分佈的累積概率函式的逆函式,或者需要一個輔助累積概率函式加上一定概率接受抽樣。這裡針對標準正態分佈,我們介紹一下Box-Muller方法,通過抽樣兩個均勻分佈樣本來產生一個標準正態分佈樣本。
       
考慮 x , y x, y x,y座標上相互獨立的二維標準正態分佈,其概率密度函式為 f ( x , y ) = 1 2 π e − x 2 + y 2 2 f(x,y) = \frac{1}{2\pi}e^{-\frac{x^2+y^2}{2}} f(x,y)=2π1e2x2+y2。在極座標系中, f ( r , ϕ ) = 1 2 π e − 1 2 r 2 f(r,\phi) = \frac{1}{2\pi}e^{-\frac{1}{2}r^2} f(r,ϕ)=2π1e21r2,且邊緣概率函式
F ( r ) = ∫ 0 r ∫ 0 2 π f ( s , ϕ )   s   d ϕ   d s = ∫ 0 r e − 1 2 s 2 d s = 1 − e − 1 2 r 2 . F(r) = \int_0^r\int_0^{2\pi}f(s,\phi)\,s\,d\phi\, ds = \int_0^r e^{-\frac{1}{2}s^2}ds=1-e^{-\frac{1}{2}r^2}. F(r)=0r02πf(s,ϕ)sdϕds=0re21s2ds=1e21r2.
其逆函式為 F − 1 ( x ) = − 2 ln ⁡ ( 1 − x ) F^{-1}(x) = \sqrt{-2\ln{(1-x)}} F1(x)=2ln(1x) 。由於二維標準正態分佈抽樣結果的 x x x方向投影為一維標準正態分佈抽樣。在極座標系下我們先對徑向的 r r r抽樣,再對角向的 ϕ \phi ϕ抽樣,然後將結果投影到 x x x座標軸。由於 r ∼ − 2 ln ⁡ ( 1 − t ) ∼ − 2 ln ⁡ t r \sim \sqrt{-2\ln{(1-t)}}\sim \sqrt{-2\ln{t}} r2ln(1t) 2lnt t t t [ 0 , 1 ] [0,1] [0,1]之間均勻分佈的隨機數。 所以 x x x座標軸上的一個標準正態分佈抽樣結果可以表示為 − 2 ln ⁡ t 1 ⋅ cos ⁡ ( 2 π t 2 ) \sqrt{-2\ln{t_1}}\cdot \cos{(2\pi t_2)} 2lnt1 cos(2πt2),其中 t 1 ,   t 2 t_1,\,t_2 t1,t2均為 [ 0 , 1 ] [0,1] [0,1]之間均勻分佈隨機數抽樣。

7.5.2 蒙卡模擬結果與解析解比較

       
參考《期權、期貨及其他衍生產品》第26章,我們知道浮動回望看漲期權價格為:
c f l = S 0 N ( a 1 ) − S 0 σ 2 2 r N ( − a 1 ) − S 0 e − r T ( 1 − σ 2 2 r ) N ( a 2 ) . c_{fl} = S_0N(a_1)-S_0\frac{\sigma^2}{2r}N(-a_1)-S_0e^{-rT}(1-\frac{\sigma^2}{2r})N(a_2). cfl=S0N(a1)S02rσ2N(a1)S0erT(12rσ2)N(a2).
a 1 = ( r + σ 2 2 ) T σ ,      a 2 = ( r − σ 2 2 ) T σ . a_1 = (r+\frac{\sigma^2}{2})\frac{\sqrt{T}}{\sigma} ,\;\; a_2 = (r-\frac{\sigma^2}{2})\frac{\sqrt{T}}{\sigma} . a1=(r+2σ2)σT ,a2=(r2σ2)σT .
代入相關引數,得 c f l = 15.92343 c_{fl} = 15.92343 cfl=15.92343
       
亞式平均價格看漲期權價格為:
d 1 = ln ⁡ M 1 K + σ 0 2 2 T σ 0 T ,      d 2 = d 1 − σ 0 T ,      M 1 = S 0 e r T − 1 r T ,        σ 0 2 = 1 T ln ⁡ M 2 M 1 2 . d_1 = \frac{\ln{\frac{M_1}{K}}+\frac{\sigma_0^2}{2}T}{\sigma_0\sqrt{T}},\;\;d_2 = d_1-\sigma_0\sqrt{T},\;\; M_1 = S_0\frac{e^{rT}-1}{rT},\;\;\; \sigma_0^2 = \frac{1}{T}\ln{\frac{M_2}{M_1^2}} . d1=σ0T lnKM1+2σ02T,d2=d1σ0T ,M1=S0rTerT1,σ02=T1lnM12M2.
M 2 = 2 e ( 2 r + σ 2 ) T S 0 2 ( r + σ 2 ) ( 2 r + σ 2 ) T 2 + 2 S 0 2 r T 2 ( 1 2 r + σ 2 − e r T r + σ 2 ) . M_2=\frac{2e^{(2r+\sigma^2)T}S_0^2}{(r+\sigma^2)(2r+\sigma^2)T^2}+\frac{2S_0^2}{rT^2}\left(\frac{1}{2r+\sigma^2}-\frac{e^{rT}}{r+\sigma^2}\right). M2=(r+σ2)(2r+σ2)T22e(2r+σ2)TS02+rT22S02(2r+σ21r+σ2erT).
c a v e = e − r T ( M 1 N ( d 1 ) − K N ( d 2 ) ) . c_{ave} = e^{-rT}(M_1N(d_1)-KN(d_2)) .\qquad\qquad\qquad\qquad\qquad\qquad\qquad\quad cave=erT(M1N(d1)KN(d2)).
代入相關引數,得 c a v e = 5.61679 c_{ave} = 5.61679 cave=5.61679
       
當我們取較大的 M , N M,N M,N,比如 M = 200 ,    N = 640000 M=200,\;N=640000 M=200,N=640000時,蒙卡模擬計算出的 c f l ∗ = 15.35872 ,    c a v e ∗ = 5.55239 c_{fl}^\ast = 15.35872,\; c_{ave}^\ast = 5.55239 cfl=15.35872,cave=5.55239,和解析解直接計算出的結果很接近。

7.6 參考資料

  1. 《期權、期貨及其他衍生產品》,John C. Hull 著,王勇、索吾林譯。

相關文章