Binomial Tree Option Pricing › Dividends and Extensions
Quantitative FinanceAll chapters Binomial Tree Option Pricing › Dividends and ExtensionsOne section · Sections in this chapter9 / 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
Real stocks often pay dividends, which affect option prices and early exercise decisions. The binomial framework easily accommodates dividends.
Continuous Dividend Yield
For stocks with a continuous dividend yield (common for index options), we modify the risk-neutral probability:
where:
- : risk-neutral probability adjusted for dividends
- : risk-free rate
- : continuous dividend yield
- : time step
- : up and down factors
The forward price grows at rate rather than , which reflects the dividend leakage. This modification accounts for the fact that holding the stock entitles you to dividends, which reduces the expected capital appreciation under the risk-neutral measure.
Discrete Dividends
For individual stocks paying discrete dividends, we adjust the stock price at dividend dates. If a dividend is paid at time , the stock price drops by immediately after payment. This creates a tree that is not strictly recombining around dividend dates but remains computationally tractable.
import numpy as np
def binomial_tree_dividend_yield(
S0, K, T, r, q, sigma, N, option_type="call", american=False
):
"""
Price an option on an asset with continuous dividend yield q.
"""
dt = T / N
u = np.exp(sigma * np.sqrt(dt))
d = 1 / u
# Modified risk-neutral probability for dividend yield
p = (np.exp((r - q) * dt) - d) / (u - d)
disc = np.exp(-r * dt)
# Build stock tree
S = np.zeros((N + 1, N + 1))
for i in range(N + 1):
for j in range(i + 1):
S[i, j] = S0 * (u**j) * (d ** (i - j))
# Initialize at maturity
f = np.zeros((N + 1, N + 1))
for j in range(N + 1):
if option_type == "call":
f[N, j] = max(S[N, j] - K, 0)
else:
f[N, j] = max(K - S[N, j], 0)
# Backward induction
for i in range(N - 1, -1, -1):
for j in range(i + 1):
cont = disc * (p * f[i + 1, j + 1] + (1 - p) * f[i + 1, j])
if american:
if option_type == "call":
exercise = max(S[i, j] - K, 0)
else:
exercise = max(K - S[i, j], 0)
f[i, j] = max(cont, exercise)
else:
f[i, j] = cont
return f[0, 0]# Impact of dividend yield on American call options
S0, K, T, r, sigma = 100, 100, 1, 0.05, 0.2
N = 100
dividend_yields = [0.0, 0.02, 0.04, 0.06, 0.08]
results = []
for q in dividend_yields:
euro = binomial_tree_dividend_yield(S0, K, T, r, q, sigma, N, "call", False)
amer = binomial_tree_dividend_yield(S0, K, T, r, q, sigma, N, "call", True)
results.append((q, euro, amer, amer - euro)) Div Yield Euro Call Amer Call Premium
------------------------------------------------------------
0.0% $ 10.4306 $ 10.4306 $ 0.0000
2.0% $ 9.2076 $ 9.2076 $ 0.0000
4.0% $ 8.0836 $ 8.0991 $ 0.0155
6.0% $ 7.0567 $ 7.2440 $ 0.1873
8.0% $ 6.1242 $ 6.5327 $ 0.4085With no dividends, American calls equal European calls because early exercise is never optimal. As the dividend yield increases, early exercise becomes attractive: you want to own the stock to capture the dividend, making the American call more valuable than the European.

