next up previous contents index
Next: Binomial option pricing. Up: Basic Option Pricing, analytical Previous: Adjusting for payouts of   Contents   Index


American options.

American options are much harder to deal with than European ones. The problem is that it may be optimal to use (exercise) the option before the final expiry date. This optimal exercise policy will affect the value of the option, and the exercise policy needs to be known when solving the pde. There is therefore no general analytical solutions for American call and put options. There is some special cases. For American Call options on assets that do not have any payouts, the American call price is the same as the European one, since the optimal exercise policy is to not exercise. For American Put is this not the case, it may pay to exercise them early. The known analytical American price is the case of a call on a stock that pays a known dividend, which is discussed next. In all other cases the American price has to be approximated using one of the techniques discussed in later chapters: Binomial approximation, numerical solution of the partial differential equation, or another numerical approximation.

Exact american call formula when stock is paying one dividend.

When a stock pays dividend, a call option on the stock may be optimally exercised just before the stock goes ex-dividend. While the general dividend problem is usually approximated somehow, for the special case of one dividend payment during the life of an option an analytical solution is available, due to Roll-Geske-Whaley. A first formulation of an analytical call price with dividends was in Roll (1977). This had some errors, that were partially corrected in Geske (1979), before Whaley (1981) gave a final, correct formula. See ch 10.A2 of Hull (1993) for a textbook summary.

We use the following notation:

A first check of early exercise is:

\begin{displaymath}D_1 \le X\left(1-e^{-r(T-t_1)}\right) \end{displaymath}

If this inequality is fulfilled, early exercise is not optimal, and the value of the option is

\begin{displaymath}c(S-e^{-r(t_1-t)}D_1, X, r, \sigma, (T-t) ) \end{displaymath}

where $c(\cdot)$ is the regular Black Scholes formula.

Otherwise, the following is the formula for the American call value.

C &=& (S-D_1e^{-r\tau_1}) [ N(b_1) + N(a_1,-b_1,\rho) ]\\
&& - (X-D_1)e^{-r\tau_1}N(b_2)


\begin{displaymath}\rho = -\sqrt{\frac{\tau_1}{\tau}} \end{displaymath}

\begin{displaymath}a_1 =
{\log\left(\frac{S-D_1e^{-t\tau_1}}{X}\right) +(r+\frac{1}{2}\sigma^2)\tau }

\begin{displaymath}a_2 = a_1 - \sigma\sqrt{\tau} \end{displaymath}

\begin{displaymath}b_1 =
{\log\left(\frac{S-D_1e^{-t\tau_1}}{\bar{S}}\right) +(r+\frac{1}{2}\sigma^2)\tau_1 }

\begin{displaymath}b_2 = b_1 - \sigma\sqrt{\tau} \end{displaymath}

\begin{displaymath}\tau_1 = t_1-t \end{displaymath}

\begin{displaymath}\tau = T-t \end{displaymath}

and $\bar{S}$ solves

\begin{displaymath}c(\bar{S},t_1) = \bar{S}+D_1-X \end{displaymath}

Computer algorithm, Roll-Geske-Whaley call formula.

// file
// author: Bernt A Oedegaard
// calculate dividend adjusted formula for american call option.

#include <cmath>
#include "normdist.h"  // define the normal distribution functions
#include "fin_algoritms.h"  // the regular black sholes formula

double option_price_american_call_dividend(double S,
					    double X,
					    double r,
					    double sigma,
					    double tau,
					    double D1, 
					    double tau1)
   if (D1 <= X* (1.0-exp(-r*(tau-tau1)))) // check for no exercise
      return option_price_call_black_scholes(S-exp(-r*tau1)*D1,X,r,sigma,tau);

   double ACCURACY = 1e-6;              // decrease this for more accuracy

   double sigma_sqr = sigma*sigma;
   double tau_sqrt = sqrt(tau);
   double tau1_sqrt = sqrt(tau1);
   double rho = - sqrt(tau1/tau);

   double S_bar = 0;  // first find the S_bar that solves c=S_bar+D1-X 
   double S_low=0;    // the simplest: binomial search
   double S_high=S;  // start by finding a very high S above S_bar
   double c = option_price_call_black_scholes(S_high,X,r,sigma,tau-tau1);
   double test = c-S_high-D1+X;
   while ( (test>0.0) 
	   && (S_high<=1e10) ) {
      S_high *= 2.0;
      c = option_price_call_black_scholes(S_high,X,r,sigma,tau-tau1);
      test = c-S_high-D1+X;
   if (S_high>1e10) { // early exercise never optimal, find BS value
      return option_price_call_black_scholes(S-D1*exp(-r*tau1),X,r,sigma,tau);

   S_bar = 0.5 * S_high;  // now find S_bar that solves c=S_bar-D+X
   c = option_price_call_black_scholes(S_bar,X,r,sigma,tau-tau1);
   test = c-S_bar-D1+X;
   while ( (fabs(test)>ACCURACY)
	   && ((S_high-S_low)>ACCURACY) ) {
      if (test<0.0) { S_high = S_bar; }
      else { S_low = S_bar; };
      S_bar = 0.5 * (S_high + S_low);
      c = option_price_call_black_scholes(S_bar,X,r,sigma,tau-tau1);
      test = c-S_bar-D1+X;
   double a1 =  (log((S-D1*exp(-r*tau1))/X) +( r+0.5*sigma_sqr)*tau)
      / (sigma*tau_sqrt);
   double a2 = a1 - sigma*tau_sqrt;
   double b1 = (log((S-D1*exp(-r*tau1))/S_bar) + (r+0.5*sigma_sqr)*tau1)
      / (sigma*tau1_sqrt);
   double b2 = b1 - sigma * tau1_sqrt;
   double C = (S-D1*exp(-r*tau1)) * N(b1) 
      + (S-D1*exp(-r*tau1)) * N(a1,-b1,rho)
      - (X*exp(-r*tau))*N(a2,-b2,rho)
      - (X-D1)*exp(-r*tau1)*N(b2);
   return C;

next up previous contents index
Next: Binomial option pricing. Up: Basic Option Pricing, analytical Previous: Adjusting for payouts of   Contents   Index
Bernt Arne Odegaard