In this chapter we review the Black-Scholes option pricing model and present the VBA code to implement it. We do not derive this model nor spend too much time explaining it since so much has been written about it already, in textbooks such as those by Hull (2006), Haug (1998), and Chriss (1997). We review implied volatility and the moneyness and maturity biases that give rise to volatility smiles. We then review the Practitioner Black-Scholes model, which uses the Deterministic Volatility Function of Dumas, Fleming, and Whaley (1998). Finally, we discuss the model of Backus, Foresi, and Wu (2004), which introduces skewness and excess kurtosis into the Black-Scholes model to account for moneyness and maturity biases.
This model hardly needs introduction. It is the most popular option pricing model, due to its simplicity, closed-form solution, and ease of implementation. The Black and Scholes (1973) price at time t for a European call option with maturity at time t + T with strike price K on a stock paying no dividends is
where
St = time t price of the stock
σ = annual stock return volatility (assumed constant)
r = annual risk-free interest rate
T = time to maturity in years
Some authors use the notation and n(x) = φ(x).
To price a put option, the put-call parity relation can be used, which produces
or CBS can be substituted into (4.2) to get
The Excel file Chapter4BlackScholes contains VBA code for implementing the Black-Scholes model. The VBA function BS_call() produces the Black-Scholes price of a European call given by Equation (4.1), while function BS_put() uses the put-call parity relationship (4.2) to produce the price of a European put. Both functions require as inputs the spot price of the asset (S), the strike price (K), the risk-free rate of interest (r), the time to maturity (T) and the volatility (σ).
Function Gauss(X)
Gauss = Application.NormSDist(X)
End Function
Function BS_call(S, K, r, T, v)
d = (Log(S / K) + T * (r + 0.5 * v ^ 2)) / (v * Sqr(T))
BS_call = S * Gauss(d) - Exp(-r * T) * K * Gauss(d - v * Sqr(T))
End Function
Function BS_put(S, K, r, T, v)
BS_put = BS_call(S, K, r, T, v) -S + K * Exp(-r * T)
End Function
The function Gauss() is used to save space. It replaces the VBA statement Application.NormSDist() with the simpler Gauss() statement whenever cumulative values of the standard normal distribution are needed.
We illustrate these functions in Figure 4.1. Suppose we wish to price a five-month option with strike price $30 on a non-dividend-paying stock with spot price $30 and annual volatility 30 percent, when the risk-free rate is 5 percent. Hence, S = 30, K = 30, r = 0.05, T = 5/12, and σ = 0.3. The cells that contain these inputs have been assigned names for convenience, so in cell E4 we type
FIGURE 4.1 Black-Scholes Price of Calls and Puts
which produces the Black-Scholes price of the call as $2.612638.
Similarly, the function BS_put() in cell E6 shows that the Black-Scholes price of the put is $1.994104.
The value of a call option on a dividend-paying stock can be obtained, provided that the current stock price S is assumed to be equal to the sum of all discounted future dividends. For illustration, suppose that a stock pays quarterly dividends, so that in the ith quarter, a dividend in the amount of Di is paid. Suppose also that this dividend is discounted at the risk-free rate ri. The current stock price can therefore be expressed as the discounted dividend stream
The closer the ex-dividend dates, the more accurately the value of the dividend payments can be predicted. When a stock is purchased, the buyer hopes that future dividends will increase. The same is true for call options: a bet on future dividends is being made. If the call option expires in seven months, the first two dividends will be paid out and the stock price will drop to S*. This price can be expressed as the sum of future dividends starting in seven months,
The Black-Scholes formula can be used to price European call options on stocks that pay dividends, simply by using S* in (4.1) instead of S, and keeping all other parameter values the same. This approximation works best for option with short maturities, since dividends are more predictable in the short term. In the more general case wherein dividends are paid at irregular times τi, the discount factors in (4.3) and (4.4) become exp(−ri × τi). The Excel file Chapter4BlackScholesDiv contains the VBA function BS_div_call() to price European call options on a dividend-paying stock.
Function BS_div_call(S, K, r, T, v, Div)
Divnum = Application.Count(Div) / 3
PVD = 0
For i = 1 To Divnum
PVD = PVD + Div(i, 2) * Exp(-Div(i, 1) * Div(i, 3))
Next i
Smod = S - PVD
BS_div_call = BS_call(Smod, K, r, T, v)
End Function
The stock price S* is stored in the variable Smod, and the function BS_call() for the Black-Scholes call price defined earlier in this chapter is used, but with the spot price S replaced by S*. The times to ex-dividend dates, dividends, and risk-free rates are stored in the first, second, and third columns of array Div(), respectively.
This reasoning can be extended to American-style options by employing Black’s approximation. Using arbitrage, it can be shown that it is never optimal to exercise prior to maturity an American call option on a stock paying no dividends (Hull, 2006; Chriss, 1997). For a stock paying dividends, it is never optimal to exercise an American call option on the stock anytime other than immediately prior to an ex-dividend date. This implies that we must only verify the value of the call prior to all ex-dividend dates and at maturity, and set the current value of the call to the greatest of these values. This procedure can be implemented by extending the previous algorithm. We have to calculate the value of all the call options expiring at the ex-dividend dates, by modifying the time to maturity and calculating the appropriate adjusted price S*. The function BS_div_amer_call() implements the procedure.
Function BS_div_amer_call(S, K, r, T, v, div)
Dim allCall() As Double
divnum = Application.Count(div) / 3
ReDim allCall(divnum + 1) As Double
For j = 1 To divnum
PVD = 0
For i = 1 To j
If (i < j) Then
PVD = PVD + div(i, 2) * Exp(-div(i, 1) * div(i, 3))
End If
Next i
Smod = S - PVD
allCall(j) = BS_call(Smod, K, r, div(j, 1), v)
Next j
allCall(divnum + 1) = BS_div_call(S, K, r, T, v, div)
BS_div_amer_call = Application.Max(allCall)
End Function
Figure 4.2 illustrates the use of these functions on a stock with spot price S = $100 and volatility σ = 30 percent, when the strike price is K = $100, the time to maturity is T = 7 months, and the risk-free rate is r = 5 percent. There are two dividends of $2 each (D1 = D2 = 2), paid out quarterly (τ1 = 0.25, τ2 = 0.50) and each dividend is discounted at the rate of five percent (r1 = r2 = 0.05). In cell C12 we type
FIGURE 4.2 Black-Scholes Call Price on a Dividend-Paying Stock
and obtain the price of a European call as $8.2951. Similarly, the price of an America call appears in cell C14 as $8.508572. In this example, it is optimal to exercise prior to the last dividend date, so the American call price is higher than the European price.
In this section we introduce implied volatilities, which are volatilities extracted from option prices, and the deterministic volatility function (DVF). Implied volatilities differ from realized volatilities, which are volatilities estimated from historical returns. Implied volatilities are often preferred to realized volatilities, since implied volatilities are prospective estimates that reflect future expectations about stock price volatility. Realized volatilities, however, are retrospective estimates that reflect only past stock price volatility. Realized volatilities can be obtained by using simple estimators such as the standard deviation of historical returns, or by applying more sophisticated methods such as an exponential weighted average or the generalized autoregressive conditional heteroskedasticity (GARCH) model. Implied volatilities are obtained by matching a set of market option prices with given strike price and maturity to those produced by an option pricing model using the same strike price and maturity.
Black-Scholes implied volatilities are extracted using the Black-Scholes formula. This must be done numerically because the formula cannot be solved for σ in terms of the other parameters. If σiv denotes the implied volatility, Cobs(K, T) denotes the observed call price with strike price K and time to maturity T, and CBS(σ, K, T) denotes the Black-Scholes price of the call with same strike price and maturity, then σiv is the value of volatility in the Black-Scholes formula such that
To find implied volatilities numerically, the objective function f(σ) is often defined by the squared loss function
Implied volatility is that value of volatility σ = σiv which produces a zero difference between the observed price and the Black-Scholes price
Squaring the difference ensures that a minimization algorithm such as the Newton-Raphson method does not produce large negative values for f(σiv) instead of a root. It is possible to use objective functions other than that specified by (4.5). This will become evident in Chapter 10. In that chapter, implied volatilities are treated more thoroughly.
One important feature of Black-Scholes implied volatilities is that they resemble a smile or smirk when plotted against moneyness. The smile is more pronounced for options with short maturities. This smile-shaped pattern, which consistently appears in volatilities extracted from a wide variety of options, has provided evidence against the constant volatility assumption inherent in the Black-Scholes model.
In this section we present VBA code to obtain Black-Scholes implied volatilities from a cross-section of option prices. The Excel file Chapter4IV contains volatilities implied from call options on IBM stock paying no dividends, with strike price ranging from $40 to $115, and maturity of 137 days. The BS_call() function defined earlier in this chapter is used for the Black-Scholes call price, and the NewtRaph() function defined in Chapter 1 is used to find the root of our objective function (4.5). This objective function is defined as the VBA function ImpliedVolatility().
Function ImpliedVolatility(S, K, r, q, T, v, CallPrice)
ImpliedVolatility = (CallPrice - BS_call(S, K, r, q, T, v)) ^ 2
End Function
The VBA function NewtRaph() is similar to that defined in Chapter 1, except that it uses the VBA function ImpliedVolatility() as the objective function and uses the Taylor approximation to the derivative.
Function NewtRaph(S, K, r, q, T, x_guess, CallPrice)
' More VBA statements
fx = Run('ImpliedVolatility', S, K, r, q, T, cur_x, CallPrice)
cur_x_delta = cur_x - delta_x
fx_delta = Run('ImpliedVolatility', S, K, r, q, T, cur_x_delta, CallPrice)
dx = ((fx - fx_delta) / delta_x)
' More VBA statements
End Function
Figure 4.3 illustrates how these functions are used to find implied volatilities from a single call price, from a series of call prices, and to plot an implied volatility smile. In the first case, a spot price of S = 100 (in cell E4), a strike price of K = 100 (cell E5), a risk-free rate of r = 0.03 (cell E6), no dividend yield (q = 0 in cell E7), a time to maturity of 137 days (T = 137/365 or 0.3753 years in cell E8), and a volatility v = 0.6 (cell E9) are used. To obtain the Black-Scholes price in cell E11 we type
FIGURE 4.3 Black-Scholes Implied Volatilities
which produces a call price of $15.0676. The NewtRaph() function, using a starting value of 0.4 in cell C11, is used to obtain the Black-Scholes implied volatility from the Black-Scholes price. Hence, in cell E12 we type
which produces the original volatility of 0.6000, as expected.
To obtain multiple implied volatilities, shown in the right set of columns in Figure 4.3, assume a spot price of S = 88.43 (in cell I1), strike prices ranging from 40 to 115 (cells H7:H22), and the same risk-free rate and dividend yield as in the previous example. The market price of each option is defined as the midpoint between the bid price (column I) and the ask price (column J). In the NewtRaph() function we use the same starting value as in the previous example. Hence, in cell G7 we type
which produces the implied volatility of 0.4995 for the option with strike price of K = 40. The formula in cell G7 can then be copied to cells G8:G22, which produces the remaining implied volatilities.
Finally, the plotting wizard can be invoked to produce a graph for the Black-Scholes implied volatility smile, using cells H7:H22 for values of the x-axis, and cells G7:G22 for values of the y-axis.
The parabolic shape of the volatility smile, and its dependence on moneyness and maturity, has motivated researchers to model implied volatility as a quadratic function of moneyness and maturity. Dumas, Fleming, and Whaley (1998) describe this as the deterministic volatility function (DVF) approach to modeling implied volatility. They consider four specifications for the DVF:
where
σiv= Black-Scholes implied volatility
K = strike price
T = time to maturity
a0, a1, a2, a3, a4, a5 = model parameters.
Each of these specifications stipulates a different form of the volatility function. Equation (4.7) assumes constant volatility with no dependence on the strike price or the time to maturity, and corresponds to the Black-Scholes model. Equation (4.8) stipulates volatility be a quadratic function of strike price, with no dependence on maturity. Equation (4.9) adds a dependence on maturity, with an interaction between moneyness and maturity contained in its last term. Equation (4.10) allows for the relationship between volatility and maturity to be quadratic also. In each of these models, a threshold of 0.01 is introduced to eliminate possible negative values of fitted volatility. For example, the model being fitted in Equation (4.9) is actually
Finally, a fifth model is defined which switches between models (4.8), (4.9), and (4.10) depending on whether the different expiration dates in the cross-section of option prices is one, two or three, respectively. Estimation of model parameters is done by minimizing error sum of squares between observed and fitted option prices.
DVF modeling is useful because it provides estimates of volatility for a combination of moneyness and maturity that is not available in observed option prices. For any such combination, volatility can be estimated from the fitted function. If a set of observed option prices contained a continuum of strike prices and time to maturity, there would be no need for the function. We would simply extract implied volatility from a cross-section of option prices with the strike price and time to maturity we require.
Dumas, Fleming, and Whaley (1998) show that of the five models under consideration, the Black-Scholes model leads to the largest valuation errors, consistent with the notion that volatility is not constant across moneyness and maturity. Most of the improvement over Black-Scholes, however, is from including K, K2, T, and KT into the volatility function. There is little improvement to be gained by introducing T2, squared maturity. This implies that volatility depends on both moneyness and maturity, but that smiles are dependent on moneyness only. The effect of maturity on volatility is linear only. In some cases, only K and K2 are needed. Hence, simple functions of volatility, such as those specified in Equations (4.8) and (4.9), are often sufficient for modeling volatility.
This model is referred to as the Practitioner Black-Scholes (PBS) model by Christoffersen and Jacobs (2004a), and as the ad-hoc model by Dumas, Fleming, and Whaley (1998). It constitutes a simple way to price options, based on implied volatilities and the Black-Scholes pricing formula. The assumption of constant volatility in the Black-Scholes model is circumvented by using volatility that is not constant, but rather depends on moneyness and maturity.
Implementing the PBS model is straightforward, since all that is required is a series of Black-Scholes implied volatilities on which to run multiple regression under ordinary least squares (OLS). This model can be summarized in four steps:
While this model provides a rudimentary method of obtaining option prices, its performance in terms of pricing errors is remarkably effective. Christoffersen and Jacobs (2004a) compare the pricing errors of two option pricing models: the PBS model and the Heston (1993) model. When a different loss function is used for the estimation of model parameters and for the evaluation of the model in terms of pricing errors, the Heston (1993) model prevails. When the same loss function is used for estimation and evaluation, however, the PBS model prevails. Christoffersen and Jacobs (2004a) argue that using the same loss functions for estimation and evaluation is preferable. Furthermore, when evaluating the performance of different models, the same loss function should be used across models, which will avoid making unfair comparisons. According to the results of their paper, the PBS model is preferable to the Heston (1993) model for pricing options. The fact that the PBS model is easy to implement makes it all the more attractive. In-sample and out-of-sample loss function estimation will be presented in Chapter 9.
The Excel file Chapter4PBS contains the PBS model to obtain fitted implied volatilities through the most general regression given by Equation (4.10). It uses the VBA functions BS_call(), which produces the Black-Scholes price for a call option, PBSparams(), which returns the six coefficients of the regression (4.10) estimated by OLS, and PBSvol(), which uses the estimated coefficients to produce fitted volatility for a given strike price and maturity. The function PBSparams() requires as inputs a vector of implied volatilities, impV, of strike prices, K, and of maturities, T. It returns the six regression coefficients a0 through a5 defined in Equation (4.10) and estimated by OLS using the VBA function OLSregress() introduced in Chapter 1.
Function PBSparams(impV, K, T)
n = Application.Count(impV)
Dim RHS() As Double
ReDim RHS(n, 6) As Double
For cnt = 1 To n
RHS(cnt, 1) = 1
RHS(cnt, 2) = K(cnt)
RHS(cnt, 3) = K(cnt) ^ 2
RHS(cnt, 4) = T(cnt) / 365
RHS(cnt, 5) = (T(cnt) / 365) ^ 2
RHS(cnt, 6) = K(cnt) * T(cnt) / 365
Next cnt
betas = OLSregress(impV, RHS)
PBSparams = betas
End Function
The function PBSvol() requires as inputs the six regression coefficients, a strike price, and a maturity, and returns a fitted volatility based on (4.10) or a value of 0.01 if the fitted volatility is negative.
Function PBSvol(p, K, T)
PBSvol = p(1) + p(2)*K + p(3)*K^2 + p(4)*T/365
+ p(5)*(T/365)^ 2 + p(6)*K*T/365
If PBSvol < 0 Then PBSvol = 0.01
End Function
Figure 4.4 illustrates how these functions are used to construct PBS fitted volatilities, using December 15, 2005, call options on IBM non-dividend-paying stock with spot price of $83.53 (in cell I4), strike price ranging from $50 to $120 in increments of $5 (cells A5:A47), and maturity ranging from 37 to 309 days (cells D5:D47). Figure 4.4 is from the Excel file Chapter4PBS, and has been truncated at 32 rows to conserve space.
FIGURE 4.4 Practitioner Black-Scholes Model
The first step is to obtain a set of Black-Scholes implied volatilities. These appear in cells E5:E47. Figure 4.4 uses a starting value of 0.7 for implied volatility (cell I7), along with a risk-free rate of 0.03 (cell I5), and the midpoint of the call option bid and ask price (cells B5:B47 and C5:C47, respectively) for the market price. Hence, in cell E5 we type
to produce the Black-Scholes implied volatility of 0.6218. The formula in cell E5 is then copied to cells E6:E47 to produce the remaining implied volatilities.
The second step is to select a deterministic volatility function. The VBA function PBSparams() uses the most general function given in (4.10) and requires as inputs implied volatilities, strike prices, and times to maturity. Hence, in cell I10 we type
and copy down to cells I11:I15, which produces estimates of the six parameters of (4.10), given by â0 = 1.23951, â1 = −0.01598, â2 = 0.00006, â3 = −0.78490, â4 = 0.21275, and â5 = 0.00552.
The third step is to obtain fitted volatilities for each strike price and time to maturity. The VBA function PBSvol() uses the six parameters estimated by PBSparams() to produce a fitted volatility from (4.10) using a given strike price and maturity. Hence, in cell F5 we type
to obtain a fitted volatility of 0.5319 for a strike price of K = 50 and a time to maturity of T = 37 days. As before, this formula is copied to cells F6:F47 to obtain the remaining fitted volatilities.
The fourth and final step of the PBS model is to price an option using the Black-Scholes pricing formula and the fitted volatility from (4.10) with parameters appearing in cells I10:I15. Figure 4.4 illustrates this for a strike price of K = 80 (cell M6) and a maturity of T = 100 days (cell M7). To obtain the fitted volatility for combination of strike price and maturity, in cell M9 we type
to produce a fitted volatility of 0.243338. To obtain the PBS price using this fitted volatility and the VBA function BS_call(), in cell M10 we type
to obtain the call option price of 6.56. It is also instructive to compare the PBS price with the market price. For example, replacing the strike price with K = 50 and the maturity with T = 37 days in cells M6 and M7, respectively, produces a PBS call price of 33.69, close to the bid and ask prices of 33.60 and 33.80 appearing in cells B5 and B6, respectively.
Finally, Figure 4.4 also includes a volatility smile for the Black-Scholes (BS) and PBS implied volatilities, for a maturity of T = 127 days. Hence the x-axis contains cells A14:A24 while the y-axis contains cells E14:E24 for the BS implied volatilities, and cells F14:F24 for the PBS implied volatilities. It is evident that the PBS implied volatilities produce a steeper curve and can therefore better capture the smile than the BS implied volatilities, which produce a curve that is flatter.
This model, which we refer to as the Gram-Charlier model, was developed by Backus, Foresi, and Wu (2004) and provides a simple way to account for both skewness and kurtosis. They use a Gram-Charlier expansion up to the fourth order in the distribution of returns of the underlying asset. This allows for skewness and greater kurtosis than the normal distribution to be introduced into option pricing. This model, however, still assumes that volatility is constant over time.
Define the one-period return on the asset as Rt+1 = logSt+1 − logSt, where St is the price of the asset at time t. Then the return over T periods is , which can be written
as the sum of the previous one-period returns. Suppose that Rt+1 has cumulant-generating function given by
where κj are the cumulants of Rt+1. If returns are identically and independently distributed, then the cumulants of their sum are given as Tκj so that the T-period return has mean and variance given by μT = Tμ and
, respectively. Back, Foresi, and Wu (2004) use the fact that if
and
denote the one-period skewness and excess kurtosis respectively, then the T-period skewness and excess kurtosis are given by and γ2T = γ2/T respectively.
Backus, Foresi, and Wu (2004) use the first four terms of the Gram-Charlier expansion to arrive at the following probability density for the standardized T-period return :
where
, the density of the standard normal distribution
φ(k)(x) = the kth derivative of φ(x).
It is easy to show by straightforward differentiation that φ(3)(x) = (3x − x3)φ(x) and φ(4)(x) = (x4 − 6x2 + 3)φ(x), so the density f(wT) is readily available.
Backus, Foresi, and Wu (2004) use the density f(wT) in the integral for the price of a call option with strike price K:
where r is the continuously compounded n-period interest rate and K is the strike price of the option. Substituting the Gram-Charlier density f(wT) for f(x), the call price becomes
where w* = (log(K/St) − μT)/σT. Backus, Foresi, and Wu (2004) break the integral into four parts and evaluate each separately. The first integral produces the usual Black-Scholes pricing formula, while the other integrals adjust the price for skewness and excess kurtosis. The resulting call price is shown to be approximately
Note that when skewness and excess kurtosis are both zero, the terms inside the square brackets in (4.11) become zero, and the Gram-Charlier formula for the call price CGC reduces to the Black-Scholes call price.
The form of d is identical to that given in the Black-Scholes formula, and depends on which type of option being priced. For options on a non-dividend-paying stock,
since . For a stock that pays dividends at rate q per period, in the pricing formula for CGC we replace St by its discounted value Ste−qT and use
For currency options, we use this latter formula for d, except that q denotes the foreign risk-free rate.
The price PGC of a put option with same maturity as the call is given by put-call parity. Hence,
For options on stock paying no dividends, q = 0 and the last term is simply St. By differentiating (4.11) and (4.12), it is possible to obtain closed-form expressions for the option sensitivities (the Greeks) of Gram-Charlier calls and puts. This will be done in Chapter 7.
The Excel file Chapter4GramCharlier contains the VBA function GC_call() to obtain the Gram-Charlier price (4.11) of a European call, and the VBA function GC_put() for the price of a European put using put-call parity (4.12).
Function fz(x)
fz = Exp(-x ^ 2 / 2) / Sqr(2 * Application.Pi())
End Function
Function GC_call(S, K, r, q, n, v, skew, kurt)
Nskew = skew / Sqr(n): Nkurt = kurt / n
Nvol = Sqr(n) * v
d = (Log(S / K) + n * (r - q) + Nvol ^ 2 / 2) / Nvol
GC_call = S * Exp(-q * n) * Gauss(d) - K * Exp(-r * n)
* Gauss(d - Nvol) + S * Exp(-q * n) * fz(d)
* Nvol * ((Nskew / 6) * (2 * Nvol - d)
- (Nkurt / 24) * (1 - d ^ 2 + 3 * d * Nvol - 3 * Nvol ^ 2))
End Function
Function GC_put(S, K, r, q, n, v, skew, kurt)
GC_put = GC_call(S, K, r, q, n, v, skew, kurt) + K * Exp(-r*n)
- S*Exp(-q*n)
End Function
The VBA function GC_call() requires the same inputs as the Black-Scholes function BS_call, plus the one-period skewness and kurtosis. The VBA function fz() computes the standard normal density, while the VBA function Gauss() computes cumulative probabilities of the standard normal distribution. Both functions are used to conserve space in subsequent functions.
Suppose an option on the non-dividend-paying stock presented in Figure 4.1 is to be priced, and suppose further that the one-month skewness and kurtosis of the stock are −2.3 and 1.2, respectively. Then S = 30, K = 30, r = 0.05/12 is the one-month risk-free rate, T = 5 months, and
is the one-month volatility. Figure 4.5 illustrates the use of the VBA functions for Gram-Charlier prices, contained in the Excel file Chapter4GramCharlier.
FIGURE 4.5 Gram-Charlier Prices for a Non-Dividend-Paying Stock
In cell C17 we type
which produces the call price of $2.519584. Similarly, in cell C19 we type
which produces the put price of $1.901049. Note that when kurtosis and skewness are both set to zero in cells C14 and C15, the VBA functions produce the Black-Scholes prices of $2.612638 for the call and $1.994104 for the put, exactly as in the example presented in Figure 4.1.
We illustrate the effect of skewness on option prices, using the experiment outlined in Exercise 3.3. We obtain the price of a call option with one month to maturity, using the Black-Scholes formula, and using the Gram-Charlier model with one period skewness equal to −3 and +3. We use a strike price of K = 30, vary the spot price from S = 20 to S = 40 in increments of $2.50 and plot the difference between the Gram-Charlier price and the Black-Scholes price. The results of this experiment are presented in the Excel file Chapter4CompareCGBS, and are illustrated in Figure 4.6.
FIGURE 4.6 Effect of Skewness on Option Prices
As expected, the Gram-Charlier model accounts for positive skewness (dashed line) by assigning a higher price than Black-Scholes to out-of-the money calls, but a lower price for in-the-money calls. The opposite is true when negative skewness is introduced into the Gram-Charlier price (solid line).
Finally, we evaluate how the Gram-Charlier model compares with the Edgeworth binomial tree of Chapter 3. Since both of these models introduce skewness and kurtosis, prices obtained from both models should be similar. The file Chapter4CompareGCEW evaluates the effect of skewness on both models, using parameter values that have been matched. This is illustrated in Figure 4.7. For each model, a plot of the difference in call price between the model and the Black-Scholes call price is produced in a manner identical to that in Figure 4.6.
FIGURE 4.7 Comparison of Edgeworth and Gram-Charlier Call Prices
The following parameter values are used, S = 30, K = 30, yearly volatility σ = 0.30, time to maturity T = 0.5 years or 6 months. The kurtosis and skewness for the Edgeworth tree must be chosen so that they fall within the locus illustrated in Exhibit 2 of Rubinstein (1998). The 6-month skewness is ξ = −0.4 in the Edgeworth tree, so in cell C23 the one-month skewness for the Gram-Charlier model must be set to or γ1 ≈ −0.98. Similarly, the 6-month kurtosis is κ = 4.5 in the Edgeworth tree, so in cell C24 the one-month kurtosis is set to γ2 = (4.5 − 3) × 6 or γ2 = 9. Since the Gram-Charlier model uses excess kurtosis, three must be subtracted from the Edgeworth kurtosis before multiplying the result by the number of months. Figure 4.7 is similar to the solid line in Figure 4.6, and indicates that the Edgeworth tree and the Gram-Charlier model both account for skewness. Moreover, the price differences produced by the Edgeworth tree (solid line) and the Gram-Charlier model (dashed line) are fairly close, even when only n = 100 steps are used in the Edgeworth tree.
This chapter deals with the Black-Scholes model, the most popular option pricing model, and extends this model to allow for dividends paid out at discrete time intervals. We also introduce Black-Scholes implied volatilities, which are volatilities extracted from option prices with the Black-Scholes formula. The Practitioner Black-Scholes (PBS) exploits the volatility smile by using implied volatilities as the volatility input to the Black-Scholes option price. Finally, the Gram-Charlier model provides a closed-form solution that allows for skewness and kurtosis in the returns distribution.
This section presents exercises that involve the Black-Scholes, PBS, and Gram-Charlier models introduced in this chapter. All VBA code for these exercises is contained in the Excel file Chapter 4 Exercises.
4.1 Obtain implied volatilities in the Excel file Chapter4 IV using two additional methods.
1. By deriving the analytic derivative of the objective function (4.5) and incorporating this derivative into the Newton-Raphson method.
2. By using the objective function f(σ) = CBS(σ, K, T) − Cobs(K, T) and the Bisection method to find the value σiv for σ that produces f(σiv) = 0. Compare the accuracy of both methods using a small number of iterations. Which root-finding algorithm is the best for finding Black-Scholes implied volatilities?
4.2 Using the most general deterministic volatility function in (4.10) may not be the optimal choice if some of the regression coefficients are not statistically significant. Modify the function OLSregress() in the Excel file Chapter4PBS to include p-values for the estimated coefficients. Using the data in that worksheet on options with maturity T = 37, 127, and 218 days only, exclude all coefficients that are not significant at the 1 percent level, and use a simpler deterministic volatility function. Obtain new parameter estimates and fitted volatilities using this simpler function.
4.3 By including a cost-of-carry term, the Black-Scholes formula can easily be generalized to price European options for stocks paying dividends, for futures, and for foreign currencies. The Black-Scholes formula becomes
for calls, and
for puts, where (Haug, 1998 ). For stocks paying dividends at a continuous rate q, we set b = r − q, for options on futures we set b = 0 and replace the stock price St byFt = SterT in the expressions for CBS, PBS, and d, and for options on currencies we set b = r − rF, where rF is the foreign risk-free rate. Program this general form of the Black-Scholes model in VBA.
4.1 We will see in Chapter 10 that the bisection method, along with the objective function f(σ) = CBS(σ, K, T) − Cobs(K, T), is particularly well suited for finding implied volatility. To find a positive value of f we simply choose a very large value of σ, and to find a negative value of f we choose a very small value. Hence, the values a = 100 and b = 0.01 are used as starting values for the bisection algorithm. Figures 4.8 and 4.9 both show that the implied volatilities obtained by the three methods are virtually indistinguishable from one another.
FIGURE 4.8 Solution to Exercise 4.1
FIGURE 4.9 Solution to Exercise 4.1
4.2 We can use the formulas in the Excel file Chapter1WLS to obtain the standard errors, t-statistics, and p-values for each regression coefficient of the deterministic volatility function, modified for OLS. Hence, we modify the VBA function OLSregress() by adding statements that produce these statistics. Running the regression (4.10) on all implied volatilities, excluding those for options with maturity T = 390 days, produces the values in Table 4.1 for the coefficients and their associated p-values. The results indicate that the coefficient for Maturity2 has a p-value of 0.04015, which is not significant at the 1 percent level. Hence, we exclude that term from the regression and opt for model (4.9) instead, which specifies implied volatility as a function of Strike, Strike2, Maturity, and Maturity × Strike. We therefore create a new VBA function PBSparams2(), to estimate by OLS the parameters of (4.9).
TABLE 4.1 Regression Coefficients and p-Values Based on (4.10)
Coefficient | Estimate | p-Value |
Intercept (a0) | 1.69346 | <0.00001 |
Strike (a1) | −0.02541 | <0.00001 |
Strike2 (a2) | 0.00010 | 0.00039 |
Maturity (a3) | −1.49915 | <0.00001 |
Maturity2 (a4) | 0.41584 | 0.04015 |
Strike × Maturity (a5) | 0.01322 | <0.00001 |
Function PBSparams2(impV, K, T)
n = Application.Count(impV)
Dim RHS() As Double
ReDim RHS(n, 5) As Double
For cnt = 1 To n
RHS(cnt, 1) = 1: RHS(cnt, 2) = K(cnt)
RHS(cnt, 3) = K(cnt) ^ 2
RHS(cnt, 4) = T(cnt) / 365
RHS(cnt, 5) = K(cnt) * T(cnt) / 365
Next cnt
betas = OLSregress(impV, RHS)
PBSparams2 = betas
End Function
Table 4.2 presents the parameter estimates and p-values for regression (4.9) produced by the PBSparams2() function. As expected, all coefficients are significant at the one percent level. We also create a new function, PBSvol2(), to produce fitted volatilities based on (4.9).
TABLE 4.2 Regression Coefficients and p-Values Based on (4.9)
Coefficient | Estimate | p-value |
Intercept (a0) | 1.66256 | <.00001 |
Strike (a1) | −0.02522 | <.00001 |
Strike2 (a2) | 0.00010 | 0.00098 |
Maturity (a3) | −1.25650 | <.00001 |
Strike × Maturity (a4) | 0.01397 | <.00001 |
Function PBSvol2(p, K, T)
PBSvol2 = p(1) + p(2) * K + p(3) * K ^ 2 + p(4) * T / 365
+ p(5) * K * T / 365
If PBSvol2 < 0 Then PBSvol2 = 0.01
End Function
The results of this Exercise are presented in Figure 4.10. The coefficients of model (4.10) appear in cells I11:I16, while those of model (4.9) appear in cells M11:M15. To fit the model (4.9), in cell M11 we type
and copy to the range M12:M15 to produce the estimated coefficients. To produce the fitted volatilities, in cell G5 we type
to produce the PBS fitted volatility based on (4.9) of 0.5891, which is lower than the fitted volatility of 0.5953 based on (4.10) in cell F5. The formula in cell G5 is then copied to cells G6:G36 to produce the remaining fitted volatilities based on (4.9). The PBS price of the IBM call option with strike price of K = 80 and maturity of T = 100 days is $6.38 (cell N7), 20 cents higher than the price of $6.18 produced by the fitted implied volatility using (4.10) which appears in cell N5.
FIGURE 4.10 Solution to Exercise 4.2
4.3 The VBA functions GenBS_Call() and GenBS_Put() produce the price of a call and put from the generalized Black-Scholes model, respectively.
Function Gauss(X)
Gauss = Application.NormSDist(X)
End Function
Function genbs_call(S, K, r, b, T, v)
d = (Log(S / K) + T * (b + 0.5 * v ^ 2)) / (v * Sqr(T))
genbs_call = Exp((b - r) * T) * S * Gauss(d)
- Exp(-r * T) * K * Gauss(d - v * Sqr(T))
End Function
Function genbs_put(S, K, r, b, T, v)
genbs_put = K * Exp(-r * T) * Gauss(v * Sqr(T) - d)
- S * Exp((b - r) * T) * Gauss(-d)
End Function
These functions are illustrated on Figure 4.11, using the same inputs as in Figure 4.1, but on a stock paying a continuous dividend yield of 2 percent annually. The price of the call is $2.400839 and the price of the put is $2.132818.
FIGURE 4.11 Solution to Exercise 4.3