Single Asset - Muli Period Binomial Model - Pricing American Options

Bond/Asset Price @ Time t = 0 and up/down asset fraction changes w/ probability up given by p and risk free interest rate given by r.

Szero = 110.;
sigma = .32;
r=.1;
delta = .08;
h=1/4;
down = Exp[(r-delta)*h-sigma*Sqrt[h]];
up = Exp[(r-delta)*h+sigma*Sqrt[h]];
up
down

Compute Risk Neutral Probabilities

prn = (Exp[(r-delta)*h]-down)/(up-down);
qrn = 1-prn;

Define Various Basic Derivatives

EuropeanCall[S_,K_]:=Max[S-K,0];
EuropeanPut[S_,K_]:=Max[K-S,0];
Straddle[S_,K_]:=EuropeanCall[S,K]+EuropeanPut[S,K];

Replicated Derivative Pricing Function Recursively Using Risk Neutral Expected Values of Intrinsic and Continuation Values of the Derivative.  Lambda is the derivative of interest.  K is the strike price, if relevant.  T denotes the number of time periods.  The vector of option prices are listed for each period, starting with period T and ending with the price at time t = 0 at the beginning of period 1.

T = 3;

K = 100;

Lambda[S_,K_]:=EuropeanCall[S,K];

InitialPriceVector = Table[(up^n)*(down^(T-n))*Szero,{n,0,T}];

NewOptionValueList = Table[Lambda[x,K],{x,InitialPriceVector}];

PriceVector=InitialPriceVector;


Do[

Print[NewOptionValueList]; 

OldOptionValueList = NewOptionValueList;

PriceVector = Table[(up^n)*(down^(T-n-j))*Szero,{n,0,T-j}];

NewOptionValueList = Table[Max[Lambda[PriceVector[[i]],K],Exp[-(r*h)]*(prn*OldOptionValueList[[i+1]]+qrn*OldOptionValueList[[i]])],{i,1,T+1-j}];

,{j,1, T}];

 Print["Arbitrage Free American Option Price is $"<>ToString[NewOptionValueList[[1]]]]