發現 Black Scholes 隱含波動率
我試圖暗示使用雅虎財經的 BS 波動性!API(MSFT 選項)和路透社零曲線。我暫時忽略了紅利。請注意,我還清理了期權的數據(例如,我確保期權的最後一個交易日是我估值的那一天,並且為了得到一個漂亮的笑容,我只保留了 OTM 看漲期權和 OTM 看跌期權假設 OTM 期權是便宜的
def f_call(vol, S, r, K, dt, q): d1 = 1 / vol * np.sqrt(dt) * (np.log(S/K) + (r - q + vol**2 / 2) * dt) d2 = d1 - vol * np.sqrt(dt) return np.exp(-q*dt) * S * stats.norm.cdf(d1) - np.exp(-r*dt) * K * stats.norm.cdf(d2) def f_put(vol, S, r, K, dt, q): d1 = 1 / vol * np.sqrt(dt) * (np.log(S/K) + (r - q + vol**2 / 2) * dt) d2 = d1 - vol * np.sqrt(dt) return stats.norm.cdf(-d2) * K * np.exp(-r*dt) - stats.norm.cdf(-d1) * S * np.exp(-q*dt) vol_guess = self.vol_yh[i] print(i) params = { 'S' : self.S, 'K' : self.K[i], 'dt' : self.dt[i], 'r' : self.r[i], 'q' : self.q[i], } option_type = self.type[i] if option_type == 'C': f = self.f_call else: f = self.f_put bounds = optimize.Bounds(lb=0, ub=100) e = lambda s: np.sqrt(np.mean((f(s, **params) - market_price[i]) ** 2)) # e = lambda s: f(s, **params) - market_price[i] res = optimize.minimize(fun=e, x0=(vol_guess,), method='SLSQP', bounds=bounds) res = res.x[0] # res = optimize.newton(func=e, x0=vol_guess) # print(res) print(f'Yahoo volatility: {self.vol_yh[i]}') print(f'Model volatility: {res}') self.vol[i] = res
在此範例中,
params = {'S': 268.75, 'K': 80.0, 'dt': 0.28055555555555556, 'r': 0.015503659068441186, 'q': 0.0}
, 其中dt
‘ACT/365’ 和 ‘r’ 是通過在 上線性插值找到的dt
。作為參考,我還發布了零利率的快照(“deltaTime”也是 ACT/365)。這些來自 RIC 程式碼 USDSROISZ=,這是從 USDSROIS(SOFR OIS 面值利率)提升的零利率,我認為這足以獲得合理的結果。如您所見,我的選項的費率在 5 到 6 之間。
deltaTime zeroRates 0 0.002778 0.007940 1 0.005556 0.008077 2 0.019444 0.009127 3 0.083333 0.011614 4 0.169444 0.013341 5 0.255556 0.015036 6 0.508333 0.019158 7 0.758333 0.022491 8 1.013889 0.024985 9 1.269444 0.026642 10 1.522222 0.027639 11 1.775000 0.028254 12 2.030556 0.028567 13 2.286111 0.028716
但是,由於我得到的結果與引用的雅虎財經不同,因此出現了嚴重錯誤!揮發性。
Yahoo volatility: 0.7812521875 Model volatility: 8.279821273049492e-12
有趣的是,如果我轉向金錢,我會得到合理的結果:
params = {'S': 268.75, 'K': 250.0, 'dt': 0.28055555555555556, 'r': 0.015503659068441186, 'q': 0.0} Yahoo volatility: 0.3357610369873046 Model volatility: 0.3448098337803358
最後,如果我針對特定到期執行整個連續期權,我會得到以下波動率微笑圖:
我知道我無法完美匹配它,股息也在發揮作用(我需要添加),雅虎也可能有不同的模型,但我不明白為什麼深度 OTM 和 ITM 選項如此不同。請注意,我還清理了期權的數據(例如,我確保期權的最後一個交易日是我估值的那一天,並且為了得到一個漂亮的笑容,我只保留了 OTM 看漲期權和 OTM 看跌期權假設 OTM 期權更便宜,因此更具流動性)。但是,在我看來,這些都不能解釋深度金錢的巨大差異。正在發生的事情是最小化達到了下限,因此它非常接近 0,但話又說回來,為什麼最小化要轉向負波動率?
編輯:
修正了 中的錯字
d1
,我現在得到了一個更明智的微笑,但是我有一個跳轉 ATM。可能是因為我在右側使用看跌期權,在左側使用看漲期權,OTM 看漲期權實際上定價過高,因為我認為沒有考慮股息。
我認為你弄錯了你的定義 $ d_1 $ . 難道不應該 $ d_1 = 1 / (\text{vol} * \text{dt}) * (\log(S/K) + (r - q + \text{vol}^2 / 2) * dt) $ 並不是 $ d_1 = 1 / \text{vol} * \text{dt} * (\log(S/K) + (r - q + \text{vol}^2 / 2) * dt) $ ?