Black-Scholes

隱含波動率正在回歸無窮大

  • February 4, 2021

我正在嘗試使用 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 計算器。請讓我知道更多資訊。

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