MODEL:
SETS:
! Binomial option pricing model(optionb):
We assume that a stock can either go up in value
from one period to the next with probability PUP,
or down with probability (1 - PUP). Under this assumption,
the log of a stock's return will be binomially distributed.
In addition, the symmetric probabilities allow
us to build a dynamic programming recursion to
determine the option's value;
! Keywords: Black/Scholes, option pricing,
binomial option pricing, derivative/financial;
! No. of periods, e.g., weeks;
PERIOD /1..20/:;
ENDSETS
DATA:
! Current price of the stock;
PNOW = 40.75;
! Exercise price at option expiration;
STRIKE = 40;
! Yearly interest rate;
IRATE = .163;
! Weekly variance in log of price;
WVAR = .005216191 ;
! The actual price of this option as quoted in the
Wall Street Journal was 6.625.
The continuous time Black/Scholes formula gives
a price of 6.576;
ENDDATA
!-------------------------------------------------------;
SETS:
! Generate our state matrix for the DP. STATE( S, T) may
be entered from STATE( S, T - 1) if stock lost value, or
it may be entered from STATE( S - 1, T - 1) if stock
gained;
STATE( PERIOD, PERIOD)| &1 #LE# &2:
PRICE, ! There is a stock price, and...;
VAL; ! a value of the option;
ENDSETS
! Compute number of periods;
LASTP = @SIZE( PERIOD);
! Get the weekly interest rate;
( 1 + WRATE) ^ 52 = ( 1 + IRATE);
! The weekly discount factor;
DISF = 1/( 1 + WRATE);
! Use the fact that if LOG( P) is normal with
mean LOGM and variance WVAR, then P has
mean EXP( LOGM + WVAR/2), solving for LOGM...;
LOGM = @LOG( 1 + WRATE) - WVAR/ 2;
! Get the log of the up factor;
LUPF = ( LOGM * LOGM + WVAR) ^ .5;
! The actual up move factor;
UPF = @EXP( LUPF);
! and the down move factor;
DNF = 1/ UPF;
! Probability of an up move;
PUP = .5 * ( 1 + LOGM/ LUPF);
! Initialize the price table;
PRICE( 1, 1) = PNOW;
! First the states where it goes down every period;
@FOR( PERIOD( T) | T #GT# 1:
PRICE( 1, T) = PRICE( 1, T - 1) * DNF);
! Now compute for all other states S, period T;
@FOR( STATE( S, T)| T #GT# 1 #AND# S #GT# 1:
PRICE( S, T) = PRICE( S - 1, T - 1) * UPF);
! Set values in the final period;
@FOR( PERIOD( S):
VAL( S, LASTP) = @SMAX( PRICE( S, LASTP) - STRIKE, 0));
! Do the dynamic programing;
@FOR( STATE( S, T) | T #LT# LASTP:
VAL( S, T) = DISF * ( PUP * VAL( S + 1, T + 1) +
( 1 - PUP) * VAL( S, T + 1)));
! Finally, the value of the option now;
VALUE = VAL( 1, 1);
END
|