Interpolation Is a Policy Choice Nobody Wrote Down

A swap desk and a valuation team price the same trade off the same curve and get different numbers. Nobody has bad data. Nobody made an error. The two systems disagree about what happens between the quotes, and no document at the firm says which one is right.

Interpolation is the last unwritten policy in most valuation stacks. It is chosen once, by whoever wrote the pricing library, usually by accepting a default. It is almost never stated in a valuation policy, almost never tested, and almost never reviewed when the curve changes shape. It survives because the one place people check it is the one place it does not show.

The curve

Everything below runs on a single SOFR-style zero curve. It is illustrative rather than a real close, and I am publishing every node so any figure here can be reproduced.

Zero rates, annually compounded, act/365, with DF(t) = (1 + z)^-t:

Tenor Zero rate
1M 4.85%
3M 4.62%
6M 4.20%
1Y 3.55%
2Y 3.30%
3Y 3.35%
5Y 3.55%
7Y 3.70%
10Y 3.88%
15Y 4.02%
20Y 4.06%
30Y 3.98%

An inverted front end pricing a cutting cycle, a trough around three years, a normal slope after that. An ordinary shape. Nothing stressed, nothing exotic.

Six methods, all of which a real system might use:

  1. Linear on zero rates
  2. Linear on log discount factors, which is piecewise constant instantaneous forwards
  3. Natural cubic spline on zero rates
  4. Natural cubic spline on log discount factors
  5. Monotone cubic Hermite on zero rates
  6. Linear on discount factors

All six reproduce all twelve quoted nodes exactly, to zero error. That is the first thing worth saying plainly, because it is the reason this never gets caught. Every method agrees with the market everywhere the market spoke. The disagreement lives entirely in the space between the quotes, which is the only place anybody actually needs a number.

Where everyone looks, it does not show

Ask the six methods for the 3.5 year zero rate and they span 3 basis points.

Tenor Range across six methods
3.5Y 3.08 bp
8Y 2.27 bp
12Y 5.33 bp

Put money against it. One hundred million dollars received at 3.5 years, discounted six ways, spans $92,646. On a hundred million. Under a basis point of PV.

This is the number people check. It is the number in the model validation memo, because a discount factor is the natural thing to compare when you are asking whether two systems agree. And it says, correctly, that the choice barely matters.

One qualification, because the effect is not uniform. The rate spread stays under 10 basis points everywhere inside the quotes, but present value is rate times duration, so the dollar impact grows with tenor: $92,646 at 3.5 years, $387,173 at 12 years, $887,605 at 25 years, all on a hundred million. A long-dated liability book is not immune. It is simply that nobody looks at 25 year interpolation error either, and at every tenor the number stays small enough to explain away.

Then everyone stops looking.

Where nobody looks, it moves fifty basis points

Ask the same six methods, on the same curve, from the same quotes, for the three month forward rate starting at one year.

Method 3m forward at 1Y
Linear on zero rates 3.199%
Linear on log DF 3.016%
Monotone cubic on zero rates 3.003%
Linear on discount factors 2.982%
Cubic spline on log DF 2.818%
Cubic spline on zero rates 2.703%

Forty nine and seven tenths basis points, between two systems that agree on every quote and agree on the discount factor to within a basis point of PV.

It is not a one off. Across the front five years of this curve the six methods disagree by more than 30 basis points at four separate forward dates, with a second peak of 49 basis points at one year nine months.

The reason is mechanical. The log discount factor is the negative integral of the instantaneous forward curve. Integration smooths, so differences in the forward path largely wash out by the time they reach the discount factor. Recovering the forward curve runs the other way, and differentiation amplifies local differences instead of averaging them.

So the integral is what gets validated, and the derivative is what gets consumed. The floating leg of a swap is projected off forwards, which is what the Fixed vs Float Swap Model is doing every time it values one. A cap or floor is a strip of options on forwards. A carry number is a forward. Hedge ratios are sensitivities to the same curve.

Linear on zero rates invents a shape

This one is worth its own section, because it is the most common default in spreadsheets and the failure is not obvious.

Between the 1 year quote at 3.55% and the 2 year quote at 3.30%, the market said one thing: down 25 basis points over that year. Interpolate the zero rate linearly across the gap and read off the implied three month forwards:

Forward start Rate
1.00Y 3.199%
1.25Y 3.077%
1.50Y 2.955%
1.75Y 2.833%

A steady descending ramp, 37 basis points from top to bottom, which then jumps straight back up at the 2 year node.

Nobody put that ramp in the market. No trader has a view that rates grind down through that year and then snap back. It is an artifact, produced entirely by choosing to interpolate the level rather than the forward, and it will show up in a float leg projection as a real cashflow forecast that somebody may hedge against.

Linear on log discount factors gives a flat 3.016% across the whole gap, because that is what piecewise constant forwards means. Neither is more correct in the abstract. But one of them is a decision about the shape of the forward curve, and the other is a decision about the shape of the forward curve that nobody knew they were making.

Past the last node, it is not even close

Inside the quoted curve, every method is at least anchored by market observations on both sides. Past the last node that constraint disappears, and the differences stop being subtle.

Many libraries expose the choice as one boolean. Call the two settings what they are. Flat holds the interpolated quantity constant past the final node. Extend keeps evaluating the fitted function.

Start with Flat, which sounds like the conservative option and sounds unambiguous. The 50 year zero rate, on a curve whose last quote is 30 years:

Method z(50Y), Flat
Linear on zero rates 3.980%
Cubic spline on zero rates 3.980%
Monotone cubic on zero rates 3.980%
Linear on log DF 2.369%
Cubic spline on log DF 2.369%
Linear on discount factors 2.369%

161 basis points, and every one of those six is doing exactly what "flat" says. Holding the zero rate flat gives 3.980%. Holding the discount factor flat means the curve earns nothing at all beyond thirty years, which prints as 2.369%. Same word, same intent, same conservative instinct, 161 basis points apart, decided entirely by which quantity the function happened to be interpolating. At 35 years, which is inside the liability horizon of an ordinary annuity book, it is still 58 basis points.

Now Extend. The spread at 50 years widens to 359 basis points, and the tail method is the interesting one: linear on discount factors reaches 7.413%, because a straight line through the 20 year and 30 year discount factors keeps falling. Follow it far enough and it crosses zero at 51.9 years. Past that point the curve is quoting a negative price for a future dollar. Not a low rate, not an inverted curve, a negative discount factor, which is not a market condition but an arithmetic consequence of extending a straight line.

This is the part that should worry a control function, because extrapolation policy is usually not a policy. It is a boolean. I have written interpolation functions myself that carry an extrapolate flag with no documentation of what the flag does past the last node, and no note anywhere of which setting the callers use. That flag is a valuation assumption with a three hundred basis point range, sitting in a function signature.

Why it survives

Three reasons, and they compound.

It passes every test you would think to run. The method reproduces the quotes exactly, so a node level reconciliation is clean. The discount factors agree to under a basis point of PV, so a PV comparison is clean. Only a forward level comparison finds it, and that is not a comparison most validation packs contain.

It has no owner. Curve construction sits between the quant who wrote the library, the vendor who shipped the default, and the operations team that runs the marks. Nobody's job description says "choose the interpolation scheme," so nobody chose it.

It only bites when the curve changes shape. On a smoothly sloping curve the six methods sit within a few basis points of each other everywhere, including on forwards. The gap opens where the curve has curvature, which is exactly when a policy pivot is being priced, which is exactly when the front end matters most and when somebody is most likely to be putting on a hedge against it.

What to write down

The valuation policy should name, for every curve the firm builds:

The interpolated quantity. Zero rate, log discount factor, discount factor, or instantaneous forward. This is the decision that produces the 50 basis point spread above, and it is one line.

The method. Linear, cubic spline, monotone cubic, or something else, with the boundary condition if it is a spline. "Natural" is a choice, not a synonym for "cubic."

The extrapolation rule, separately. Both ends. What happens before the first node and after the last one, stated as behaviour rather than as a flag name. If the answer is "whatever the library does," that is the finding.

Which quantity the reconciliation compares. If two systems are checked against each other on discount factors alone, say so in the document, and state that forwards are unreconciled. That sentence is uncomfortable to write, which is the point of writing it.

A forward level tolerance. Not just a PV tolerance. Pick a number, in basis points, on a defined forward tenor, and test against it. A PV tolerance can pass even when the underlying forward curve is 50 basis points off.

If the valuation policy identifies the curve source but says nothing about interpolation and extrapolation, the methodology is not fully specified.

If you want a default to argue against, the conventional one for a discount curve is a constant instantaneous forward past the last node, which in practice means interpolating and extending the log discount factor. It is the only common choice with an economic story rather than a mechanical one: there is no further market information, so assume the last observed forward persists. Note that this is an extending rule, not a freezing one. Holding the log discount factor flat is a different thing entirely, and says the curve earns nothing beyond the last quote. Adopt the convention or reject it, but do it on purpose.

None of this is hard. It is five lines in a document. The reason to write them before you need them is that the alternative is discovering the answer during an audit, or during a dispute with a counterparty, or in the middle of explaining to a CIO why the hedge effectiveness report moved when no position and no market data changed.

The calculator

The workbook builds the curve above from its twelve quoted nodes and interpolates it six ways, side by side, in open formulas. Every method is spelled out in cells you can read: the linear forms directly, the natural cubic spline through its tridiagonal system solved on the sheet, the monotone cubic through its Fritsch-Carlson slope limiter. There are no macros and nothing hidden, so you can trace any number back to the quotes it came from.

It reports the zero rate, the discount factor and the three month forward at every tenor under all six methods, the spread between them in basis points, and the PV impact on a notional you set. Change a node and watch which methods move and by how much. Point it at your own curve, in your own currency, and find out what your system has been assuming.

It is on its own page: Curve Interpolation Comparison

The curve in this article is illustrative and does not represent a market close on any date. Figures are computed at mid with no bid/offer and no transaction costs. Nothing here is investment advice.

Next
Next

Your Hedge Is Worth More and Does Less