Black-Scholes

發現 Black Scholes 隱含波動率

  • June 10, 2022

我試圖暗示使用雅虎財經的 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) $ ?

引用自:https://quant.stackexchange.com/questions/71193