American Options
American Options
Visit the Mathema Option Pricing System for foreign exchange options and structured product valuation!
For American call and put options, we use the quadratic approximation method.
Barone-Adesi and Whaley's Quadratic Approximation Method
We now discuss a method for approximating the price of American options, proposed by Barone-Adesi and Whaley (1987) (BAW). Here, it is assumed that the commodity has continuous payouts. The starting point of this approximation is the (Black-Scholes) stochastic differential equation, which applies to the value of any derivative with price.
Here, is the (unknown) formula determining the conditional equity price. For European options, has a known solution, namely the adjusted Black-Scholes formula. For American options, which may be exercised early, there is no known analytical solution.
To approximate the solution, BAW decomposes the American option price into the European option price and the early exercise premium.
Here, represents the early exercise premium. The key used by BAW is that must also satisfy the same partial differential equation. To obtain an approximate solution, BAW transforms the equation (12.1) into a standard linear homogeneous second-order equation, which has a known solution.
The functional form of the approximate solution is as follows:
where
Equation 12.1: Functional form of Barone-Adesi and Whaley's approximation for the value of an American call option.
Here, satisfies the following equation:
In implementing this formula, the only problem is finding the critical value . This is a classic problem of finding the root of the equation.
This can be solved using Newton's method. We first find an initial "seed" value . The next estimate is obtained as follows:
At each step, we need to compute and its derivative .
Here, is the Black-Scholes value of the commodity. The code below demonstrates the implementation of this formula for calculating the call option price.
import math
from scipy.stats import norm
ACCURACY = 1.0e-6
def option_price_american_call_approximated_baw(S, X, r, b, sigma, time):
sigma_sqr = sigma * sigma
time_sqrt = math.sqrt(time)
nn = 2.0 * b / sigma_sqr
m = 2.0 * r / sigma_sqr
K = 1.0 - math.exp(-r * time)
q2 = ((-(nn - 1) + math.sqrt(pow((nn - 1), 2.0) + (4 * m / K))) * 0.5)
# seed value from paper
q2_inf = 0.5 * ((-(nn - 1) + math.sqrt(pow((nn - 1), 2.0) + 4.0 * m)))
S_star_inf = X / (1.0 - 1.0 / q2_inf)
h2 = (-(b * time + 2.0 * sigma * time_sqrt)) * (X / (S_star_inf - X))
S_seed = X + (S_star_inf - X) * (1.0 - math.exp(h2))
no_iterations = 0 # iterate on S to find S_star using Newton steps
Si = S_seed
g = 1
gprime = 1.0
while ((abs(g) > ACCURACY) and
(abs(gprime) > ACCURACY) and # to avoid exploding Newton's
(no_iterations < 500) and
(Si > 0.0)):
c = option_price_european_call_payout(Si, X, r, b, sigma, time)
d1 = (math.log(Si / X) + (b + 0.5 * sigma_sqr) * time) / (sigma * time_sqrt)
g = (1.0 - 1.0 / q2) * Si - X - c + (1.0 / q2) * Si * math.exp((b - r) * time) * norm.cdf(d1)
gprime = (1.0 - 1.0 / q2) * (1.0 - math.exp((b - r) * time) * norm.cdf(d1)) + (1.0 / q2) * math.exp((b - r) * time) * norm.pdf(d1) * (1.0 / (sigma * time_sqrt))
Si = Si - (g / gprime)
S_star = 0
if (abs(g) > ACCURACY):
S_star = S_seed # did not converge
else:
S_star = Si
C = 0
c = option_price_european_call_payout(S, X, r, b, sigma, time)
if (S >= S_star):
C = S - X
else:
d1 = (math.log(S_star / X) + (b + 0.5 * sigma_sqr) * time) / (sigma * time_sqrt)
A2 = (1.0 - math.exp((b - r) * time) * norm.cdf(d1)) * (S_star / q2)
C = c + A2 * pow((S / S_star), q2)
return max(C, c) # known value will never be less than Black-Scholes value
The BAW method can also be used to value put options by approximating their value.
Similarly, the value can be estimated by iteratively solving for , for example, using Newton's method, where now we need to use: