No-arbitrage & the law of one price
Everything in option pricing rests on a single principle, and it is almost embarrassingly mundane: two portfolios that pay the same thing in every future state must cost the same today. If they did not, you would buy the cheap one, sell the dear one, pocket the difference, and walk away holding offsetting positions that cancel in every scenario — a riskless profit from nothing. Markets are not perfectly efficient, but they are efficient enough that such free lunches are arbitraged away in seconds. This is the law of one price, and it is the only economic assumption the binomial model needs.
The leap is to notice that an option is such a portfolio in disguise. Over a short enough interval the stock can do only a limited number of things, and we can assemble a position in the stock and a risk-free bond that reproduces the option's payoff exactly. If we can build the option's payoff out of instruments whose prices we already know, then the law of one price hands us the option's price: it must equal the cost of that replicating portfolio. We never forecast the market; we manufacture the option and read off the bill of materials.
Pricing is replication, not prediction. A binomial model does not ask "will the stock rise?" It asks "what mix of stock and cash exactly mimics this option?" — and then charges what that mix costs. Two traders who violently disagree about the stock's direction must still quote the same option price, because both can build it the same way at the same cost. This is the seed of the entire field; §2.3 makes it arithmetic.
One more piece of furniture. Throughout we discount with a risk-free rate. Over a step of length \(\Delta t\) a dollar in the bank grows by the gross factor \(e^{r\Delta t}\) (continuous compounding) or \(1+r\Delta t\) (simple); a payoff received at the end of the step is worth \(e^{-r\Delta t}\) times its face value today. To rule out arbitrage in the stock itself, the up and down moves must straddle the bond: \(d < e^{r\Delta t} < u\). If the stock could only ever beat the bond (\(d > e^{r\Delta t}\)) you would borrow infinitely to buy it; if it could only ever lag (\(u < e^{r\Delta t}\)) you would short it without limit. The no-arbitrage band is exactly what makes a finite price possible.
Risk-neutral valuation
The replication argument has a second face that is often easier to compute with. Suppose we insist on writing the option's value today as a discounted expectation of its payoff. The real-world probabilities of up and down moves — driven by the stock's true expected return — are not the right weights; if they were, two traders with different forecasts would price the option differently, contradicting §2.1. Instead there is a single, fictitious set of probabilities under which the discounted price of every traded asset is a fair game (a martingale). These are the risk-neutral probabilities, and under them the stock's expected growth is exactly the risk-free rate.
This is the most counter-intuitive fact in the chapter, so it is worth stating plainly: the drift vanishes. A stock everyone expects to soar and a stock everyone expects to crash will produce the same option price if they have the same volatility and the same up/down factors, because both can be replicated for the same cost. Risk-neutral valuation is not a claim that investors are indifferent to risk — they are not — but a bookkeeping trick: by discounting at the riskless rate and re-weighting with \(\mathbb{Q}\), we absorb the market's risk preferences into the probabilities so they never have to be estimated. The two views — replicate-and-cost (§2.1) and discount-the-Q-expectation (here) — are provably identical; §2.3 derives \(p\) from the no-arbitrage condition and they fall out the same.
A caveat experts insist on: a unique \(\mathbb{Q}\) exists only when the market is complete — when every payoff can in fact be replicated. The one-step binomial market is complete precisely because two outcomes can be hedged with two instruments (stock and bond). Add a third outcome per step without a third instrument and replication fails, \(\mathbb{Q}\) is no longer unique, and prices live in a no-arbitrage interval rather than at a point. The binomial model's elegance is that it stays exactly on the knife-edge of completeness.
The one-step binomial model
Now the arithmetic. Over one step the stock \(S_0\) moves to either \(S_0 u\) (up) or \(S_0 d\) (down), with \(d < u\). An option on it is worth \(V_u\) or \(V_d\) at the end of the step. Build a portfolio of \(\Delta\) shares and \(B\) dollars of bond, and choose \(\Delta\) and \(B\) so it matches the option in both states:
Substitute \(\Delta\) and \(B\) back and simplify. The expected-return term collapses and what survives is a clean weighted average — exactly EQ Q2.1, with the weight \(p\) determined entirely by the no-arbitrage band:
Multi-step CRR trees
One step is a cartoon of the market; many steps approximate it. Cox, Ross and Rubinstein's 1979 insight was to chain the one-step rule into a recombining lattice — "up then down" lands on the same node as "down then up", so after \(N\) steps there are only \(N+1\) terminal nodes instead of \(2^N\). The tree is built forward; the option is priced backward, applying EQ Q2.3 at every node from the leaves to the root.
As the step count \(N\) grows, the binomial price marches toward the Black–Scholes value. This is not a coincidence: with the CRR parametrization the multiplicative random walk converges (by the central limit theorem applied to log-returns) to geometric Brownian motion, and the discounted-expectation recursion converges to the Black–Scholes integral. The convergence is famously oscillatory — even and odd \(N\) approach from opposite sides because the strike sits differently relative to the terminal grid — so practitioners average adjacent \(N\), or reach for smoothing tricks, rather than trusting any single small tree.
# CRR binomial European call -> converges to Black-Scholes as steps grow
import numpy as np, math
def bs_call(S, K, r, sig, T): # closed-form benchmark
d1 = (math.log(S/K) + (r + 0.5*sig*sig)*T) / (sig*math.sqrt(T))
d2 = d1 - sig*math.sqrt(T)
Nf = lambda x: 0.5*(1 + math.erf(x/math.sqrt(2)))
return S*Nf(d1) - K*math.exp(-r*T)*Nf(d2)
def crr_call(S, K, r, sig, T, N): # EQ Q2.4, backward induction
dt = T/N
u = math.exp(sig*math.sqrt(dt)); d = 1/u
p = (math.exp(r*dt) - d) / (u - d); disc = math.exp(-r*dt)
j = np.arange(N+1)
V = np.maximum(S*u**j*d**(N-j) - K, 0.0) # terminal call payoffs
for n in range(N, 0, -1): # sweep leaves -> root
V = disc*(p*V[1:n+1] + (1-p)*V[0:n])
return V[0]
S, K, r, sig, T = 100, 100, 0.05, 0.20, 1.0
exact = bs_call(S, K, r, sig, T)
Ns, errs = [1, 2, 5, 10, 50, 200, 1000], []
print(f"Black-Scholes call = {exact:.4f}\n N binomial error")
for N in Ns:
c = crr_call(S, K, r, sig, T, N); errs.append(abs(c-exact))
print(f"{N:5d} {c:9.4f} {c-exact:+.4f}")
plot_xy(Ns, errs) # |error| shrinking with N
American options & early exercise
So far the option could only be exercised at expiry — a European option. An American option may be exercised on any date up to expiry, and that extra freedom is exactly where the binomial tree earns its keep: Black–Scholes has no clean closed form for it, but the lattice handles it with a one-line change. At every node, instead of simply taking the discounted continuation value, you take the larger of continuing and exercising right now:
When does early exercise actually pay? Two classic facts orient the intuition. First, it is never optimal to exercise an American call on a non-dividend-paying stock early — you would throw away remaining time value and the interest you could earn on the strike by waiting, so the American call equals the European call (Merton's result). Dividends break this: a large dividend can make exercising a call just before the ex-date optimal. Second, American puts genuinely can pay to exercise early: deep in the money, the put is worth nearly \(K - S\), and exercising now banks that cash to earn interest rather than waiting for a payoff capped at \(K\). The higher the rate, the stronger the pull.
# American put via backward induction; isolate the early-exercise premium
import numpy as np, math
def binom_put(S, K, r, sig, T, N, american):
dt = T/N
u = math.exp(sig*math.sqrt(dt)); d = 1/u
p = (math.exp(r*dt) - d) / (u - d); disc = math.exp(-r*dt)
j = np.arange(N+1)
ST = S*u**j*d**(N-j)
V = np.maximum(K - ST, 0.0) # terminal put payoffs
for n in range(N, 0, -1):
V = disc*(p*V[1:n+1] + (1-p)*V[0:n]) # continuation value
if american: # ... or exercise now?
Sn = S*u**np.arange(n)*d**(n-1-np.arange(n))
V = np.maximum(V, K - Sn) # EQ Q2.5: take the max
return V[0]
S, K, r, sig, T, N = 100, 110, 0.05, 0.30, 1.0, 500
eu = binom_put(S, K, r, sig, T, N, american=False)
am = binom_put(S, K, r, sig, T, N, american=True)
print(f"European put : {eu:.4f}")
print(f"American put : {am:.4f} (>= European, EQ Q2.6)")
print(f"early-exercise premium : {am - eu:.4f}")
print("the premium is the value of the right to exercise the put early.")
The tree is the same idea Black–Scholes packages in closed form — just discretized. Quant 03 takes \(N \to \infty\): the recombining lattice becomes geometric Brownian motion, EQ Q2.3's weighted average becomes a Gaussian integral, and the price collapses to \(C = S\,N(d_1) - Ke^{-rT}N(d_2)\). The hedge ratio \(\Delta\) you computed here becomes the first of the Greeks — and the whole binomial scaffolding turns into the smooth surface a derivatives desk lives on.
References
- Cox, J. C., Ross, S. A. & Rubinstein, M. (1979). Option Pricing: A Simplified Approach.
- Merton, R. C. (1973). Theory of Rational Option Pricing.
- Black, F. & Scholes, M. (1973). The Pricing of Options and Corporate Liabilities.
- Hull, J. C. (2021). Options, Futures, and Other Derivatives (11th ed.).
- Shreve, S. E. (2004). Stochastic Calculus for Finance I: The Binomial Asset Pricing Model.