人工智慧金融投資決策_蒙地卡羅模擬歐式買權定價演算法
假設有一個商品50元,買家先跟賣家先約定好一年後要用60元去購買此商品。
若我們能夠預先估測一年後此商品出現在不同價位的機率是多少,那賣家就可以去估測賣給買家的這份合約應該值多少錢,而這有一個公平計價基準,也就是選擇權定價。
Black-Scholes 選擇權定價公式
買權(Call Option)
賣權(Put Option)
其中:
- :目前股票價格,也就是時間 時的股價。
- :履約價格(Strike Price)。
- :無風險利率(Risk-free Rate)。
- :選擇權剩餘期間,以「年」為單位;實務上通常以交易日換算,例如一年約 252 個交易日。
- :股票價格的年化波動率(Volatility)。
- :標準常態分布的累積分布函數(CDF)。
而 可以理解成一個標準常態分布隨機變數,小於等於 x 的累積機率。
其數學表示為:
白話理解
Black-Scholes 公式就是利用 目前股價、履約價、無風險利率、到期時間、波動率 這 5 個主要因素,計算歐式買權與賣權的理論價格。
其中 、 可以先把它們視為公式中的「中間計算值」,
再透過標準常態分布的累積機率 、,最後算出 Call 與 Put 的理論價格。
這邊用到Monte Carlo Simulation給予一些前置假設,嘗試去模擬一千到一萬次股價分佈,去計算期望值反推。
也可以白話來理解為
未來的股票價格變動 = 可預期的報酬趨勢 + 無法預測的隨機波動。
先備知識可參考蒙地卡羅求解圓周率
蒙地卡羅法放到金融市場
- 一般化的維納過程(Wiener process) dz,具有固定的期望漂移率(expected drift rate)與固定的變異率(variance rate)。
- 然而,這種假設可能並不適當,因為它意味著:
投資人所要求的預期報酬百分比,與股票價格本身無關。例如:不論股票價格是 10 美元還是 50 美元,所要求的報酬率都固定為 14%。 - 隨機模擬未來可能出現的股票價格。
- 因為未來股票價格不確定,因此需要建立一個隨機模型。
股價變動 = 可預期的趨勢 + 不可預期的隨機變動
- S:股票在時間 t 的價格
- ΔS:股票價格的變化
- μ:某個固定參數,代表股票的預期報酬率
- 股票價格 S 的預期漂移率(expected drift rate),應假設為:μS
- 也就是說,股票價格越高,其「絕對價格變動量」也會相對較大。
- Drift(漂移) : 代表股票的平均預期報酬趨勢,例如:μ=0.10,代表年化預期報酬率約為10%。
- Shock : 代表市場的隨機波動
在時間區間 Δt 內,報酬率百分比的波動程度(variability)不會因股票價格不同而改變,藉此描述市場的不確定性。
為了用電腦進行模擬,我們需要將它轉換成離散時間模型(discrete-time model)
Algorithm for Pricing a European Call
股價會去模擬N次,用今日股價當作S₀。
2.對每一個隨機數 ε(i),依據公式 (5.7) 計算到期時的標的指數/股價 ST(i):
3.計算每一個到期時買權的內含價值(intrinsic value):

其中:
- ST(i):第 i 次模擬得到的到期股價
- K:履約價
- 若 ,買權有價值
- 若 ,買權價值為 0
我們這邊拿之前Black-Scholes計算出來的call price當參照答案
測試程式
import numpy as np import math import matplotlib.pyplot as plt #模擬股票的走勢,實作公式5.7 def MCsim(S, T, r, vol, N): dt = T / N#時間跨度 St = np.zeros((N + 1)) St[0] = S #0推1->1推2->2推3....->N-1推到N,共推N次 for i in range(N): St[i+1] = St[i]*math.exp((r-0.5*vol*vol)*dt+vol*np.random.normal()*math.sqrt(dt)) return St S = 50 K = 40 T = 2 r = 0.08 vol = 0.2 #call=16.383741845158895 N = 100 Sa = MCsim(S,T,r,vol,N) print(Sa) plt.plot(Sa) plt.show() def MCprice(S,K,T,r,vol,M,N): call = 0 for i in range(M): Sa = MCsim(S,T,r,vol,N) plt.plot(Sa) if(Sa[-1]-K>0):#選擇履約 call += (Sa[-1]-K) #plt.show() return call/M*math.exp(-r*T) #M參數拉大會更準 call = MCprice(S,K,T,r,vol,1000,100) print(call)
這段程式是在做兩件事:
- 用 幾何布朗運動(GBM) 模擬一條股票價格路徑。
- 重複模擬很多次,用 Monte Carlo 蒙地卡羅法估算歐式買權(European Call)的價格。
1.MCsim():模擬一條股票價格路徑
這邊把5.7公式用python程式碼去實作
- S(股票現在價格):50
- K(Call 履約價格):40
- T(到期時間2年):2
- r(年化無風險利率 8%):0.08
- vol(年化波動率 20%):0.2
- N(將2年切成100個時間區段):100 ->每條股價路徑切成幾步
- M(Monte Carlo模擬1000條路徑):1000 ->總共模擬幾條股價路徑
程式當中用到的 np.random.normal() ->也就是常態分佈ε∼N(0,1)
NumPy 在沒有傳入參數時,預設等同於:np.random.normal(loc=0.0, scale=1.0)
也就是:從平均數 0、標準差 1 的標準常態分配隨機抽一個數字。
也就是:從平均數 0、標準差 1 的標準常態分配隨機抽一個數字。
Monte Carlo Simulation With Geometric Brownian Motion Explained
留言
張貼留言