Black–Scholes Implied Volatility Bounds and Solver Failures
Summary
The note investigates why a Newton-style implied-volatility calculation can return infinite values for some option inputs. Its central lesson is to check whether the quoted option price lies within the range allowed by Black–Scholes before attempting numerical inversion. For a call, as volatility approaches zero, the price approaches its discounted intrinsic value or zero, depending on whether the forward price is above or below the strike. As volatility grows without bound, the call price approaches the underlying price under the assumptions presented.
These limiting prices provide feasibility bounds that can flag inconsistent inputs or prices for which no finite implied volatility exists. The discussion focuses on calls and simplifies by ignoring dividends in its derivation, although the question’s code includes a dividend yield and also handles puts. It offers no corrected solver or tested numerical method, so the bounds diagnose input problems rather than resolve every convergence failure.
Key ideas
- Check option-price feasibility against Black–Scholes limits before solving for implied volatility numerically.
- For a call, the zero-volatility limit is discounted intrinsic value when the forward exceeds the strike, and zero otherwise.
- As call volatility tends to infinity, the model price approaches the underlying price in the stated setup.
- The derivation ignores dividends, so applying its bounds to other inputs requires appropriate model adjustments.
Tags
Full text
# Implied volatility is returning infinity
# Implied volatility is returning infinity
I am trying to calculate implied volatility using javascript , I have following code
```
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);
}
```
It is working most of the times, but sometimes I get Infinity or - Infinity as output.
When I run
```
var ceiv = 100.0* implied_volatility(0, 624.65, 12352.35, 11750, 0.069, 0, 0.03287671232876712)
```
It is returning infinity
But others strike prices are giving correct IV , For example If i run
```
var ceiv = 100.0* implied_volatility(0, 1521.75,31590, 30100, 0.069, 0, 0.0136986301369863)
```
It gives 19.08
Here is parameter
```
implied_volatility(callput, optionprice,spotprice, strikeprice, riskfreeinterest/100, dividend, daytoexpireinyear)
```
## Answer by Magic is in the chain (score 1)
https://quant.stackexchange.com/a/50758
Assume we are in the Black Scholes for call option settings, and let’s ignore the dividend. For the implied vol, we can treat all other variables as constant, and focus on the price of the call option as a function of implied vol.
$C\left( \sigma\right)=SN\left(d_1\right)-Xe^{-rT}N\left(d_2\right)$
Where:
$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}$
The domain, range of implied volatility values, is $(0, \infty)$ - in practice the domain is much narrower but that’s a different point. What is important is the domain, and the fact that vol appears in the formula through the d’s.
It is easy to check that as implied volatility goes to zero, both d’s go to plus/minus infinity depending on whether F is greater than X:
$\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$
And then using the fact that $N\left(\infty\right)=1$ and $N\left(-\infty\right)=0$, we conclude that if F>X, the lowest point of the range of the call option price is:
$\lim_{\sigma \to 0}C\left( \sigma\right)=SN\left(\infty\right)-Xe^{-rT}N\left(\infty\right)$
$=S-Xe^{-rT}$
And for F less than X:
$\lim_{\sigma \to 0}C\left( \sigma\right)=SN\left(-\infty\right)-Xe^{-rT}N\left(-\infty\right)=0$
The other end is easy- as implied vol goes to infinity:
$\lim_{\sigma \to \infty} d_1=\infty$
$\lim_{\sigma \to \infty} d_2=-\infty$
So the call option price goes to S, the current value of the underlying.
You can restrict the range of option prices as per above to alert the users to potential issues in the inputs.
## Answer by Valometrics.com (score -1)
https://quant.stackexchange.com/a/50742
The option price should be superior than the intrinsic value of the option. In your case: 31590-29800=1790>1768.05. if you want to test the IV given by your algorithm you can use my website [https://www.valometrics.com]. it is a web platform coded using javascript that contains an IV calculator. please let me know for more information.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.