Several ways are possible:
cf = Compile[{{call, _Real, 1}, {qU, _Real, 0}, {qD, _Real, 0}, {n, _Integer, 0}},
Module[{c = call},
Do[
c = qU Most[c] + qD Rest[c];
,
n
];
c
]
];
ClearAll[DoItOrig, DoIt, DoIt2, DoItC]
DoItOrig[] := Module[{S, K, \[Alpha], \[Sigma], T, r, n, dt, R, u, d, qU, qD, call},
S = 100;
K = 100;
\[Alpha] = 0.07;
\[Sigma] = 0.2;
T = 1;
r = 0.03;
n = 252;
dt = T/n;
R = E^(r dt);
u = E^(\[Alpha] dt + \[Sigma] Sqrt[dt]);
d = E^(\[Alpha] dt - \[Sigma] Sqrt[dt]);
qU = (R - d)/(R (u - d));
qD = (1 - R qU)/R;
call = Clip[S u^Range[n, 0, -1] d^Range[0, n] - K, {0, \[Infinity]}];
Do[call = qU call[[;; -2]] + qD call[[2 ;;]], {n}];
call
]
DoIt[] := Module[{S, K, \[Alpha], \[Sigma], T, r, n, dt, R, u, d, qU, qD, call},
S = 100;
K = 100;
\[Alpha] = 0.07;
\[Sigma] = 0.2;
T = 1;
r = 0.03;
n = 252;
dt = T/n;
R = E^(r dt);
u = E^(\[Alpha] dt + \[Sigma] Sqrt[dt]);
d = E^(\[Alpha] dt - \[Sigma] Sqrt[dt]);
qU = (R - d)/(R (u - d));
qD = (1 - R qU)/R;
call = Ramp[S u^Range[n, 0, -1] d^Range[0, n] - K];
Nest[qU Most[#] + qD Rest[#] &, call, n]
]
DoItC[] := Module[{S, K, \[Alpha], \[Sigma], T, r, n, dt, R, u, d, qU, qD, call},
S = 100;
K = 100;
\[Alpha] = 0.07;
\[Sigma] = 0.2;
T = 1;
r = 0.03;
n = 252;
dt = T/n;
R = E^(r dt);
u = E^(\[Alpha] dt + \[Sigma] Sqrt[dt]);
d = E^(\[Alpha] dt - \[Sigma] Sqrt[dt]);
qU = (R - d)/(R (u - d));
qD = (1 - R qU)/R;
call = Ramp[S u^Range[n, 0, -1] d^Range[0, n] - K];
cf[call, qU, qD, n]
]
DoIt2[] := Module[{S, K, \[Alpha], \[Sigma], T, r, n, dt, R, u, d, qU, qD, call, pr},
S = 100;
K = 100;
\[Alpha] = 0.07;
\[Sigma] = 0.2;
T = 1;
r = 0.03;
n = 252;
dt = T/n;
R = E^(r dt);
u = E^(\[Alpha] dt + \[Sigma] Sqrt[dt]);
d = E^(\[Alpha] dt - \[Sigma] Sqrt[dt]);
qU = (R - d)/(R (u - d));
qD = (1 - R qU)/R;
call = Ramp[S u^Range[n, 0, -1] d^Range[0, n] - K];
pr = qU^Range[n, 0, -1] qD^Range[0, n] Binomial[n, Range[0, n]];
pr.call
]
With the following timings:
RepeatedTiming[a = DoItOrig[]]
RepeatedTiming[b = DoIt[]]
RepeatedTiming[c = DoItC[]]
RepeatedTiming[d = DoIt2[]]
{0.00187, {9.41536}}
{0.00072, {9.41536}}
{0.00044, {9.41536}}
{0.00048, 9.41536}
I don't think the Compile works as fast as it can because the array is resizing all the time. If you would keep the array fixed-length somehow it would be much faster I expect.