Methodology · Make-whole calculator

How the tool estimates the call sensitivity — every knob, every assumption.

The calculator produces an assumption-dependent embedded-call teaching estimate. Under the hood it is a small Hull–White lattice teaching engine that decomposes a high-yield bond into bullet minus American call with a stepping strike. This page walks through the model, the eight variables, the strike function, the decomposition math, the assumptions, and a worked example matching the base case.

The doctrine (start here)

Most people talk about a make-whole as if it were something the borrower owns — “the right to prepay by paying a make-whole premium.” That framing is backwards, and the tool exists to make that visceral.

The borrower’s real option is a call on its own bond whose strike steps down to par after the non-call period. The make-whole is just the lender’s shield holding that call out-of-the-money while call protection lasts. It doesn’t give the borrower anything. It takes something away.

Everything else in the tool — the Value Split tab, the Sensitivity tab, the term structure of value — is built to expose this. Under the hood we price three bonds and subtract them:

  • Bullet — the same coupon and tenor with no call rights at all. The reference.
  • No-MW — no make-whole exercise before first call, then the same p50 / p25 / par step-down schedule. This isolates the post-NC call value.
  • Full — the actual bond: make-whole strike during non-call, then step-down to par.

The two slices you see in the readout come from these three numbers. That’s the whole game.

The model

The engine is Hull–White (1990), the workhorse one-factor short-rate model in fixed-income desks. The short rate follows

drt = ( θ(t) − a · rt ) dt + σr dWt, r0 given

with two structural parameters: the mean-reversion speed a and the short-rate volatility σr (in absolute bps). The time-dependent drift θ(t) is chosen so the model reproduces the initial market discount curve exactly — here, a flat forward at the risk-free rate rf. That’s the whole point of the “extended-Vasicek” specification: whatever the vol and mean-reversion say, the bullet ZCB curve at issue equals the market by construction. No stale anchor.

Under Hull–White, integrated rates are Gaussian, which gives us two clean identities we use everywhere:

# Analytic ZCB reconstitution at any node (t, r): P(t, T; r) = A(t, T) · exp( −B(t, T) · r ) B(t, T) = ( 1 − exp(−a · (T−t)) ) / a log A(t, T) = log( PM(0, T) / PM(0, t) ) + B(t,T) · fM(0, t) − ( σr2 / (4a) ) · (1 − exp(−2at)) · B(t,T)2

and, for the make-whole strike math, the closed-form convexity-corrected mean and variance of the integrated rate IT = ∫0T rs ds:

Var[IT] = ( σr2 / a2 ) · [ T − 2(1−e−aT)/a + (1−e−2aT)/(2a) ] E[IT] = −log PM(0, T) + Var[IT] / 2 convexity correction

That Var/2 term is the piece most classroom writeups skip. It’s essential: it’s the reason E[exp(−IT)] = PM(0, T) holds exactly, not just to leading order. Without it, the model prices the risk-free ZCB curve wrong at issue — and every downstream number gets a small systematic bias.

Numerically we run Hull–White on the standard 1994 trinomial tree: a symmetric “x-tree” on the zero-mean part with time step Δt = T/N and space step Δx = σr√(3Δt), capped at |j| ≤ ceil(0.184/(a·Δt)) to keep branching probabilities non-negative. Then we shift each time slice by α(t), computed by forward induction on Arrow–Debreu prices, so the tree reprices PM(0, ti) exactly at every slice. We use N = 24 × T steps per year, which converges to the continuum tree within ~0.02 pts of price on every scenario the sliders can produce.

Backward induction on the fitted tree is standard: at each interior node, the bond value equals min(K(τ, r), continuation), where continuation is the discounted probability-weighted successor value (three branches: up, mid, down). That’s the borrower’s American call from the lender’s perspective — the borrower calls whenever the strike is cheaper than holding on.

Method basis: a one-factor short-rate process, analytic zero-coupon reconstitution and backward induction for an American call embedded in callable debt. The browser implementation is cross-checked against an independent standalone reference script.

The eight variables

Each slider maps to one input to the Hull–White engine. Ranges are what the tool exposes; the pricer itself accepts anything reasonable.

SliderSymbolRangeWhat it does
TenorT3–10 yrsTime to legal maturity. Sets the horizon of the tree.
Non-call periodn1–5 yrsYears during which the strike is the HW make-whole PV, not par.
CouponC3–12%Annual fixed coupon. Scales the PV of remaining coupons in the strike.
Risk-free raterf1–8%Anchor of the flat initial curve. HW is fitted to PM(0,T)=exp(−rfT).
Credit spreads150–700 bpsConstant spread added to the stochastic short rate at each node for discounting.
Rate volatilityσr30–250 bpsHW short-rate vol in absolute bps. Sets the space step Δx = σr√(3Δt).
Mean-reversiona0.02–1.00HW pull-back speed. Higher a = rate shocks fade faster = call worth less.
Spread tighteningΔs0–400 bpsScenario overlay. Reduces s linearly from 0 at issue to full at the first call date.

The five pre-set structures (5NC2, 6NC3, 7NC3, 8NC3, 10NC5) are shortcuts for the (T, n) pair. The other six sliders keep whatever value they had.

The strike function

This is the piece most calculators get lazy about. In real high-yield indentures, the make-whole call price is the PV of the remaining protected cash flows discounted at a Treasury reference rate plus a fixed spread — commonly written as UST+50 bps. That’s not par. It is designed to stay expensive precisely when the borrower would otherwise want to refinance. That’s the shield.

Under Hull–White we can code this exactly, node-by-node, using the analytic ZCB reconstitution. At tree node (i, j) at time τ = iΔt with short rate r, the make-whole strike inside the non-call period is:

K(τ, r) = max( 1.01 · par, Σk=⌈τ⌉..n C · P(τ, k; r) · exp(−0.5% · (k−τ)) + p50 · P(τ, n; r) · exp(−0.5% · (n−τ)) )

where P(τ, T; r) is the HW analytic ZCB from §2 — a live risk-free discount curve as seen from node (i, j). The +0.5% layered on top is the UST+50 bps make-whole spread, and p50 is the first-call premium. So the strike moves stochastically with the tree: when rates fall in a scenario branch, ZCBs rally and the strike balloons; the shield sits deeper OTM exactly when the borrower most wants to refinance.

After the non-call period the strike walks down the industry step-down convention: p50 for one year, p25 for one year, then par until maturity.

Why the live curve matters. A flat node-rate shortcut ignores the term structure of forward rates from the current node. Here the strike uses the affine curve out to n: P(τ, k; r) = A(τ, k) exp(−B(τ, k) r). This is still a simplified teaching model; the limitations below prevent treating its output as a trading mark.

The decomposition

Once the tree returns the three prices, the tool splits the total optionality into two intuitive slices:

# Three prices from the lattice, per 100 par bullet = tree with strike = ∞ (no call) noMW = tree with no call before first call, then p50 / p25 / par full = tree with strike = make-whole during n, step-down after # Two slices, per 100 par total_option = bullet − full (what the option costs the lender in total) post_NC_call = bullet − noMW (value after first call) mw_window = noMW − full (residual value during make-whole years) # Sanity: mw_window + post_NC_call ≡ total_option

The Value Split tab shows post_NC_call next to mw_window. The percentages next to them are each slice’s share of total_option. That’s what the tool is really showing you: where the option value actually lives. In realistic parameter combinations the post-non-call slice should dwarf the make-whole window — because p50 / p25 / par optionality after year n is where the borrower makes real money.

A worked example (the base preset)

Load the tool with the default 7NC3 preset:

  • Tenor: 7 years
  • Non-call: 3 years
  • Coupon: 7.0%
  • Risk-free rate: 3.5%
  • Credit spread: 300 bps
  • Rate volatility σr: 100 bps
  • Mean-reversion a: 0.10
  • Tightening scenario: 200 bps

The Hull–White engine reports the total embedded call value in points of par, then the Value Split tab attributes it by exercise window:

total_option10.7 pts post_NC_call10.7 pts (~100%) mw_window~0.0 pts (~0%)

Read that carefully: even with a 200 bps tightening scenario, the make-whole window remains effectively out-of-the-money in the base case. That’s not a bug — that’s the point of the shield. The borrower’s economically relevant option is the post-NC step-down call.

The Sensitivity tab then varies one input at a time. Spread tightening is the most important teaching driver: it can move total option value from mid-single digits to high-teens, but the base-case attribution should still read as post-NC optionality rather than make-whole optionality.

Try it: crank vol to 250 bps, drop a to 0.02, push tenor to 10, tightening to +300 bps. Total optionality goes into double-digits. If a stress case gives the make-whole window residual value, read that as an edge-case breach of the shield, not the normal economics of the protection period.

Assumptions & what they cost you

Every classroom pricing model is wrong in the sense of being incomplete. Being honest about how it’s wrong is the difference between a teaching tool and a black box. Here are the four remaining simplifications and how much each one matters.

Gaussian short rate

Hull–White is Gaussian, which means the short rate can go negative in a bad scenario branch. In today’s post-negative-rates world that’s a feature, not a bug — but if you set σr very high and a very low, the model can produce implausibly wide rate distributions. The trinomial branching is capped at |j| ≤ ceil(0.184/(a·Δt)) to prevent probability blowups, which effectively truncates the tail. If you want log-normal / non-negative rates, that’s Black–Karasinski — a different model, different lattice, and it doesn’t change the doctrine.

No default or recovery

The bond can’t default in the model. A real HY bond can, and the call is only useful if the borrower survives to exercise it. Effect on the tool: it overestimates both the total optionality and the two slices, roughly by the survival-probability discount. For a BB, that’s small; for a CCC, material.

Rational refinancing

The lattice exercises when it’s optimal. Real borrowers exercise late (agency drag, indenture friction, timing on the calendar). Effect: the model slightly overestimates the option value again, but this is the same friction any option-pricing model has, and it usually washes out.

Annual coupons and dirty-strike convention

The teaching engine uses annual coupon dates and a dirty redemption-price convention inside the lattice. Real high-yield bonds usually pay semi-annually and quoted clean prices separate accrued interest. Effect: the tool is reliable for the option split and directional economics, but a deal mark should rebuild the exact coupon calendar, day count and accrued-interest treatment.

Constant credit spread

Spread is a knob, not a stochastic process. In reality spread and rates are correlated (usually negatively) and spread itself has vol. Effect: the tool does not stochastic-price credit-triggered optionality; the tightening slider is a deterministic scenario overlay. A full spread model is the exact issue the soft call below hinges on.

UST+50 bps make-whole reference

Real indentures use a variety of reference spreads — UST+25, UST+50, sometimes UST+15 for shorter tenors. We hard-code UST+50 bps because it’s a common high-yield convention. If you’re looking at a specific deal with UST+25, mentally raise the strike and strengthen the shield; a wider spread such as UST+100 moves the other way.


What’s not in this tool yet — soft call 101 in TLBs

Everything above is high-yield-bond math. Term Loan Bs (TLBs) — the sister instrument on the loan side of the leveraged capital stack — have a different call protection: not a make-whole, but a “soft call 101 for 6 months.” That means the borrower can repay at any time, but if they reprice the loan (i.e. cut the spread) within the first six months post-close, they owe lenders 101 — a one-point penalty. After six months, the loan is callable at par.

The math is completely different, and here’s why:

  • Different trigger. The make-whole strike is rate-linked, while the borrower’s refinancing economics also depend on spread tightening. Soft call is much cleaner: it is a spread-repricing trigger.
  • Different exercise style. A make-whole shield is on an American call — exercisable any time during non-call. Soft call is closer to a European binary — it triggers only on a repricing event, in a fixed six-month window.
  • Different payoff. Make-whole strike scales with rates. Soft call has a fixed 1-point payoff (101 − 100) conditional on the event.

The pricing intuition, sketched:

soft_call_valueP(repricing within 6mo) × 1 pt

Where P(repricing within 6mo) is a function of primary-market spread dynamics — and calibrating that is a small research project of its own, not a slider. This is the next tool in the LevFin Academy series. It shares the doctrine (the borrower’s optionality is the point, not the fee) but the machinery is spread-driven, not rate-driven. When it ships, the two tools together will cover the two major forms of call protection in the leveraged capital stack.

Why we didn’t jam both into one tool

The current tool is a rate-lattice engine. Soft call needs a spread-transition model. Putting them in the same UI would either be a fake (soft call as a bolt-on constant) or would double the cognitive load. The cleaner move is a second tool with its own doctrine slide and its own methodology page. That’s the plan.

Where this sits in the LevFin Book

The tool and this page are a hands-on implementation of one argument from Part VII: Contingent Rights and Teaching Sensitivities in the LevFin Book. Selected covenant rights are economically option-like. Each selected term must be mapped to its holder, legal states, exercise conditions, blockers and interactions before an assumption-dependent teaching estimate is applied. The rest of Part VII extends that discipline to soft calls, incremental debt, builder baskets, restricted-payment carve-outs and mandatory prepayment events.

If this tool clicks for you, the book is the rest of the shelf.

Want the whole framework in one place? Part VII of the LevFin Book takes the tool’s doctrine and applies it across the option-like economics in a real credit agreement — ending in a single worked deal where selected terms are mapped, tested, and converted into bps with clear methodology labels.