A study of the Cox–Ross–Rubinstein (CRR) binomial tree applied to continuously
monitored down-and-out barrier options, focused on the structure of the
discretization error as the number of steps n grows. The work reproduces the
known convergence theory from an absorbing-Markov-chain / reflection-principle
angle, verifies it against exact finite-n computations, isolates a sharp
negative result about price (vs. probability) convergence, and includes an
exploratory extension on how a distributionally-robust price reshapes the error.
Scope and provenance (read this first). The convergence results reproduced here are not new — the definitive rigorous treatment is Lin & Palmer (2013), with the phenomenon observed by Boyle & Lau (1994) and the rate/zigzag first established by Gobet (2000, 2001). This repository is an independent replication and exposition with fully verified numerics, plus a small exploratory robustness extension (
docs/dro_proposal.md) whose novelty is narrow and not yet claimed as a theorem. It is presented honestly as such.
The discrete knockout quantity is computed by (i) backward induction on the CRR
tree, (ii) a ballot / hitting-time reflection sum, (iii) an absorbing Markov chain
1 − 1₀ᵀQⁿ1, and (iv) a survival digital priced on the same tree. All four agree
to machine precision (~1e-15), so the discrete model is computed correctly and the
convergence questions below are genuine limits, not bugs.
Writing α ∈ [0,1) for how far the continuous barrier sits from the nearest lattice
layer, the scaled error √n · (P_discrete − P_continuous) collapses onto a linear
function of α (R² = 0.9994; a quadratic term adds nothing). The measured decay
exponent is ≈ 0.49. The oscillation-in-n that Boyle–Lau observed is exactly this
linear law composed with the sawtooth α(n) = ⌈c√n⌉ − c√n.
The same √n scaling does not collapse the price error onto α (R² ≈ 0.22), and
on generic subsequences the CRR price does not converge to the continuous (Merton)
price at the naive rate. The crux (panel d): on the α ≈ 0 subsequence the knockout
probability error falls to 1e-3–1e-4 while the price error stays pinned at ≈ 0.34.
The mechanism is that the down-and-out value E[(S_T−K)⁺·1{survive}] depends on the
joint law of terminal payoff and survival — survival and payoff are correlated, so
getting the marginal survival probability right is not enough. This is exactly why
practical barrier corrections (Boyle–Lau node positioning, Broadie–Glasserman–Kou
continuity correction, Derman–Kani interpolation) exist.
Taking a worst-case (sup / inf) price over a volatility-ambiguity set — for a
contract whose value is non-monotone in σ, e.g. a down-and-out put — the robust
error is one-sided (no sign changes) and its oscillation amplitude is roughly a
quarter-to-half of the nominal zigzag. Intuition: the sup/inf over σ averages across
the ripple's phases. This is a numerical observation with a proposed (not yet proven)
asymptotic explanation; see docs/dro_proposal.md for the mechanism, target theorem,
and honest risk assessment.
src/
barrier_core.py CRR barrier pricer; ballot & Markov knockout prob; Merton closed form
test_linearity.py sweep n; test √n·error linearity in α for probability and price
diagnose_price.py two-offset (barrier α, strike θ) diagnosis of price error
make_figs.py generates figures/barrier_findings.png
dro_rectify.py robust sup/inf over volatility; generates figures/dro_rectification.png
docs/
math_scaffold.md definitions, theorem statements, proof sketches
edgeworth_derivation.md local-CLT / Edgeworth derivation of the α-dependence
findings_memo.md what the numerics confirmed vs refuted, corrected framing
dro_proposal.md exploratory robustness extension + novelty assessment
figures/
barrier_findings.png probability linearity, price pathology, α≈0 contrast
dro_rectification.png nominal zigzag vs robust sup/inf envelopes
pip install -r requirements.txt
python src/test_linearity.py # probability vs price linearity in α
python src/make_figs.py # main four-panel figure
python src/dro_rectify.py # robustness experiment (slower; sup over a σ-grid)Default contract: S₀=100, K=100, B=90, r=0.05, σ=0.20, T=1 (down-and-out call).
The robustness experiment uses a down-and-out put at B=80 (interior worst-case σ).
- Boyle, P. & Lau, S. (1994). Bumping up against the barrier with the binomial method. Journal of Derivatives 1(4), 6–14.
- Gobet, E. (2000). Weak approximation of killed diffusions using Euler schemes. Stochastic Processes and their Applications 87, 167–197.
- Gobet, E. (2001). ESAIM: Probability and Statistics 5, 261–297. (Zigzag convergence, double-barrier PDE analysis.)
- Broadie, M., Glasserman, P. & Kou, S. (1997). A continuity correction for discrete barrier options. Mathematical Finance 7, 325–349.
- Lyuu, Y. (1998). Very fast algorithms for barrier option pricing and the ballot problem. Journal of Derivatives 5(3), 68–79.
- Diener, F. & Diener, M. (2004). Asymptotics of the price oscillations of a European call option in a tree model. Mathematical Finance 14(2), 271–293.
- Lin, J. & Palmer, K. (2013). Convergence of barrier option prices in the binomial model. Mathematical Finance 23(2), 318–338. (The definitive result reproduced here.)
- Avellaneda, M., Levy, A. & Parás, A. (1995). Pricing and hedging derivative securities in markets with uncertain volatilities. Applied Mathematical Finance 2, 73–88.
- Derman, E., Kani, I., Ergener, D. & Bardhan, I. (1995). Enhanced numerical methods for options with barriers. Financial Analysts Journal 51(6).
MIT — see LICENSE.

