Binomial Model: Two Period
Extending the one-period binomial model to two periods — turns out it's the same trick applied twice, and the binomial weights just fall right out naturally.
Alright, picking up right where we left off — one period done, now two period. haha
You know that thing people say about physicists? That they only know three numbers?
I wonder if it’s the same for math people??? haha Those three numbers are, precisely: 1, 2, and n. lmaooo Well — financial engineering is basically what happened when mathematicians and physicists got hungry enough to throw themselves at Wall Street, so… haha
Yeah. We’re going to derive two period, and then immediately jump to n period for the full generalization. And then I think that’s that, heh.

So for two period, there are three possible outcomes at maturity, like so. Simple!! heh We just came from one period, so this is honestly a piece of cake.
The whole trick is just: look at it one period at a time.
That’s why I went ahead and drew those blue lines and red lines in there on purpose. From the blue line’s perspective — it’s a one-period setup, exactly like what we just did. So the conclusion is the same as before.
What was it again?
![]()
OK but — this is written entirely from the blue line’s perspective, as the present value of the Call. Since we now have three possible outcomes at maturity, we need to shift our reference point.
(And don’t forget — it’s European.)
So let’s shift over to that red underline. And if we look at it from there… this is just…

Since it’s structurally the same thing, it’s gotta have the same form as the expression above — just with different subscripts!
So we can write $c_u$ and $c_d$ by swapping the subscripts.

Now we need $c_{uu}$, $c_{ud}$, and $c_{dd}$ — and that’s easy too…!!! They’re just the call values at maturity.

Done!! OK so now we need to express the present value of $c$ in terms of $c_{uu}$, $c_{ud}$, $c_{dd}$!!! First —

Sub those in —

Now simplify!!! Not hard at all!!!
![]()
In one period it was a weighted sum of 2 terms. In two period it’s a weighted sum of 3 terms. And if we try to read the expression a bit —
![]()
What’s in the blue box is the values we’re summing up. (Discounted to present value together with that exp term at the end, of course.) We add these three up with their respective weights: $S_{uu} - K$ shows up with probability $\rho^2$, $S_{ud} - K$ shows up with probability $\rho(1-\rho)$, and $S_{dd} - K$ shows up with probability $(1-\rho)^2$.
And the black numbers?
Those are the number of ways each outcome can occur.

So for each possible value, (probability) × (number of paths) together acts as the “weight” — and that’s what the binomial model is doing. It’s pricing the option.
That’s the whole idea. T_T
(Heads up — the explanation above assumes $c_{uu}$, $c_{ud}$, $c_{dd}$ always come out as something like $S_{uu} - K$, but in reality those might be zero!!! So strictly speaking it’s a simplification. I just used concrete positive values because I figured it’d be easier to follow that way.)
Two period done. Now we’re heading toward n period — but let me quickly code this up first. The main thing to pick up here is how the With ~ End construct works. That’s really it, so I’m just going to —

…Posting during the semester is… ugh. Sorry, time is absolutely chasing me… I’ll try to cover as much as I can with screenshots. T_T

import numpy as np
import matplotlib.pyplot as plt
import os
path = r'C:\Users\GD Park\Desktop\financial-engineering'
os.chdir(path)
def Binomial_European_Two_period(S, K, up, rf):
dn = 1/up
t = 1
n = 2
dt = t/n
r = np.exp(rf * dt)
df = 1/r
rho = (r - dn) / (up - dn)
cuu = max(S*up*up - K, 0)
cud = max(S*up*dn - K, 0)
cdd = max(S*dn*dn - K, 0)
cu = ((rho * cuu) + ((1-rho) * cud)) * df
cd = ((rho * cud) + ((1-rho) * cdd)) * df
c = ((rho * cu) + ((1-rho) * cd)) * df
return c
Binomial_European_Two_period_ex = Binomial_European_Two_period(S=100, K=100, up=1.1, rf=0.05)
print(Binomial_European_Two_period_ex)
SS = np.linspace(0, 200, 1000)
YY = np.zeros(len(SS))
for i in range(len(SS)):
YY[i] = Binomial_European_Two_period(S=SS[i], K=100, up=1.1, rf=0.05)
plt.figure(figsize=(6, 4))
plt.plot(SS, YY)
plt.xlabel('S')
plt.ylabel('P')
plt.title('Binomial_European_Two_period')
plt.savefig('Binomial_European_Two_period.png', dpi=200)
Comments
Discussion happens via GitHub Discussions. You'll need a GitHub account to comment.