MODEL:
SETS:
! optonfx;
! Keywords: foreign exchange, option pricing,
binomial option pricing, derivative;
! Binomial option pricing model on foreign exchange:
What is the value in $ of an option to buy one unit of
a foreign currency at specified/strike exchange rate?
We assume that the exchange rate can either go up
from one period to the next with probability PUP,
or down with probability (1 - PUP). ;
! No. of discrete periods to use, including time now
( 6 means 5 future periods);
PERIOD /1..6/:;
ENDSETS
DATA:
! Based on example in DeRosa(1992);
! Current exchange rate, $ per foreign unit;
XCURR = .5893;
! Strike exchange rate, i.e., right to exchange
$ for foreign at this rate;
XSTRK =.58;
! Yearly interest rate in $ country;
IRD = .0581;
! Yearly interest rate in foreign country;
IRF = .0881;
! Years to maturity for the option;
MATRT = .098630137; !( = 36/365);
! Yearly variance in exchange rate;
SIG = .13;
ENDDATA
!------------------------------------------------------;
SETS:
! Generate state matrix for the DP. STATE( S, T) may
be entered from STATE( S, T - 1) if FX rate went down,
or from STATE( S - 1, T - 1) if FX rate went up;
STATE( PERIOD, PERIOD)| &1 #LE# &2:
FXRATE, ! There is an FX rate, and...;
VAL; ! a value of the option;
ENDSETS
! Compute number of periods;
LASTP = @SIZE( PERIOD);
! Initialize the FXRATE table;
FXRATE( 1, 1) = XCURR;
! Compute some constants;
! To avoid warning messages when IRDIFM < 0;
@FREE( IRDIFM);
IRDIFM = ( IRD - IRF) * MATRT/( LASTP - 1);
SIGMSR = SIG * (( MATRT/( LASTP - 1))^.5);
DISF = @EXP( - IRD * MATRT/( LASTP - 1));
! The up factor;
UPF = @EXP( IRDIFM + SIGMSR);
! The down factor;
DNF = @EXP( IRDIFM - SIGMSR);
! Probability of an up move( assumes SIG > 0);
PUP = (@EXP( IRDIFM)- DNF)/( UPF - DNF);
PDN = 1 - PUP;
! First the states where it goes down every period;
@FOR( PERIOD( T) | T #GT# 1:
FXRATE( 1, T) = FXRATE( 1, T - 1) * DNF);
! Now compute for all other states S, period T;
@FOR( STATE( S, T)| T #GT# 1 #AND# S #GT# 1:
FXRATE( S, T) = FXRATE( S - 1, T - 1) * UPF);
! Do the dynamic programing;
! Set values in the final period;
@FOR( PERIOD( S):
VAL( S, LASTP) = @SMAX( FXRATE( S, LASTP) - XSTRK, 0));
! and for the earlier periods;
@FOR( STATE( S, T) | T #LT# LASTP:
VAL( S, T) = @SMAX( FXRATE( S, T) - XSTRK,
DISF * ( PUP * VAL( S + 1, T + 1) +
PDN * VAL( S, T + 1))));
! Finally, the value of the option now;
VALUE = VAL( 1, 1);
END
|