人工智慧金融投資決策_蒙地卡羅模擬歐式買權定價演算法


用蒙地卡羅法估算歐式買權1000次股價路徑




假設有一個商品50元,買家先跟賣家先約定好一年後要用60元去購買此商品。
若我們能夠預先估測一年後此商品出現在不同價位的機率是多少,那賣家就可以去估測賣給買家的這份合約應該值多少錢,而這有一個公平計價基準,也就是選擇權定價。

Black-Scholes 選擇權定價公式

買權(Call Option)

賣權(Put Option)

其中:

  • S0S_0目前股票價格,也就是時間 t=0t=0 時的股價。
  • KK履約價格(Strike Price)
  • rr無風險利率(Risk-free Rate)
  • TT選擇權剩餘期間,以「年」為單位;實務上通常以交易日換算,例如一年約 252 個交易日
  • σ\sigma:股票價格的年化波動率(Volatility)
  • N(x)N(x)標準常態分布的累積分布函數(CDF)


N(x)N(x) 可以理解成一個標準常態分布隨機變數,小於等於 x 的累積機率。


其數學表示為:




白話理解

Black-Scholes 公式就是利用 目前股價、履約價、無風險利率、到期時間、波動率 這 5 個主要因素,計算歐式買權與賣權的理論價格。

其中 d1d_1d2d_2 可以先把它們視為公式中的「中間計算值」,


再透過標準常態分布的累積機率 N(d1)N(d_1)N(d2)N(d_2),最後算出 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

1.從標準常態分配中,抽取 N 個(偽)隨機數:
股價會去模擬N次,用今日股價當作S₀。

2.對每一個隨機數 ε(i),依據公式 (5.7) 計算到期時的標的指數/股價 ST(i)







3.計算每一個到期時買權的內含價值(intrinsic value)


其中:

  • ST(i):第 i 次模擬得到的到期股價
  • K:履約價
  • ,買權有價值
  • ,買權價值為 0
4.使用蒙地卡羅估計量(Monte Carlo estimator)估算選擇權目前價值:


我們這邊拿之前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)

這段程式是在做兩件事:
  1. 用 幾何布朗運動(GBM) 模擬一條股票價格路徑。
  2. 重複模擬很多次,用 Monte Carlo 蒙地卡羅法估算歐式買權(European Call)的價格。

1.MCsim():模擬一條股票價格路徑
這邊把5.7公式用python程式碼去實作


2.用蒙地卡羅法估算歐式買權1000次股價路徑
  • 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 的標準常態分配隨機抽一個數字。






Monte Carlo Simulation With Geometric Brownian Motion Explained



留言

這個網誌中的熱門文章

SAP物料主數據(Material Master Data)

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義