Barrier Options
Motivation: why this matters in quant finance
Why traders use them:
- Cost reduction. A knock-out option can be 30-70% cheaper than the corresponding vanilla. Useful for retail-structured products.
- View expression. Knock-out calls express the view "stock will rise but not collapse" — finer than a vanilla call.
- Hedging. Knock-in options are used to set up contingent hedges that activate only when a market level is breached.
For pricing, barrier options are the canonical example where path-dependence breaks risk-neutral valuation by simulation alone. The hitting time of a continuous Brownian motion is delicate; discretisation introduces bias; closed-form solutions exist for a few simple cases (Reiner-Rubinstein) but break down with stochastic volatility, dividends, or time-varying barriers.
The informal idea
The four standard variants for calls:
- Down-and-out call (DOC): barrier ; knocked out if falls to .
- Down-and-in call (DIC): knocked in if falls to .
- Up-and-out call (UOC): barrier ; knocked out if rises to .
- Up-and-in call (UIC): knocked in if rises to .
The price always has the form: vanilla price minus (or plus) a "barrier-correction" term reflecting the modified payoff.
Formal pricing under Black-Scholes
For a continuously monitored barrier (i.e., the barrier breach is checked at every instant), there's a closed-form solution. Define (drift parameter). The down-and-out call price is
valid for (i.e., the barrier is below the strike).
The general formula by Reiner-Rubinstein covers all 8 standard cases. Implementing them is mechanical but error-prone — many practitioners prefer the FDM approach.
Why discrete monitoring matters
The discretely-monitored barrier price differs from the continuous price by an analytic correction:
where (Broadie-Glasserman-Kou correction, derived via random-walk theory).
For daily monitoring with , this is about a 1% adjustment to the barrier; for high-frequency monitoring, smaller. Always check whether your pricing assumes continuous or discrete monitoring.
Algorithm: barrier pricing via FDM
Modify the standard BS PDE solver: at each time step, set (rebate, often 0) at all grid nodes outside the active region.
For a down-and-out call with barrier :
import numpy as np
from scipy.linalg import solve_banded
def fdm_doc(S0, K, B, T, r, sigma, M=400, N=400, S_max=400, R=0.0):
dS = S_max / M
dt = T / N
S = np.linspace(0, S_max, M+1)
# Find barrier index
i_B = np.searchsorted(S, B)
V = np.maximum(S - K, 0.0)
V[:i_B+1] = R # apply barrier at terminal too
i = np.arange(1, M)
alpha = 0.5*(sigma**2*i**2 - r*i)
beta = -(sigma**2*i**2 + r)
gamma = 0.5*(sigma**2*i**2 + r*i)
for n in range(N):
# Crank-Nicolson step (simplified — full code in fdm-cn lesson)
d = dt/2
ab = np.zeros((3, M-1))
ab[0, 1:] = -d*gamma[:-1]
ab[1, :] = 1 - d*beta
ab[2, :-1] = -d*alpha[1:]
Lv = alpha*V[:M-1] + beta*V[1:M] + gamma*V[2:M+1]
rhs = V[1:M] + d*Lv
rhs[0] += d*alpha[0]*V[0]
rhs[-1] += d*gamma[-1]*V[M]
V[1:M] = solve_banded((1,1), ab, rhs)
V[0] = 0
V[M] = S_max - K*np.exp(-r*(T - (n+1)*dt))
# Apply barrier: V = R for S <= B
V[:i_B+1] = R
return np.interp(S0, S, V)
S0, K, B, T, r, sigma = 100, 100, 80, 1, 0.05, 0.2
price = fdm_doc(S0, K, B, T, r, sigma)
print(f"Down-and-out call: {price:.4f}")
# Down-and-out call: ~ 9.9Vanilla call price is \10.45\sim $0.55$ — the value of the knock-out feature.
Key properties
- Knock-out price ≤ vanilla price. The barrier feature can only reduce the option value.
- Knock-in price ≥ 0. For "out-of-the-money" knock-in (e.g., DIC with ), the price can be very small but is always positive.
- In-out parity. Knock-in + knock-out = vanilla. Use this as a sanity check.
- Sensitivity to barrier. Pricing is steep near the barrier. Discrete vs continuous monitoring matters most when is close to .
- Greeks near barrier. Delta and gamma are discontinuous at the barrier. Hedging barrier options is hard in practice — gamma blows up as the underlying approaches the barrier.
- Static replication. For some barriers, exact static replication exists using a portfolio of European options at different strikes. Used to remove dynamic-hedging risk.
Worked example: in-out parity
Vanilla call C_{\text{BS}} = \10.45B = 80$9.90B = 80$:
DIC = DOC = 10.45 - 9.90 = \0.55$.
This says: there's a \0.5580$0.55$ probability-weighted-payoff contract.
For further from spot (): DOC \to \10.42\to $0.03$. Far-OTM knock-in becomes essentially worthless.
Common confusions and pitfalls
- Continuous vs discrete monitoring. Most pricing literature assumes continuous; most exchanges use discrete. Use the BGK correction to convert.
- Closed-form valid only for specific configurations. Reiner-Rubinstein assumes constant , no dividends, single barrier. Anything more complex needs PDE/MC.
- MC discretisation bias. If you simulate paths at, say, 50 time steps, the algorithm misses barrier hits between steps. Use Brownian-bridge correction (see the MC Pricing lesson) or simulate exact hitting times.
- Barrier near strike. Pricing can be highly sensitive when and are close. Numerical methods need fine grids near the barrier.
- Rebate handling. A common variation: a rebate paid at the time of barrier touch (or at expiry). This adds a separate term to the price; don't ignore it for accurate quotes.
- Lookback options confusion. Lookbacks pay a function of the path maximum or minimum. Different from barrier options; they're not knocked out, but the payoff itself depends on the extremum.
Where this goes next
- Asian options — different path dependence (averaging).
- Monte Carlo pricing — Brownian-bridge correction for discrete-monitoring.
- Static replication, double barriers, partial barriers — variations.