如何使用布朗運動最好地預測期權價格並將其與布萊克和斯科爾斯模型進行比較?
我正在嘗試使用布朗運動來預測期權價格並將結果與布萊克和斯科爾斯進行比較。為此,我想基於連續複利計算標的資產的平均收益 (mu) 和波動率 (sigma) - 因此我使用對數函式。
但是,我認為我的方法可能存在一些我無法確認的錯誤。不幸的是,我無法在網路、quantconnect 等網站以及這個論壇上找到我的問題的明確答案。這些是我的疑問:
- 基於對數計算,這兩種模型都可以與 mu 和 sigma 一起使用嗎?
- 兩個模型的到期時間 T 是否可以輸入相同的單位?
- 當使用幾何布朗運動來模擬股票價格時,我們循環說 10,000 次並取平均結果。我在網上找到的大多數期權價格的 GBM 模型似乎都沒有循環。這是為什麼?
我的 Python 程式碼如下。有什麼建議麼?
from math import log, e from pandas_datareader import data from datetime import date, timedelta #import datetime import yfinance as yf import scipy.stats as si # Get stock price data apple = data.DataReader('AAPL', 'yahoo', '2018/1/1') spot = apple["Adj Close"][-1] # Calculate log annual returns (mu) and log volatility (sigma) apple['log_price'] = np.log(apple['Adj Close']) apple['log_return'] = apple['log_price'].diff() mu = apple.log_return.sum()/apple.log_return.count() mu = mu*365 + 0.5*apple.log_return.var()*np.sqrt(365) sigma = np.std(apple.log_price) #sigma: volatility of underlying spot = 463.94 #spot: spot price K = 460 # strike price T = 1 # time to maturity r = 0.135 # risk-free interest rate # Black and Scholes calculation s0 = spot def euro_vanilla_call(S, K, T, r, sigma): d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)) d2 = (np.log(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)) call = (S * si.norm.cdf(d1, 0.0, 1.0) - K * np.exp(-r * T) * si.norm.cdf(d2, 0.0, 1.0)) return call BSM1 = euro_vanilla_call(spot, K, T, r, sigma) print(BSM1) # Monte Carlo simulation def mc_euro_options(option_type,s0,strike,maturity,r,sigma,num_reps): payoff_sum = 0 for j in range(num_reps): st = s0 st = st*e**((r-0.5*sigma**2)*maturity + sigma*np.sqrt(maturity)*np.random.normal(0, 1)) if option_type == 'c': payoff = max(0,st-strike) elif option_type == 'p': payoff = max(0,strike-st) payoff_sum += payoff premium = (payoff_sum/float(num_reps))*e**(-r*maturity) return premium MCP1 = mc_euro_options('c', spot, K, T, r, sigma, 100) print(MCP1)```
GBM 模型可以寫成:
$$ \delta S_t= \mu S_t \delta t+\sigma S_t\delta t $$
以上是以下 SDE 的簡寫:
$$ S(t)=S(0)+\int^{t}{0}\mu S(h)dh+\int^{t}{0}\sigma S(h)dW(h) $$
求解上述 SDE 會產生您在程式碼中實現的表達式:
$$ S(t)=S_0exp\left((\mu-0.5 \sigma^2)t+\sigma \sqrt{t} Z\right) $$
Black-Scholes 公式可以通過將期權收益應用於上述 SDE 解決方案直接推導出來(為了簡單起見,我使用真實世界的度量*,更多詳細資訊請參見下文中的 asterix 註釋):
$$ Call(t_0)=e^{-rt}\mathbb{E}\left[ (S_t-K)I_{ \left( S_t>K \right) } \right] = \ = e^{-rt}\mathbb{E}\left[ S_tI_{ \left( S_t>K \right) }-KI_{ \left( S_t>K \right) } \right]=\=e^{-rt}\mathbb{E}\left[ S_tI_{ \left( S_t>K \right) }\right]-e^{-rt}K\mathbb{E}\left[ I_{ \left( S_t>K \right) }\right] $$
專注於第二期:
$$ e^{-rt}K\mathbb{E}\left[ I_{ \left( S_t>K \right) }\right] = e^{-rt}K\mathbb{P}\left( S_t>K \right) = \ = e^{-rt}K\mathbb{P}\left( S_0 exp\left((\mu-0.5 \sigma^2)t+\sigma \sqrt{t} Z\right)>K \right) = \ = e^{-rt}K\mathbb{P}\left( (\mu-0.5 \sigma^2)t+\sigma \sqrt{t} Z>ln \left(\frac{K}{S_0} \right) \right) = \ = e^{-rt}K\mathbb{P}\left( Z>\frac{ln \left(\frac{K}{S_0} \right) -\mu t + 0.5\sigma^2 t}{\sigma \sqrt{t} } \right) = \ = e^{-rt}K\mathbb{P}\left( Z> (-1)\frac{ln \left(\frac{S_0}{K} \right) +\mu t - 0.5\sigma^2 t}{\sigma \sqrt{t} } \right) = \ = e^{-rt}K\mathbb{P}\left( Z \leq \frac{ln \left(\frac{S_0}{K} \right) +\mu t - 0.5\sigma^2 t}{\sigma \sqrt{t} } \right) = \ = e^{-rt}KN(d_2) $$
第一學期 $ e^{-rt}\mathbb{E}\left[ S_tI_{ \left( S_t>K \right) }\right] $ 需要做更多的工作來評估,但使用類似的技術,這個術語就出來了 $ S_0N(d_1) $ .
因此,這種繁瑣的公式用法旨在證明 Black-Scholes 公式可以被證明是 GBM 模型對基礎股票價格的直接結果:因此這回答了您的第一個和第二個問題:
(i) 是的,兩個模型中的 mu 和 sigma 是相同的,因為 BS 公式是基於 GBM 模型的
(ii) 是的,兩種模型都需要在時間單位方面相互一致。
*警告語:在使用 GBM 模型為期權定價時,還需要執行一個額外的步驟:您應該從現實世界的機率測度切換到風險中性測度。實際上,這意味著您的漂移 $ \mu $ 需要用漂移代替 $ r $ , 在哪裡 $ r $ 應該是對應於期權到期的“無風險”利率。如果您無法訪問美元的整個 OIS 曲線,那麼我只會將美聯儲基金利率作為 $ r $ (目前,美聯儲基金利率為 0.25%)。
您還應該使用隱含波動率來為期權定價。但是,如果您只想進行實驗,可以使用歷史波動率(就像您在程式碼中所做的那樣)作為代理。
你的第三個問題:如果你想通過蒙地卡羅為期權定價(即首先模擬股票價格,然後期望期權到期時的回報),你需要執行“n”次模擬(即循環)。但是因為您知道上面顯示的 GBM 模型的解析解,並且您可以將其直接插入期權收益並以這種方式解析計算期權價格,您實際上不需要執行 MC 模擬。您可以直接通過 BS 公式為期權定價。
如果您想通過蒙地卡羅或分析(直接導致 BS 公式)評估期權收益公式中的*期望,這基本上取決於您。*顯然,解析評估比數值近似更準確。對一個你知道如何分析解決的問題進行數值模擬有點像隱藏你自己的複活節彩蛋然後尋找它們。
PS:最後但同樣重要的是,你不應該使用 365 天,而應該使用每年 260 天(因為一個日曆年大約只有 260 個交易日)。