Binomial Tree Option Pricing › Multi-Step Binomial Trees

Michael BrenndoerferDecember 1, 20257 min read
Quantitative FinanceAll chapters
Part 6 of 15Numerical Methods for Derivative Pricing
Chapter 33Binomial Tree Option Pricing › Multi-Step Binomial Trees
Reading section 3 of 12 · Multi-Step Binomial Trees · 7 minSection 3 of 12 · 7 min

Book contents

Section 3 of 12 · 7 min read

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 NN equal intervals, each of length Δt=T/N\Delta t = T/N. At each step, the stock price moves up by factor uu or down by factor dd, 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 (udS0=duS0udS_0 = duS_0). This property arises because multiplication is commutative, so the order of multiplying by uu and dd 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 2N2^N terminal nodes after NN steps. With recombination, the tree "collapses" as paths converge to common nodes, leaving only N+1N+1 distinct prices at the final step.

Out[7]:
Visualization
Three-step lattice diagram with up and down branches, ten labeled stock-price nodes, and four time columns. Paths recombine at the central nodes, leaving four terminal prices at t=3.
Three-step recombining binomial tree showing the evolution of stock prices from $t=0$ to $t=3$. The lattice structure demonstrates how an up-move followed by a down-move leads to the same node as a down-move followed by an up-move, resulting in $N+1$ terminal nodes rather than $2^N$.

At the final time step NN, the possible stock prices are:

SN,j=S0⋅uj⋅dN−j,j=0,1,…,NS_{N,j} = S_0 \cdot u^j \cdot d^{N-j}, \quad j = 0, 1, \ldots, N

where:

  • SN,jS_{N,j}: stock price at maturity node jj
  • S0S_0: initial stock price
  • u,du, d: up and down factors
  • NN: total number of steps
  • jj: number of up moves

The price SjS_j corresponds to a node that can be reached by any path with exactly jj up moves and N−jN-j down moves. The number of paths reaching this node is given by the binomial coefficient (Nj)\binom{N}{j}, which counts the number of ways to arrange jj up moves among NN 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 NN, the option value at node jj is simply the payoff:

fN,j=max⁡(SN,j−K,0)for a callfN,j=max⁡(K−SN,j,0)for a put\begin{aligned} f_{N,j} &= \max(S_{N,j} - K, 0) && \text{for a call} \\ f_{N,j} &= \max(K - S_{N,j}, 0) && \text{for a put} \end{aligned}

where:

  • fN,jf_{N,j}: option value at maturity node jj
  • SN,jS_{N,j}: stock price at maturity node jj
  • KK: 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 i<Ni < N with jj up moves, we compute the option value as:

fi,j=e−rΔt[p⋅fi+1,j+1+(1−p)⋅fi+1,j]f_{i,j} = e^{-r\Delta t}\left[p \cdot f_{i+1,j+1} + (1-p) \cdot f_{i+1,j}\right]

where:

  • fi,jf_{i,j}: option value at step ii, node jj
  • Δt\Delta t: time step size
  • pp: risk-neutral probability
  • fi+1,j+1f_{i+1,j+1}: option value in the up state (next step)
  • fi+1,jf_{i+1,j}: option value in the down state (next step)
  • rr: risk-free interest rate

This formula says that the option value at node (i,j)(i,j) equals the discounted risk-neutral expected value of the option at the next time step. If the stock moves up from node (i,j)(i,j), it arrives at node (i+1,j+1)(i+1,j+1); if it moves down, it arrives at node (i+1,j)(i+1,j). The recursion propagates backward until we reach node (0,0)(0, 0), which gives us the current option price.

In[8]:
Code
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]
In[9]:
Code
# 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")
Out[10]:
Console
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.