Home/Rulers Before Models/Rulers Before Models

Chapter 14 · DESK OBJECTS AND RATES SPINE

The least governed number on the desk is the rate

Rates infrastructure: silent convention gap. Volatility gets a committee. Credit gets a named author. The discount rate arrives as a bare float and nobody checks what kind of six percent it is — and an optimizer will find 167 basis points of free return in a covariance matrix nobody checked either.

Ch 14 · Rates spine 167bp phantom lunch KKT / frontier UNTYPED_JOB

The least governed number on the desk is the rate

Every stack I have audited governs its glamorous inputs and abandons its plumbing. The volatility surface has a committee and a change log. The credit assumption has a memo with a named author. The rate arrives as a column called rate holding 0.06, travels through ingestion, feature construction, an agent that drafts a mark, and a report that reaches the desk, and never once declares what kind of six percent it is. Nobody lies anywhere along that path. Nobody checks either. Two teams then produce two different marks on the same structure and spend a week arguing about model choice. The model was usually fine. The ruler was missing.

The silent swap that costs more than the dual-frame gap

Every discount factor carries a day-count convention, a compounding basis, and a holiday calendar, and those fields are ancestors of every mark that used the factor. Swapping ACT/360 for ACT/365 without moving the content hash is a silent convention swap, and on a ten-year cashflow with annual payments it is not a rounding error: it can move a funding leg by roughly 0.96 per 100 of notional, larger than the 0.60 dual-frame gap that CEH-001's own spread-versus-curve fight produces. A silent convention swap on the funding leg underneath either frame can move the mark by more than that entire honest disagreement, invisibly, while every dashboard stays green. The convention is not a footnote to the frame fight. It can be the frame fight, wearing a different coat.

The curve is a filtration, and the bootstrap is a gain stage

The leakage that should worry a desk most is not a stolen label. It is a curve. Everyone knows not to train on the future return column or the settlement price on the trade date. What survives review is structurally worse: a yield curve arrives as a table of tenors and rates, gets a date stamp, and gets treated as reference data. Reference data feels like a constant, and nobody audits a constant. Inside that table, one pillar can come from a print that did not exist at the decision clock — and the curve is not consumed raw. It is bootstrapped, and bootstrapping is a recursion that amplifies.

Start honest. A one-year spot of 5.00% and a two-year spot of 5.50% pin the one-into-two forward at 6.0024% — not a forecast, the only rate at which the two funding paths cannot be arbitraged against each other. Leak fifteen basis points into tomorrow's two-year print, because the loader takes the latest row, and the forward moves to 6.3040%. Fifteen basis points in, thirty out: the recursion roughly doubled it.

At the long end it is far worse, because the amplification runs with tenor. A nine-year spot of 5.40% against a ten-year of 5.50% gives a nine-into-ten forward of 6.4043%. Move the ten-year spot by five basis points — a rounding difference nobody would call leakage — and the forward becomes 6.9096%, a move of 50.5 basis points: roughly a 10× gain. Fifteen basis points of contamination moves it 152 basis points, to 7.9269%.

Why does this survive scrutiny by careful people? Because every step is good practice taken one clock too far. Vendors publish corrections, so loaders take the latest row. Curves have gaps, so interpolation fills them — and happily interpolates through an illegal pillar, laundering it across neighbouring tenors. A clean-curve research table with one row per date looks more trustworthy than the live feed because it is complete and gap-free, and completeness is exactly the tell that a batch job reached past its own clock. Leakage does not present as an error. It presents as skill, and skill gets funded: the leaked path prints the peace number at zero exam error while the honest mark carries error 0.30.

Typed jobs: the sentence whose literal optimum is the forbidden midpoint

Here is the cleanest Goodhart demonstration in the book. The desk's actual request, spoken in a meeting, is "reduce the mark dispersion on the structured book." Written literally as an objective — minimise the disagreement between the two frames — it is minimised by setting both marks to the same value, and the cheapest such value under a squared-deviation penalty on moving each mark from its own card-consistent level is the midpoint. The free-text request the desk has been making for a month has 1.80 as its exact optimum.

That is not a solver failure and not an agent failure. It is Goodhart arriving on schedule, invisible only because nobody wrote the objective down. A metric introduced as a diagnostic — how far apart are our frames? — becomes an objective the instant it is named as the thing to reduce, and its optimum is a number the frame card forbids.

Typed properly, the job changes shape. The objective becomes the fit of each frame's mark to its own card-consistent value, not the distance between the frames. Dispersion moves out of the objective and into a reported diagnostic — evidence about model risk, not a cost to minimise — and a policy row states that no mark may be produced by averaging frames. The untyped version refuses under UNTYPED_JOB. The typed version runs, returns two marks still near 1.50 and 2.10, and reports dispersion as a number the desk must escalate rather than a number the solver is paid to erase.

Near-perfect weights, a wrong world, 125 basis points of hidden risk

An agent returns portfolio weights of (30.31, 39.37, 30.31)%, a tidy write-up, and a reported volatility of 12.60%. Feasibility passes cleanly: weights sum to one, the return target is hit exactly. It looks ready to promote. Stationarity is where it dies. Checked against the card's own covariance, the residual comes back at 4.33×10-4 against a gradient scale of 0.057, far outside tolerance. Re-score those same weights under the card's actual covariance and volatility is 13.85%, not 12.60%.

The weights are nearly right, differing from the certified optimum in the third decimal. The risk claim is wrong by 125 basis points. The cause: the agent solved the problem using a pairwise correlation of 0.15 instead of the card's 0.30, a stale covariance recipe pulled from a research notebook. A reviewer eyeballing the weights against the certified optimum would have waved this straight through. The stationarity residual is what notices, because it tests the proposal against the card's own geometry, not against a reviewer's intuition. Worth sitting with: the mismatch didn't make the portfolio look worse. It made the reported risk look better, which is the more dangerous direction to be wrong in.

The phantom lunch: 167 basis points from a matrix, not a market

The optimizer output that should frighten a desk is not a large number. It is a small one. Someone runs an allocation job and the minimum-variance line comes back near zero, beside weights that are large and offsetting, several hundred percent gross. Nobody built that portfolio on purpose.

Take the smallest concrete version. Three assets: the first at 15% volatility, the second at 25%, correlated 0.20. The third is defined, exactly, as an equal-weight combination of the first two — a fund holding both, or the same exposure booked through a different instrument. Build the covariance matrix from that relationship and it has an exact null direction: the combination (-0.5, -0.5, 1) has variance zero to machine precision, because the position holds nothing. That direction is free to add to any portfolio without changing its reported risk at all.

Now let ordinary estimation error give that null direction a price. The relationship says the third asset's expected return must average the first two, 10%. But returns are estimated, and the inputs say 8%, 12%, and 11% — the third figure is off by an unremarkable one hundred basis points. Moving along the null direction changes expected return by exactly that amount and changes variance by nothing. Starting from equal weights (15.81% volatility, 10.33% expected return), the optimizer rides the direction until the only thing that stops it is a constraint with nothing to do with risk: a 300% gross exposure cap, halting at weights of (-50, -50, 200)%, having bought 167 basis points of expected return at literally zero additional variance. Every number in that report is arithmetically correct. Volatility unchanged, return higher, Sharpe improved. What actually happened is that one hundred basis points of noise in a single return estimate got levered against a rank deficiency until it hit the one binding constraint in the problem.

This is not exotic on real data; it is the default. A sample covariance estimated from sixty monthly observations across eighty names has rank at most fifty-nine, which guarantees at least twenty-one exactly-zero-variance directions before anyone does anything wrong. You don't need a redundant asset. You need more names than observations, which describes most books.

A rate is a ruler, not a float

The fix in both cases is the same discipline this book applies everywhere: name the frame before you trust the number. A rate card declares the convention, compounding basis, and calendar as fields that hash alongside the value, not as tribal knowledge in someone's head. A loss card declares the covariance recipe, its estimation window, and its conditioning bound the same way. Change either without moving the hash, and the system refuses on grounds of a silent mismatch, the same way it refuses a midpoint mark. And the midpoint stays impossible under this machinery for a reason that is now arithmetic rather than policy: there is no covariance recipe, no multiplier pair, and no active-set story under which a mark of 1.80 emerges as a stationary point of any card on file.

Book: Chapter 14 in Rulers Before Models.

ch14Open on YouTube ↗

Next. Open ch15: Hedges, measures, and contrast objects. Previous: ch13 (Estimators, sequential rights, and regulatory language). Rulers Before Models index.