Binomial Tree Option Pricing › Multi-Step Binomial Trees
Quantitative FinanceAll chapters Binomial Tree Option Pricing › Multi-Step Binomial TreesOne section · Sections in this chapter3 / 12 ↓
Reading tools Definitions & inline links
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
The one-step model captures the essential logic, but real options require finer granularity. A single period cannot adequately represent the continuous evolution of stock prices over months or years. American options also require intermediate time points at which to evaluate early exercise. We extend to multiple steps by dividing time to expiration into equal intervals, each of length . At each step, the stock price moves up by factor or down by factor , creating a tree of possible price paths.
Tree Structure and Recombination
Binomial trees recombine: an up move followed by a down move leads to the same price as a down move followed by an up move (). This property arises because multiplication is commutative, so the order of multiplying by and does not matter. The recombination property dramatically reduces the computational burden of the tree. Without recombination, each node would branch into two new nodes, creating terminal nodes after steps. With recombination, the tree "collapses" as paths converge to common nodes, leaving only distinct prices at the final step.

At the final time step , the possible stock prices are:
where:
- : stock price at maturity node
- : initial stock price
- : up and down factors
- : total number of steps
- : number of up moves
The price corresponds to a node that can be reached by any path with exactly up moves and down moves. The number of paths reaching this node is given by the binomial coefficient , which counts the number of ways to arrange up moves among total moves. This combinatorial structure gives the model its name: the binomial tree.
Backward Induction
We price options by working backward through the tree, a technique known as backward induction. This approach exploits the fact that at maturity, option values are known with certainty since they equal the payoff function evaluated at each terminal stock price. Starting from the known payoffs at expiration and moving step-by-step toward time zero, we apply the one-step pricing formula at each node. At each step, we treat each node as if it were the root of a one-step tree and calculate the option value using the risk-neutral pricing formula derived earlier.
At the final step , the option value at node is simply the payoff:
where:
- : option value at maturity node
- : stock price at maturity node
- : strike price
These terminal values serve as the boundary conditions for our backward recursion. From these known values, we can calculate the option value at any node one step earlier.
For any earlier node at step with up moves, we compute the option value as:
where:
- : option value at step , node
- : time step size
- : risk-neutral probability
- : option value in the up state (next step)
- : option value in the down state (next step)
- : risk-free interest rate
This formula says that the option value at node equals the discounted risk-neutral expected value of the option at the next time step. If the stock moves up from node , it arrives at node ; if it moves down, it arrives at node . The recursion propagates backward until we reach node , which gives us the current option price.
import numpy as np
def binomial_tree_european(S0, K, T, r, sigma, N, option_type="call"):
"""
Price a European option using a multi-step binomial tree.
Parameters:
-----------
S0 : float - Current stock price
K : float - Strike price
T : float - Time to expiration (years)
r : float - Risk-free rate (annualized)
sigma : float - Volatility (annualized)
N : int - Number of time steps
option_type : str - 'call' or 'put'
Returns:
--------
float : Option price
"""
dt = T / N # Time step size
# CRR parameters (we'll derive these shortly)
u = np.exp(sigma * np.sqrt(dt))
d = 1 / u
# Risk-neutral probability
p = (np.exp(r * dt) - d) / (u - d)
# Initialize stock prices at maturity (step N)
# S[j] = S0 * u^j * d^(N-j) for j = 0, 1, ..., N
S = np.zeros(N + 1)
for j in range(N + 1):
S[j] = S0 * (u**j) * (d ** (N - j))
# Initialize option values at maturity
if option_type == "call":
f = np.maximum(S - K, 0)
else:
f = np.maximum(K - S, 0)
# Backward induction through the tree
for i in range(N - 1, -1, -1):
for j in range(i + 1):
f[j] = np.exp(-r * dt) * (p * f[j + 1] + (1 - p) * f[j])
return f[0]# Example: Price a European call with different numbers of steps
S0 = 100
K = 100
T = 1
r = 0.05
sigma = 0.2
step_counts = [5, 10, 25, 50, 100]
prices = {}
for N in step_counts:
prices[N] = binomial_tree_european(S0, K, T, r, sigma, N, "call")N = 5 steps: Call price = $10.8059 N = 10 steps: Call price = $10.2534 N = 25 steps: Call price = $10.5210 N = 50 steps: Call price = $10.4107 N = 100 steps: Call price = $10.4306
Notice how the price oscillates and gradually converges as we increase the number of steps. This oscillatory behavior is characteristic of the binomial model and arises from the discrete nature of the tree structure. We'll explore this convergence behavior in detail later.