This exercies outlines a standard procedure of obtaining implied volatility (IV) estimates from (namely put) option prices. The puts in this exercise are based on a hypothetical underlying index (XXX) at an arbitrarily selected level of 158.69. We will be dealing with a set of 32 put options with equal length maturities (T) but varying strike prices (K). The data used in this exercise comes from a companion excel file, but the procedure is universally applicable to other option chain data.
The Black-Scholes-Merton OPM assumes financial markets are frictionless (shorts are allowed, no consideration for transaction costs or related fees, etc.) and that asset prices follow a log-normal model such that price innovations are i.i.d along a continuous sequence of time. Subsequently log returns are normally distributed \[ ln(S_T/S_0) = N[\mu T, \sigma^2 T] \] In this exercise, we are dealing with dividend paying assets. The BSM OPM says that the value of EU put option on an underlying that pays dividends is calculated as follows: \[ p(S,K,T,r,\sigma) = Ke^{-rT} \Phi (-d_2)-Se^{-\rho T} \Phi (-d_1)\] , where \(\Phi\) is the cumulative density function of a standard normal random variable, and \(d_1 = [ln(S/K) + (r-\rho + (\sigma^2/2)T]/\sigma T^{1/2}\) and \(d_2 = d_1-\sigma T^{1/2}\)
Under the present assumptions, the code below computes the price of a EU put option on a dividend paying underlying with the flexibility to do the same for a EU call given that type is correctly specified.
# Black-Scholes inputs
# S = current stock price
# K = Exercise (Strike) price
# T = time to expieration
# r = continuously compounded (annualized) risk-free rate
# sigma = annualized volatility of log returns\
# rho = continuously compounded dividend yield
Black_Scholes <- function(S,K,Time,r,sigma,rho, type = "P") {
d_1 <- (log(S/K) + (r- rho + (sigma^2/2))*Time) / (sigma*sqrt(Time))
d_2 <- d_1 - (sigma*sqrt(Time))
if(type == "P"){
price <- (K*exp(-r*Time)*pnorm(-d_2,0,1)) - (S*exp(-rho*Time)*pnorm(-d_1,0,1))
}
if(type == "C") {
price <- (S*exp(-rho*Time)*pnorm(d_1,0,1)) - (K*exp(-r*Time)*pnorm(d_2))
}
return(price)
}
Implied Volatility represents the market’s cumulative view (forecast) of the likelihood of price changes in the underlying. When evaluating the level of IV, it is important to remember that high IV indicates options with higher premiums. In other words, investors are willing to pay high premiums for downside protection in the event of tail events. Although IV is all based on probability and has limitations, it is, in aggregate, an important factor in investment decisions. Therefore, despite its limitations, it does provide key insight into market expectations and, subsequently, option prices.
Given the observed market price of the put options, we can use the BS OPM formula to derive the estimate of volatility that is used to reach the observed price of the put. The uniroot() function is used to solve for the volatility coefficient, given the vector of put option price data. The code below solves for implied volatility as indicated by the BS OPM.
# I. Compute Implied Volatilities:
impl_volatility <- function(S, K, Time, r, rho, price) {
root <- function(sigma) {
Black_Scholes(S,K,Time,r,sigma,rho) - price
}
uniroot(root, c(0,1))$root
}
S <- 158.69
r <- 0.004
rho <- 0.01
Time <- 35/365
strike <- as.vector(Strike)
put_price <- as.vector(Put_Price)
impl_vol_vector <- rep(0, length(strike))
for (i in 1:length(strike)) {
impl_vol_vector[i] <- impl_volatility(S, K = strike[i], Time, r, rho, price = put_price[i])
}
The plot below, commonly known as a volatility smile, captures the implied volatility of equal maturity put options on the same underlying at varying strike prices. IV rises when the put option moves deeper OTM / ITM. Alternatively, options with lower IV’s have K’s (near) ATM. This plot, however, shows more of a skew (‘smirk’) shape, indicating that IV is higher for put options further OTM. One possible economic interpretation of this is that investors could be assigning more volatility to the downside (as oppossed to upside volatility) and more value to downside protection. It can be inferred that investors are having concerns about future market conditions and are buying insurnane for protections in the event of perceived risks becoming realized.
The chart of implied volatility may also indicate that investors view low strike price put options as more expensive. In addition, investors fear extreme tail events (extreme negative returns) and will pay high prices for protection against downside risk toward the underlying.
The following code below performs a linear interpolation of the probability density function (PDF) of the underlying spot price. We can think of option premiums as reflections of the markets assumptions of the probability of the direction of the underlying’s spot price. Here, we are interpolating the probability of spot prices that vary around the ATM strike price. This procedure becomes exceedingly more limited as the time to maturity on the option increases.
Given that option premiums are implied probabilities, and that premiums vary in accordance with varying strike prices, we can use option chain data estimate an implied density of underlying spot prices. Let the underlying’s implied density be computed numerically via a 2nd order Taylor expansion of the put option price and strike price.
\([c(K_3)-c(K_2)/K_3-K_2]-[c(K_2)-c(K_1) / K_2-K_1] / (K_2 - K_1)\)
In instances where a negative density estimate is computed, we need to (linearly) interpolate the density using the following equation:
\(\pi(k_n) = (\pi(k_{n-1}) + \pi(k_{n+1}))/2\)
Refer to the code below. The implied density is plotted in tandem with a normal distribution with = 159 (ATM K) and = 8.254 (respective IV at that K).
# II. Implied Distribution
density_vector <- rep(0, length(strike))
for (i in 1:length(strike)) {
density_vector[i] <- ((put_price[i+2]-put_price[i+1])/(strike[i+2]-strike[i+1]))-((put_price[i+1]-put_price[i])/(strike[i+1]-strike[i])) / (strike[i+1]-strike[i])
}
# interpolate all negatvie density estimates
print(density_vector[density_vector < 0])
## [1] -1.387779e-17 -1.387779e-17 -2.775558e-17 NA NA
density_vector[1] <- (0 + density_vector[2]) / 2
density_vector[4] <- (density_vector[3] + density_vector[5]) / 2
density_vector[8] <- (density_vector[7] + density_vector[9]) / 2
density_vector[31:32] <- 0
This chart indicates that, based on put option chain data, the market is pricing in probabilities of downside risk with higher liklihoods as opposed to upside volatility. This is consistend with the IV skew chart’s, which indicates higher demand for low strike puts.
It is important to remember that IV, as outlined in the analysis above, is solely a function of option price data, i.e. IV is limited in its explanatory power. In other words, IV is limited in that it is sensitive to unexpected news events, macroeconomic factor, and fundamental data. These limitations make IV a movement, rather than a direction, indicator of prices.