Code:
-module(crr).
-import(math, [log/1, sqrt/1, exp/1, pow/2]).
-export([optionPrice/7]).
max(X, Y) when X > Y -> X;
max(_X, Y) -> Y.
optionPrice(CP, S, K, T, R, V, N) ->
Dt = T / N,
Df = exp(-R * Dt),
U = exp(V * sqrt(Dt)),
D = 1 / U,
Pu = (exp(R * Dt) - D) / (U - D),
Pd = 1 - Pu,
S * f(0, 0, CP, K / S , Df, log(U), Pu, Pd, N).
s(J, U) ->
exp(J * U).
f(N, J, CP, X, _Df, U, _Pu, _Pd, N) ->
Sij = s(J, U),
max(CP * (Sij - X), 0);
f(I, J, CP, X, Df, U, Pu, Pd, N) ->
Sij = s(J, U),
Vij = Df * (
Pu * f(I + 1, J + 1, CP, X, Df, U, Pu, Pd, N) +
Pd * f(I + 1, J - 1, CP, X, Df, U, Pu, Pd, N) ),
max(CP * (Sij - X), Vij).