隱含波動率正在回歸無窮大
我正在嘗試使用 javascript 計算隱含波動率,我有以下程式碼
function ecp(s, x, rfi, dvd, sigma, t) { var sst = sigma * Math.sqrt(t); var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst; var d2 = d1 - sst; var Nd1 = cdf_stdgauss(d1); var Nd2 = cdf_stdgauss(d2); var pd1 = pdf_stdgauss(d1); var pd2 = pdf_stdgauss(d2); var erfi = Math.exp(-rfi * t); var edvd = Math.exp(-dvd * t); var c = s * edvd * Nd1 - x * erfi * Nd2; var p = c + x * erfi - s * edvd; var cdelta = edvd * Nd1; var pdelta = cdelta - edvd; var gamma = edvd * pd1 / (s * sst); var ctheta = dvd * s * edvd * Nd1 - rfi * x * erfi * Nd2 - 0.5 * sigma * sigma * s * s * gamma; var ptheta = ctheta + rfi * x * erfi - dvd * s * edvd; var vega = s * edvd * pd1 * Math.sqrt(t); var crho = x * erfi * Nd2 * t; var prho = x * erfi * (Nd2 - 1.0) * t; var cdvd = -s * edvd * Nd1 * t; var pdvd = s * edvd * (1.0 - Nd1) * t; return [c, cdelta, gamma, ctheta, vega, crho, cdvd, p, pdelta, gamma, ptheta, vega, prho, pdvd]; } function implied_volatility(i, p, s, x, rfi, dvd, t) { var cv = function(sigma) { var sst = sigma * Math.sqrt(t); var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst; var d2 = d1 - sst; var Nd1 = cdf_stdgauss(d1); var Nd2 = cdf_stdgauss(d2); if (i == 7) { Nd1 = Nd1 - 1.0; Nd2 = Nd2 - 1.0; } return s * Math.exp(-dvd * t) * Nd1 - x * Math.exp(-rfi * t) * Nd2 - p; }; var cvp = function(sigma) { var sst = sigma * Math.sqrt(t); var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst; return s * Math.exp(-dvd * t) * pdf_stdgauss(d1) * Math.sqrt(t); }; return newt_root(0.2, cv, cvp, 0.000001); }
它大部分時間都在工作,但有時我會得到 Infinity 或 - Infinity 作為輸出。
當我跑
var ceiv = 100.0* implied_volatility(0, 624.65, 12352.35, 11750, 0.069, 0, 0.03287671232876712)
它正在返回無窮大
但是其他執行價格給出了正確的 IV,例如,如果我執行
var ceiv = 100.0* implied_volatility(0, 1521.75,31590, 30100, 0.069, 0, 0.0136986301369863)
它給了 19.08
這是參數
implied_volatility(callput, optionprice,spotprice, strikeprice, riskfreeinterest/100, dividend, daytoexpireinyear)
假設我們在看漲期權設置的 Black Scholes 中,讓我們忽略股息。對於隱含波動率,我們可以將所有其他變數視為常數,並將看漲期權的價格視為隱含波動率的函式。
$ C\left( \sigma\right)=SN\left(d_1\right)-Xe^{-rT}N\left(d_2\right) $
在哪裡:
$ d_1=\frac{ln \frac{F}{X}}{\sigma \sqrt{T}}+\frac{1}{2}\sigma\sqrt{T} $
$ d_2=\frac{ln \frac{F}{X}}{\sigma \sqrt{T}}-\frac{1}{2}\sigma\sqrt{T} $
隱含波動率值的範圍是 $ (0, \infty) $ - 在實踐中,域要窄得多,但這是不同的點。重要的是域,以及 vol 通過 d 出現在公式中的事實。
很容易檢查當隱含波動率變為零時,取決於 F 是否大於 X,兩個 d 都變為正負無窮大:
$ \lim_{\sigma \to 0} d_1=\mathrm{sign} \left(F-X\right) \infty $
$ \lim_{\sigma \to 0} d_2=\mathrm{sign} \left(F-X\right) \infty $
然後利用這個事實 $ N\left(\infty\right)=1 $ 和 $ N\left(-\infty\right)=0 $ ,我們得出結論,如果 F>X,則看漲期權價格區間的最低點為:
$ \lim_{\sigma \to 0}C\left( \sigma\right)=SN\left(\infty\right)-Xe^{-rT}N\left(\infty\right) $
$ =S-Xe^{-rT} $
對於 F 小於 X:
$ \lim_{\sigma \to 0}C\left( \sigma\right)=SN\left(-\infty\right)-Xe^{-rT}N\left(-\infty\right)=0 $
另一端很簡單——因為隱含的 vol 趨於無窮大:
$ \lim_{\sigma \to \infty} d_1=\infty $
$ \lim_{\sigma \to \infty} d_2=-\infty $
因此看漲期權價格變為 S,即標的資產的目前價值。
您可以按照上述限制期權價格的範圍,以提醒使用者輸入中的潛在問題。
期權價格應高於期權的內在價值。在您的情況下:
31590-29800=1790>1768.05。
如果你想測試你的算法給出的 IV,你可以使用我的網站 [ https://www.valometrics.com]。它是一個使用 javascript 編碼的 Web 平台,其中包含一個 IV 計算器。請讓我知道更多資訊。