Last updated: 2023-03-16.
tf_quant_finance.models.sabr.approximations.implied_volatility#
Computes the implied volatility under the SABR model.
tf_quant_finance.models.sabr.approximations.implied_volatility(
*, strikes, expiries, forwards, alpha, beta, volvol, rho, shift=0.0, volatility_
type=tf_quant_finance.models.sabr.approximations.SabrImpliedVolatilityType.LOGNO
RMAL, approximation_type=tf_quant_finance.models.sabr.approximations.SabrApproxi
mationType.HAGAN, dtype=None, name=None
)
The SABR model specifies the risk neutral dynamics of the underlying as the following set of stochastic differential equations:
dF = sigma F^beta dW_1
dsigma = volvol sigma dW_2
dW1 dW2 = rho dt
F(0) = f
sigma(0) = alpha
where F(t) represents the value of the forward price as a function of time, and sigma(t) is the volatility.
Here, we implement an approximate solution as proposed by Hagan [1], and back out the equivalent implied volatility that would’ve been obtained under either the normal model or the Black model.
Example#
import tf_quant_finance as tff
import tensorflow as tf
equiv_vol = tff.models.sabr.approximations.implied_volatility(
strikes=np.array([106.0, 11.0]),
expiries=np.array([17.0 / 365.0, 400.0 / 365.0]),
forwards=np.array([120.0, 20.0]),
alpha=1.63,
beta=0.6,
rho=0.00002,
volvol=3.3,
dtype=tf.float64)
# Expected: [0.33284656705268817, 1.9828728139982792]
# Running this inside a unit test passes:
# equiv_vol = self.evaluate(equiv_vol)
# self.assertAllClose(equiv_vol, 0.33284656705268817)
References#
[1] Hagan et al, Managing Smile Risk, Wilmott (2002), 1:84-108
Args:#
strikes: RealTensorof arbitrary shape, specifying the strike prices. Values must be strictly positive.expiries: RealTensorof shape compatible with that ofstrikes, specifying the corresponding time-to-expiries of the options. Values must be strictly positive.forwards: RealTensorof shape compatible with that ofstrikes, specifying the observed forward prices of the underlying. Values must be strictly positive.alpha: RealTensorof shape compatible with that ofstrikes, specifying the initial values of the stochastic volatility. Values must be strictly positive.beta: RealTensorof shape compatible with that ofstrikes, specifying the model exponentbeta. Values must satisfy 0 <=beta<= 1.volvol: RealTensorof shape compatible with that ofstrikes, specifying the model vol-vol multipliers. Values ofvolvolmust be non-negative.rho: RealTensorof shape compatible with that ofstrikes, specifying the correlation factors between the Wiener processes modeling the forward and the volatility. Values must satisfy -1 <rho< 1.shift: OptionalTensorof shape compatible with that ofstrkies, specifying the shift parameter(s). In the shifted model, the process modeling the forward is modified as: dF = sigma * (F + shift) ^ beta * dW. With this modification, negative forward rates are valid as long as F > -shift. Default value: 0.0volatility_type: Either SabrImpliedVolatility.NORMAL or LOGNORMAL. Default value:LOGNORMAL.approximation_type: Instance ofSabrApproxmationScheme. Default value:HAGAN.dtype: Optional:tf.DType. If supplied, the dtype to be used for converting values toTensors. Default value:None, which means that the default dtypes inferred fromstrikesis used.name: str. The name for the ops created by this function. Default value: ‘sabr_approx_implied_volatility’.
Returns:#
A real Tensor of the same shape as strikes, containing the
corresponding equivalent implied volatilities.