Last updated: 2023-03-16.
tf_quant_finance.black_scholes.implied_vol_approx#
Approximates the implied vol using the Stefanica-Radiocic algorithm.
tf_quant_finance.black_scholes.implied_vol_approx(
*, prices, strikes, expiries, spots=None, forwards=None, discount_factors=None,
is_call_options=None, validate_args=False, polya_factor=0.6366197723675814,
dtype=None, name=None
)
Finds an approximation to the implied vol using the Polya approximation for the Normal CDF. This algorithm was described by Stefanica and Radiocic in ref [1]. They show that if the Normal CDFs appearing in the Black Scholes formula for the option price are replaced with Polya’s approximation, the implied vol can be solved for analytically. The Polya approximation produces absolute errors of less than 0.003 and the resulting implied vol is fairly close to the true value. For practical purposes, this may not be accurate enough so this result should be used as a starting point for some method with controllable tolerance (e.g. a root finder).
References:#
[1]: Dan Stefanica and Rados Radoicic. An explicit implied volatility formula. International Journal of Theoretical and Applied Finance, Vol. 20, no. 7, 2017. https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2908494 [2]: Omar Eidous, Samar Al-Salman. One-term approximation for Normal distribution function. Mathematics and Statistics 4(1), 2016. http://www.hrpub.org/download/20160229/MS2-13405192.pdf
Args:#
prices: A realTensorof any shape. The prices of the options whose implied vol is to be calculated.strikes: A realTensorof the same dtype aspricesand a shape that broadcasts withprices. The strikes of the options.expiries: A realTensorof the same dtype aspricesand a shape that broadcasts withprices. The expiry for each option. The units should be such thatexpiry * volatility**2is dimensionless.spots: A realTensorof any shape that broadcasts to the shape of theprices. The current spot price of the underlying. Either this argument or theforwards(but not both) must be supplied.forwards: A realTensorof any shape that broadcasts to the shape ofprices. The forwards to maturity. Either this argument or thespotsmust be supplied but both must not be supplied.discount_factors: An optional realTensorof same dtype as theprices. If not None, these are the discount factors to expiry (i.e. e^(-rT)). If None, no discounting is applied (i.e. it is assumed that the undiscounted option prices are provided ). Ifspotsis supplied anddiscount_factorsis not None then this is also used to compute the forwards to expiry. Default value: None, equivalent to discount factors = 1.is_call_options: A booleanTensorof a shape compatible withprices. Indicates whether the option is a call (if True) or a put (if False). If not supplied, call options are assumed.validate_args: A Python bool. If True, indicates that arguments should be checked for correctness before performing the computation. The checks performed are: (1) Forwards/spots and strikes are positive. (2) The prices satisfy the arbitrage bounds (i.e. for call options, checks the inequalitymax(F-K, 0) <= Price <= Fand for put options, checks thatmax(K-F, 0) <= Price <= K.). (3) Checks that the prices are not too close to the bounds. It is numerically unstable to compute the implied vols from options too far in the money or out of the money. Default value: Falsepolya_factor: A real scalar. The coefficient to use in the approximation for the Normal CDF. The approximation is: `N(x) ~ 0.5 + 0.5sign(x) * sqrt[ 1 - exp(-k * x**2) ]
wherekis the coefficient supplied withpolya_factor. The original Polya approximation has the value2 / piand this is approximation used in Ref [1]. However, as described in Ref [2], a slightly more accurate approximation is achieved if we use the value ofk=5/8`).
dtype:tf.Dtypeto use when converting arguments toTensors. If not supplied, the default TensorFlow conversion will take place. Note that this argument does not do any casting forTensors or numpy arrays. Default value: None.name: (Optional) Python str. The name prefixed to the ops created by this function. If not supplied, the default name ‘implied_vol’ is used. Default value: None
Returns:#
implied_vols: ATensorof the same dtype aspricesand shape as the common broadcasted shape of(prices, spots/forwards, strikes, expiries). The approximate implied total volatilities computed using the Polya approximation method.
Raises:#
ValueError: If bothforwardsandspotsare supplied or if neither is supplied.