The Early Exercise Problem

Part 1 of 6 — American option pricing

This post sets up the problem: what early exercise is worth, why puts and calls break for different reasons, and what a discrete dividend costs when it gets smeared into a smooth yield. Later parts cover the jump models, finite differences against trees, the fast analytic approximations, greeks, and implied volatility on a real tape.

An option is the right to buy or sell at a fixed price. If that right can only be used on a single date the contract is European, and the problem has been closed since 1973: Black and Scholes wrote down the price, and the sensitivities and the volatility implied by a quoted price all follow from the same formula[1][2]. Inverting a market price to a volatility is a solved numerical exercise[3] rather than a modelling question.

If the right can be used at any moment before expiry the contract is American, and the formula is not harder — it is gone. Whether to exercise depends on the price, and the price depends on when a rational holder would exercise, so the two have to be solved together. What was an integral becomes a free boundary: a curve through time separating the region where holding is worth more from the region where taking the intrinsic value is. Nobody knows how to write that curve down, so every method from here is an approximation, each with its own way of failing.

That would be a tolerable inconvenience if American options were a niche. They are not. SPX and SPY track the same index and settle differently: the index option is European and cash-settled[5], while the ETF option is American and delivers shares[4]. That split runs through the whole listed market. Cash-settled broad-based index options are European; single-name equity options and ETF options — SPY, QQQ, IWM — are American, and that is where most listed US volume sits. The closed-form case is the exception.

Plenty of methods price an American option well enough, so the question worth asking is narrower: which part of the calculation is actually costing money? Everything below says it is not the pricer. It is the dividend fed into it.

Measuring in the right unit

Errors here are quoted in implied-volatility basis points. One vol bp is $10^{-4}$ of $\sigma$, so a 50 bp error means the price is off by as much as moving volatility from 25.00% to 25.50% would move it.

Throughout, $S$ is the spot price, $K$ the strike, $T$ the time to expiry, $\sigma$ the volatility, $r$ the risk-free rate and $q$ a continuous dividend yield. A discrete dividend is an amount $D$ paid on a given ex-date, and is kept separate from $q$ — the gap between those two ways of carrying a dividend is most of what this post is about. Moneyness is written as $S/K$, so a ratio above one is a call in the money and a put out of it.

Price error alone doesn’t compare across contracts: a cent on a fifteen-cent wing option and a cent on a twenty-eight-dollar LEAP are not the same mistake. Dividing by vega — the price move per one-point change in volatility — fixes that, and has the practical advantage of being the unit models are calibrated in[6]. The conversion is a price change of $\text{bp} \times 10^{-4} \times \text{vega}$, which is worth seeing on real contracts:

contractKσpremiumvega10 bp100 bp100 bp as % of premium
30d ATM10025%3.021111.401.14¢11.40¢3.77%
1y ATM10025%11.837038.313.83¢38.31¢3.24%
30d 25-delta put9228%0.54876.110.61¢6.11¢11.13%
2y deep-ITM put14025%34.687048.544.85¢48.54¢1.40%

▸ computed by experiments.jl → results/volbp_scale.csv. S = 100, r = 4%, q = 0.

The same hundred basis points is 1.4% of a deep-in-the-money LEAP and 11% of a one-month wing put, so every headline table below carries a percent-of-premium column as well.

The other half of the yardstick is what the market itself charges. Taking the AAPL tape from 2 January 2024 — last two-sided quote per contract before 15:45 ET, with the bid and the ask each inverted to a volatility:

bucketcontractsmedian widthIQR
near-ATM, front 3 expiries2024.4 vol bp16.0–44.2
near-ATM, all expiries5025.2 vol bp18.3–38.5
|log S/K| between 2% and 4%7628.9 vol bp19.9–39.0

▸ derived by tools/derive_aapl_spread.jl → data/aapl_spread_summary.csv (aggregates only). Buckets are by |log S/K|, which measures distance from the money in either direction: near-ATM is under 2%, roughly five dollars either side of a 185 spot.

Those widths come from inverting a bid and an ask with the European Black formula, which cannot produce an early-exercise premium at all. These are American options, so every implied volatility above is at the wrong level.

A width, though, is the difference of two inversions of two prices a cent apart under the same model, so a bias that depends on the contract rather than on the side of the spread should cancel. Rather than argue that, every leg was inverted a second time with an American lattice: the near-the-money medians move by three hundredths of a basis point, and no bucket moves by more than eight tenths. The level is biased and the width is not.

A liquid AAPL option is about 25 vol bp wide. That gives the rest of the post a scale: the 50 bp tolerance a pricing library is typically held to is two of those widths. A pricing error inside 50 bp is smaller than the spread the option would actually trade across. That 50 bp is a working convention and not a published standard — it has never been validated end to end, and doing so needs the downstream signals it feeds, which are outside this work.

AAPL near-ATM market widthmedian 24 bp (IQR 16-44)131030100300error in implied-vol basis points (log scale)30d ATM1.1c | 11.4c = 3.8% of premium1y ATM3.8c | 38.3c = 3.2% of premium30d 25-delta put0.6c | 6.1c = 11.1% of premium2y deep-ITM put4.9c | 48.5c = 1.4% of premium10 bp100 bp
The same error, three ways. Each row is one contract; the large dot marks 10 bp of implied volatility and the small dot 100 bp, with the cash value and share of premium at the right. The shaded band is the AAPL near-ATM bid-ask width, for scale.
Careful

Every error quoted in vol basis points below filters to vega > 0.1, because dividing by a vanishing vega turns a small price error into an enormous volatility one. In practice that guard almost never fires: across every grid in this post it removes four contract-settings out of 1,944, all in one corner where a thirty-day option fifteen percent out of the money is priced at twenty percent volatility. The shortest-dated dividend cases, where the worry would be reasonable, survive intact — a seven-day option struck at 111 on a spot of 100 still has vega of 0.15.

The real limitation is not the filter but the grids themselves, which stay within about fifteen percent of the money and never visit the deep wings. Push that same seven-day option out to a strike of 140 and its vega is effectively zero, so nothing in this post speaks to those contracts — and they carry real listed volume. Tables quoted as a percentage of value are not filtered at all, since they never divide by vega.

The reference problem

Since there is no closed form, every accuracy claim depends on the reference being right, and a reference that shares a failure mode with the method it scores will confirm that method’s error instead of exposing it. The only defence is to require agreement between methods that have structurally nothing in common.

Three families are used throughout, chosen for how little they share:

That last one is the anchor. At $r = 0$ with $q \ge 0$ a put is never exercised early, so the American price equals the European price — and the European price under a jumping stock can be integrated directly, because conditional on the ex-date spot the terminal price is lognormal and the inner expectation is closed-form Black–Scholes. One dimension of quadrature remains, and it converges.

Set against each other over 216 dividend cases, the tree and the grid agree to a median of 0.032 vol bp, and their worst disagreement anywhere is under four tenths of a basis point.

▸ computed by experiments.jl → results/oracle_lattice_vs_fd.csv. IQR 0.010–0.049, max 0.366. Grid: calls and puts, tenors 30/91/182/365d, dividends of 0.5/1/2% of spot at 0.25/0.6/0.85 of the option’s life, S/K ∈ {0.90, 1.0, 1.10}, r = 4%, q = 0, σ = 28%; lattice n = 4001 against finite differences at 2400×1200.

Scored against the exact quadrature, both land in the same neighbourhood: a median of six thousandths of a basis point for the lattice and fourteen thousandths for the grid, with neither above six hundredths anywhere in the grid of cases. The figure below shows the whole distribution rather than a point estimate, because two medians that close say very little on their own. Three constructions sharing no machinery agree with a closed-form answer, and with each other, far inside anything the rest of the post needs to resolve.

0.00010.0010.010.1latticemedian 0.006finite differencesmedian 0.014error against the exact answer, implied-vol basis points (log scale)each dot is one of 108 contracts; box is the interquartile range
Error against the exact quadrature answer, one dot per contract, on 108 cases where an exact answer exists. Box is the interquartile range, vertical rule the median. Reference resolutions: lattice n = 4001 against finite differences at 2400×1200. Grid: puts, tenors 30d/91d/182d/365d, dividends of 0.5/1/2% of spot at 0.25/0.6/0.85 of the option's life, S/K ∈ {0.90, 1.0, 1.10}, r = 0, q = 0, σ = 28%.

Two further figures come from the larger study behind this series; the code here does not reproduce them. QuantLib’s converged QdFpAmericanEngine against an independent lattice over several thousand options puts agreement at roughly a quarter of a basis point at the p95[14], and a lattice-versus-grid comparison over a larger dividend book lands around half a basis point.

Those are larger than the hundredths above because they measure something else: agreement at production settings across a real book, where tenors are short, dividends stack, and resolution is bounded by what a risk run can afford. That is the number a working system has to live inside.

One caveat on the QuantLib figure: that engine shares an analytic family with some of the methods it scores, so a method from that family landing under it is indistinguishable from the reference, not better than it.

Three methods picked by one person from one literature can still share a blind spot. The last check is external: pricing the setup from Healy §4.13 — a three-month option on a stock paying a 7% dividend at forty days — under four different dividend models and comparing against the published values.

modelcallput
European (Black)3.3762218.891463
constant yield3.9998578.891463
proportional jump4.7443959.139853
cash jump, calibrated4.5639319.153993

▸ computed by experiments.jl → results/dividend_models.csv. All four rows reproduce the values published for this setup[6]. Two adjustments make the comparison mean anything. The cash dividend is 7.05, not 7.00, so that it takes the same amount out of the forward as a 7% proportional drop at day forty does; and the cash model’s volatility is calibrated to 29.03% so that the two models agree on the European price. Without both, most of what gets measured is the gap between two calibrations.

The finite-difference settings that make the grid a credible reference — the domain width, the Rannacher damping, the treatment below the lower boundary, the choice of free-boundary solver — are the subject of part 3, and are taken on trust here.

What early exercise is worth

Use Black–Scholes on an American option and the result is the European price, short by whatever the right to exercise early is worth. Measured against the reference just described, across a grid spanning interest rates, dividend yields, moneyness, tenors and volatilities, that premium behaves very differently depending on which corner of the grid the contract sits in. Two of those corners are set by the interest rate $r$ and the continuous dividend yield $q$:

classmedianp95maxn
call, $q = 0$0.0000%0.000%0.00%96
call, $q > 0$0.746%13.41%53.19%288
put, $r = 0$0.0000%0.000%0.00%96
put, $r > 0$0.781%13.94%56.52%288

▸ computed by experiments.jl → results/premium_map.csv. Premium as a percentage of the European price. Grid: r, q ∈ {0, 2, 4, 8}%, S/K ∈ {0.85, 1.0, 1.15}, tenors 30d–2y, σ ∈ {20%, 40%}.

In volatility terms the two live classes run to medians in the low twenties of basis points, with p95s of roughly seven hundred on the call side and a thousand on the put — many times the width of the market, and concentrated in a way the medians hide. The more useful observation is in the other two rows, where the premium is not small but exactly zero.

Puts are a rate story, calls are a dividend story

That is not a numerical artifact. Two identities produce it, and between them they organise the rest of the series.

A call is never worth exercising early when $q \le 0$ and $q \le r$ — the classical result for a non-dividend-paying stock[2]. A put is never worth exercising early when $r \le 0$ and $r \le q$, which follows from the first by the McDonald–Schroder symmetry $V_{\text{call}}(S,K,r,q) = V_{\text{put}}(K,S,q,r)$[7]. The second condition in each pair only binds at negative rates: at $r \ge 0$ a call with $q \le 0$ satisfies $q \le r$ automatically, which is why the textbook version drops it.

Checked rather than assumed, over 240 contracts per identity spanning moneyness, tenors from a month to two years and volatilities from fifteen to sixty percent, the largest premium found anywhere came to less than a thousandth of a basis point. That residual is the lattice’s own discretisation noise: it shrinks with step count and does not scale with $r$ or $q$.

▸ computed by experiments.jl → results/exactness.csv. Both identities, 240 contracts each: S/K ∈ {0.7, 0.85, 1.0, 1.15, 1.4}, tenors 30/91/365/730d, σ ∈ {15, 30, 60}%, and the free parameter over {0, 2, 5, 8}%. Lattice n = 2001.

So on a non-dividend-paying stock the American call is the European call, exactly, and Black–Scholes is not an approximation but the answer. At zero rates the American put is the European put, and the put’s entire premium is interest on the strike that exercising early would let you collect. The same book therefore behaves completely differently at 5% rates than it did at 0%, and a call’s premium exists only because of dividends. Two different problems wearing one name — and the call’s problem is where the model choice, rather than the numerical method, decides the answer.

This series assumes non-negative rates throughout. Below zero an American put can have two exercise boundaries rather than one, with exercise optimal between them[8][6], and nothing here applies.

Then a dividend shows up

There are two ways to carry a dividend through a model, and they are not two approximations of the same thing[6]. The forward, or escrowed, model splits the share price in two: the present value of the dividends still to come, treated as a known cash amount set aside, and the rest, which is assumed lognormal. The name is the idea — the dividend is held in escrow and only the remainder is allowed to move. Because that remainder is lognormal, the Black formula applies to it directly, which is the whole appeal.

The spot model keeps the share price itself lognormal between ex-dates and makes it drop by the dividend at each one, which is what actually happens.

The two agree only when every dividend is a fixed percentage of the share price rather than a fixed cash amount. A percentage drop rescales the whole distribution and leaves its shape alone; a fixed cash drop shifts it, and a two-dollar dividend is a far bigger event for a twenty-dollar stock than for a two-hundred-dollar one. Real dividends are declared in cash, so the two models disagree by construction, and the rest of this section is about how much that costs.

Escrowing has a consequence that follows directly from the identity above — no dividends, no early call exercise. It prices at $S - \mathrm{PV}(D)$ with $q = 0$, and a call with $q = 0$ is never exercised early, so the engine short-circuits to the European value. The approximation removes the early-exercise feature it was meant to approximate:

dividend (% of spot)S/Kreferenceescrowedmissedas %
2%1.0013.15334613.0379560.1153900.88%
4%1.0012.23069411.8946530.3360412.75%
8%1.0011.1046289.7649271.33970012.06%
8%1.2020.97541517.9438023.03161314.45%

▸ computed by experiments.jl → results/escrowed_europeanises.csv. American call, single cash dividend at mid-life, r = 5%, σ = 30%, T = 1.

The escrowed price matches the European price at the escrowed spot to $3.6\times10^{-8}$ — it is the European price. Which is also why two different escrowed engines will agree with each other perfectly, and why that agreement is worth nothing as evidence. Both are failing the same way.

A constant yield gets the shape wrong

The more common approximation converts the dividend into a continuous yield chosen to match the forward. To see what that costs without confounding it with a calibration gap, the comparison has to be set up carefully: derive the yield that matches the cash dividend’s forward exactly, then calibrate the spot-model volatility so the two agree on the European price. Whatever remains is early-exercise behaviour and nothing else.

sidedividend30d91d365d
call2%4.75%1.18%−0.00%
call4%16.13%5.67%0.54%
call8%39.33%19.37%4.30%
put2%0.94%1.89%1.66%
put4%1.03%2.02%3.45%
put8%1.18%2.23%5.37%

▸ computed by experiments.jl → results/constant_yield_regimes.csv. Percentage of the option’s value the constant-yield model misses, at S/K = 1.00, r = 5%, dividend at mid-life, nominal σ = 30% with the cash model calibrated to 28.7–29.7% per regime. Across all 27 regimes the call range is −1.2% to 39.5% and the put range 0.4% to 5.6%; a negative figure means the yield model overshoots the cash reference instead of falling short.

The two sides move in opposite directions. A call’s error is driven by dividend size and collapses as the tenor lengthens — 39% of the option’s value at 30 days on an 8% dividend, down to 4% at a year. A put’s error is small throughout and grows with tenor. Anyone generalising from a single contract would get the sign of that tenor relationship wrong, so a rule of thumb quoted without its grid says almost nothing.

The mechanism is structural, not numerical. Under a cash or proportional dividend, exercising an American call early is optimal only at the ex-date, because capturing the dividend is the only reason to do it. Under a constant yield the stock leaks value continuously and exercise is optimal across a whole region of time. Different exercise regions produce different prices, and no amount of grid resolution reconciles them.

cash jump1 of 801 levels(0.1% of the option's life)proportional jump1 of 801 levels(0.1% of the option's life)constant yield777 of 801 levels(97% of the option's life)115100S
Where early exercise of an American call is optimal, under three dividend models sharing a forward and a total dividend present value. Cash and proportional dividends make exercise optimal at a single instant; a constant yield makes it optimal across almost the whole life. Grid: 801-step tree, S = K = 100, r = 6%, σ = 30%, 7% dividend at 40/365.

Counted directly on an 801-step tree, the cash and proportional models put the exercise region at a single time level out of 801. The constant-yield model puts it at 777 of them.

Switching models manufactures a smile

European put-call parity holds under both the cash and the proportional model with the same forward, so a volatility reproducing the European call reproduces the European put automatically — measured gap, $6\times10^{-15}$. On European prices the calibration is unambiguous.

Parity does not hold for American options, and that is where the ambiguity lives. Taking cash-dividend American prices as truth and asking what volatility the proportional model needs to reproduce them:

strikecall volput volgap
5028.168%31.380%3.212 pts
7528.868%31.270%2.402 pts
10029.886%31.240%1.354 pts
12530.615%31.232%0.616 pts
15030.884%31.222%0.338 pts

▸ computed by experiments.jl → results/model_implied_vol.csv. S = 100, r = 6%, a cash dividend of 7 — seven percent of spot — at t = 0.5, T = 1, nominal σ = 30%.

The put volatility is nearly flat, moving 0.158 points across the whole strike range. The call volatility slopes by 2.72 points, and the two disagree by up to 3.2 points at the same strike. Moving between two dividend models that agree on the forward produces a smile out of nothing at all.

What smearing a dividend actually costs

The model matters, then. The next question is how much, and the answer depends on how badly the dividend has been flattened.

Both sides appear from here, which the identity above — a call’s premium comes from dividends, a put’s from the rate — might seem to forbid. It does not. That identity governs what creates an early-exercise premium — dividends for a call, the interest rate for a put — not what moves a price. A dividend moves both sides regardless of exercise, and mis-specifying it does two separable things. It changes the terminal distribution even when the forward is matched exactly, because a stock that drops once by a fixed amount is not shaped like one bled down continuously; on European contracts, where exercise cannot be involved, that alone costs 24 to 32 basis points at every tenor and falls almost evenly on calls and puts. Separately, it changes the size of the put’s premium — the rate creates that premium, but the dividend path controls how large it gets. The two premiums also run in opposite directions with tenor, the call’s decaying as the put’s grows, crossing near six months; by one year the put’s is three times the call’s, and smearing the dividend away destroys nearly two thirds of it.

▸ computed by experiments.jl → results/premium_under_smearing.csv. European prices isolate the distribution effect, the premium columns isolate exercise. S = K = 100, r = 4%, q = 2%, σ = 28%, one dividend of 2% of spot at mid-life.

The crudest version stores one dividend-yield number per name and applies it regardless of tenor. Against the real schedule, for a stock paying 4% a year in quarterly instalments:

tenorscalar yield p95tenor-matched p95ratio
7d2,942.5 bp0.1 bp21,069×
30d607.7174.93.5×
91d162.9161.21.0×
365d113.9112.31.0×

▸ computed by experiments.jl → results/scalar_vs_matched.csv. Grid: calls and puts, S/K ∈ {0.9, 1.0, 1.1}, first ex-date at 0.02/0.10/0.20y, annual yield 2% and 4%, r = 4%, σ = 28%.

Splitting by whether an ex-date actually falls inside the option’s life makes the mechanism obvious. At seven days with no ex-date in the window, the scalar yield is 2,942 bp wrong and the tenor-matched yield is 0.1 bp wrong: the flat annual number is charging the option for dividends it will never see. By 91 days the distinction stops mattering, since the window contains its dividend either way.

Matching the present value over the actual tenor removes that gross error and leaves a subtler one. Holding the total PV fixed and comparing the schedule against the smeared version, pooled across calls and puts:

tenorex-datescheduleyield, on a treeyield, on a grid
30d0.15T1.8 / 20.418.7 / 2137.219.0 / 2137.2
30d0.85T3.6 / 18.5140.0 / 962.3141.7 / 962.3
91d0.50T1.0 / 7.157.5 / 481.558.0 / 479.9
730d0.50T0.7 / 4.323.1 / 60.823.4 / 61.1

▸ computed by experiments.jl → results/smearing_shape.csv. Median / p95 vol bp. Grid: calls and puts, S/K ∈ {0.85, 1.0, 1.15}, r ∈ {0, 4, 8}%, q = 2%, one dividend of 2% of spot.

The last two columns are the point. A tree and a grid share no machinery, and on a smeared dividend they land within two basis points of each other — against a model error running to 142. Using a better pricer on a smeared dividend recovers nothing — the loss is in the model, and the numerical method has no access to it. This is why the order of the series matters: fixing the dividend representation dominates every scheme decision that comes after it.

Which side pays depends on the tenor, and on whether you are budgeting the median or the tail:

tenorsideschedulesmearedmedian penalty
30dcall0.9 / 3.4122.7 / 700.6140×
30dput0.2 / 3.248.0 / 1,395.6295×
91dcall0.6 / 2.391.9 / 446.4153×
91dput0.1 / 0.654.4 / 301.2646×
365dcall0.2 / 1.625.2 / 155.2126×
365dput0.1 / 1.052.3 / 122.3550×
730dcall0.2 / 0.920.6 / 91.0108×
730dput0.2 / 1.341.8 / 69.3273×

▸ computed by experiments.jl → results/smearing_by_side.csv. Median / p95 vol bp, engine held at a 401-step lattice. Grid: S/K ∈ {0.85, 0.95, 1.0, 1.05, 1.15}, r ∈ {0, 4, 8}%, q = 2%, one dividend of 2% of spot at 0.3/0.5/0.8 of the option’s life.

Read the smeared column, not the ratio. At the median a 30-day call loses 123 basis points and a 30-day put 48, the call’s loss decays with tenor while the put’s grows, and the two sides cross somewhere between three months and a year. The penalty column divides that loss by the engine’s own error, which is now a fraction of a basis point at every tenor — so it measures how little the numerical method contributes, not which side is worse, and the side comparison belongs to the column beside it.

At the p95 the ordering is different again: the single worst number in the table is a 30-day put at 1,396 bp, while calls are worse than puts at every tenor from 91 days out. Pooled over tenors the calls lose more — 65 bp against 49 at the median — but no single statistic makes this a call problem or a put problem, and picking one to quote decides the answer before the reader sees it.

The mechanism is the same one the exercise-region plot showed. A short-dated call’s entire value sits inside the window the dividend distorts, while a long-dated put accumulates a mis-specified carry across its whole life.

0.010.111010030d91d365d730dcall, smearedput, smearedsame, on thereal schedulevol bp
Median error from smearing, by tenor and side. Hollow markers are the same engine given the real dividend schedule; filled markers are the same engine given a present-value-matched yield.

That leaves the question of whether a dividend can ever be small enough to drop:

PV/Signore entirelymatched yield
0.00%0.0 / 0.40.0 / 0.4
0.25%48.1 / 946.35.0 / 597.3
1.00%209.7 / 2,130.332.2 / 1,019.0
3.00%600.8 / 3,353.9106.5 / 703.7

▸ computed by experiments.jl → results/pv_threshold.csv. Median / p95 vol bp. Grid: calls and puts, S/K ∈ {0.85, 1.0, 1.15}, tenors 30d/91d/365d, σ ∈ {20%, 40%}, r = 4%, dividend at mid-life.

It cannot. A quarter of one percent of spot — a rounding error of a dividend — already costs 48 bp at the median and 946 in the tail, which is two ATM bid-ask widths and forty of them respectively. Only exactly zero is safe, which makes the highest-value field in the entire pipeline a boolean: whether an ex-date falls before expiry.

The dividend forecast is worse than the pricer

Everything so far compared models against each other. The last comparison is between the model and the data feeding it. Hold the engine completely fixed, give it a wrong dividend, and score it against the same engine given the right one:

input errormedianp95
pricer error, correct dividend0.2 bp0.6 bp
ex-date off by 1 week4.642.9
ex-date off by 1 month20.0186.0
amount off by −10%27.0171.4
amount off by +10%27.1171.0
amount off by −25%67.3426.8
amount off by +25%67.0429.1
dividend suspended entirely277.31,662.0

▸ computed by experiments.jl → results/input_vs_pricer_error.csv. Engine held at a 401-step lattice, pooled calls and puts. Grid: S/K ∈ {0.85, 1.0, 1.15}, tenors 91d and 365d, r ∈ {0, 4%}, q = 2%, σ = 28%, one dividend of 2% of spot at 0.4T. Over- and under-estimates are near-symmetric.

0.11101001000pricer error, correct dividend1ex-date off by 1 week43ex-date off by 1 month186amount off by +10%171amount off by -10%171amount off by +25%429amount off by -25%427dividend suspended entirely1662implied-vol basis points — dot = median, small dot = p95 (log scale)
Dividend input error against the pricer's own error, with the same engine throughout. The dashed line is the pricer's median error given a correct dividend; large dots are medians and small dots p95.

Amounts matter more than dates, by roughly a factor of six at the median and four in the tail. Being a month early on the ex-date is about as damaging as being ten percent wrong on the size, which is a useful calibration for anyone deciding where to spend effort on a dividend feed.

Line the three numbers up and the shape of the whole problem appears. The pricer’s own error is a fifth of a basis point. A ten percent error in the dividend is more than two orders of magnitude worse than that. And the market itself is about twenty-five basis points wide, so the pricer sits a factor of a hundred and forty inside the spread it would trade against, while the dividend error is comfortably outside it. These are not comparable quantities being weighed against each other; one of them is simply not the binding constraint.

Turned around, that gives the useful form: refining the pricer only starts paying once dividend amounts are better than about six hundredths of a percent accurate, and judging by the p95 rather than the median tightens that to three hundredths. Nobody forecasts dividends to a twentieth of a percent: companies cut, raise, shift dates for calendar reasons, and pay specials. The suspension row — 277 bp at the median, 1,662 in the tail — is what a dividend cut does to a book before anything has been re-marked.

Where this leaves us

Pricing an American equity option properly needs a jump condition at each ex-date, a free boundary solved backwards, and enough resolution that the pricer’s own error sits under the noise floor of the dividend forecast. That last clause does more work than it looks like it does.

The two sides of the book are genuinely different problems. A put’s premium is interest on the strike and vanishes exactly at zero rates; a call’s exists only because of dividends and vanishes exactly on a non-payer. Anything that flattens the dividend — escrowing it, converting it to a yield, storing one annual number per name — damages the call side far more than the put side at short tenors, and the damage is in the shape of the exercise region rather than in the arithmetic, which is why a finer grid never recovers it. Two unrelated numerical methods will agree with each other to a basis point or two on a smeared dividend and both be wrong by the same hundreds.

Below roughly 5 bp, more numerical accuracy buys nothing that survives contact with the input data, because the dividend noise floor sits well above it. That does not make the scheme comparisons in the rest of this series pointless — it is still worth knowing which methods land inside 5 bp and what they cost, and some widely recommended ones do not. But it does mean the honest question is about speed and reliability rather than accuracy, and that a great deal of effort usually spent on the last basis point of the pricer would be better spent on the dividend calendar feeding it.

Reproducing this

The code is one self-contained Julia module plus a script per experiment, with no dependency on anything private. It runs in about eighty seconds on one core, writes every table above into results/, and regenerates every figure from those CSVs, so no number in a plot is typed by hand.

Everything assumes Black–Scholes dynamics with flat scalar rate, carry and volatility, and non-negative rates, on vanilla American calls and puts. No term structure, no local or stochastic volatility. Timings are single-threaded on one machine, so ratios travel and absolute microseconds do not.

The market data is a ThetaData snapshot[15] of AAPL on 2 January 2024 at 15:45 ET — spot 184.855, 760 strikes across 19 expiries, last two-sided quote per contract in the preceding minute. That is a raw chain running from strike 50 to strike 320; the derivation script cuts it to within 6% of the money and to relative spreads under 15%, which leaves 208 of 1,520 legs, and prints what each cut removes. No raw quotes are in the repository; only the derived aggregate spread statistics are committed, along with the script that produced them. That spread cut is also why no claim is made anywhere above about illiquid contracts: wide markets are excluded from the sample by construction, and real wing spreads are wider than anything shown.

Healy’s Applied Quantitative Finance for Equity Derivatives[6] is the reference text for most of this material and is licensed CC BY-SA 4.0. Where its numbers appear here they serve as an independent check rather than a reproduction of its tables.

  1. Black, F., and Scholes, M. (1973). The pricing of options and corporate liabilities. Journal of Political Economy 81(3). ↩︎
  2. Merton, R. C. (1973). Theory of rational option pricing. Bell Journal of Economics and Management Science 4(1). ↩︎
  3. Stefanica, D., and Radoicic, R. (2017). An explicit implied volatility formula. International Journal of Theoretical and Applied Finance 20(7). ↩︎
  4. Cboe Global Markets (2026). Options on ETPs — product specifications. Exercise style: American; physically settled. ↩︎
  5. Cboe Global Markets (2026). S&P 500 Index Options — product specifications. Exercise style: European; cash settled. ↩︎
  6. Healy, J. (2025). Applied Quantitative Finance for Equity Derivatives. Fifth edition, licensed CC BY-SA 4.0. ↩︎
  7. McDonald, R. L., and Schroder, M. D. (1998). A parity result for American options. Journal of Computational Finance 1(3). ↩︎
  8. Battauz, A., De Donno, M., and Sbuelz, A. (2015). Real options and American derivatives: the double continuation region. Management Science 61(5). ↩︎
  9. Leisen, D. P. J., and Reimer, M. (1996). Binomial models for option valuation — examining and improving convergence. Applied Mathematical Finance 3(4). ↩︎
  10. Peizer, D. B., and Pratt, J. W. (1968). A normal approximation for binomial, F, beta, and other common, related tail probabilities. Journal of the American Statistical Association 63(324). ↩︎
  11. Vellekoop, M. H., and Nieuwenhuis, J. W. (2006). Efficient pricing of derivatives on assets with discrete dividends. Applied Mathematical Finance 13(3). ↩︎
  12. Brennan, M. J., and Schwartz, E. S. (1977). The valuation of American put options. Journal of Finance 32(2). ↩︎
  13. Rannacher, R. (1984). Finite element solution of diffusion problems with irregular data. Numerische Mathematik 43(2). ↩︎
  14. QuantLib (2026). QuantLib 1.43 — QdFpAmericanEngine. BSD-licensed quantitative finance library. ↩︎
  15. ThetaData (2024). US equity options quote history. Market data vendor; AAPL snapshot of 2024-01-02. ↩︎