Single Asset - Multi-Period Binomial Model - Pricing European Options

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

Szero = 130.;
sigma = .35;
r=.07;
delta = .02;
h=1/12;
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;
prn
qrn

Define Call & Put Derivatives To Be Priced (also an example straddle payoff function)

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 = 8;

K = 247;

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[(Exp[-(r*h)])*(prn*OldOptionValueList[[i+1]]+qrn*OldOptionValueList[[i]]),{i,1,T+1-j}];

,{j,1, T}];

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