Option Base 0 'arrays number from 0
Function BinOptVal(iopt, iea, S, X, r, q, tyr, sigma, nstep) 'code for European Options CRR
'returns binomial option value,European only where iopt=1 for call,-1 for put and iea=1 for EU,2 for USA
Dim delt, erdt, ermqdt, u, d, p, pstar
Dim i As Integer, j As Integer
Dim vvec As Variant
ReDim vvec(nstep) 'known size of vector
'calculate parameters
delt = tyr / nstep 'length of time step
erdt = Exp(r * delt) 'compounding factor
ermqdt = Exp((r - q) * delt) 'drift term
u = Exp(sigma * Sqr(delt)) 'up multiplier
d = 1 / u ' down multiplier
p = (ermqdt - d) / (u - d) 'up prob
pstar = 1 - p 'down prob
'calculating vector of of option values after nstep
For i = 0 To nstep
vvec(i) = Application.Max(iopt * (S * (u ^ i) * (d ^ (nstep - i)) - X), 0)
Next i
'claculating conditional payoff & discounting back step-by-step
For j = nstep - 1 To 0 Setp-1
For i = 0 To j
vvec(i) = (p * vvec(i + 1) + pstar * vvec(i)) / erdt
If iea = 2 Then vvec(i) = Application.Max(vvec(i), iopt * (S * (u ^ i) * (d ^ (j - i)) - X))
Next i
Next j
BinOptVal = vvec(0)
End Function