Bond Desk measures the holdings you paste, at the prices you paste. It has no market data connection, it is not investment advice, and it cannot see anything outside the table you give it — a bond it cannot price is named and excluded rather than quietly dropped.
How it works
Nothing to hand? Load the , eight normal corporate and government lines where the holding that drives the plus-hundred is not the biggest position and one bond's numbers support no theme at all. Or the , where a premium utility yields far less to its 2031 call than to its 2054 maturity and the duration approximation is out by tens of basis points at two hundred. Or the , a zero-coupon sleeve with a line nobody priced, a bond that matured two years ago, a stated par total that does not foot, and no coupon income at all — so the break-even is refused rather than invented. to watch the export refuse itself. All three replay a saved run for free.
1. The table is read, not assumed
Comma, tab, semicolon, pipe and markdown tables all parse. Column roles are matched by header name one column at a time, so a classifier can never assign a role to a column because a different column matched. A header row is decided by the absence of numbers in it rather than by a word-versus-number majority, which quietly eats a real holding line. Whether a coupon column holds 4.25 or 0.0425 — and a price column 98.50 or 0.9850 — is decided once from the whole column, because a per-row rule turns a genuine half-percent coupon into fifty percent.
2. Every bond gets its own schedule
Coupon dates are generated backward from maturity, end-of-month aware, so a stub period lands at the front where the market puts it. From that schedule come the accrued interest on the row's own day count, the dirty price, and a yield solved by bisection. Bisection rather than Newton is deliberate: the price-yield function is monotone, so bisection either converges or reports that no yield reproduces the price — which for a price those cashflows cannot produce is the honest answer, and better than wherever an iteration wandered to.
3. The aggregation is proved, not promised
Portfolio yield, duration and convexity are market-value weighted. Then the invariants are checked: the holdings' DV01s must sum to the weighted duration times market value times a basis point, every holding must land in exactly one maturity bucket and the buckets must reproduce the market value, and the waterfall must bucket every scheduled payment exactly once. A book that fails any of them says so as an integrity finding instead of printing a number nobody can reconcile.
4. Scenarios reprice, and the approximation is scored
Six parallel shocks plus a steepener and a flattener, and every one discounts each bond's own cashflows again at the shocked yield. The duration-and-convexity estimate is computed alongside purely so the difference can be printed in basis points of market value. On a normal book at fifty basis points that gap is a rounding error; on a book with long zeros at two hundred it is not, and it always flatters the downside.
5. The driver is simulated, not sorted
Each holding is removed in turn and the remaining book re-measured. The driver is the one whose removal moves the portfolio's percentage result furthest — a different question from which position is biggest or carries the most DV01, and often a different answer, because the denominator shrinks with the numerator. The engine prints whether the driver was in fact the largest position, so you can see which case you are looking at rather than assuming.
6. The pass may only pick a theme the numbers permit
Before the model runs, the engine decides per holding which of the seven themes its own measured numbers can support, and records why in its own words. Duration driver, for instance, is a claim that a holding's DV01 share exceeds its market value share — not that its DV01 is large, which on a large position says nothing a weight does not already say. Afterwards the same lists check the reply: exactly one theme per holding, counted rather than sampled; any theme not on the admissible list named back by id; any note that merely restates a printed number flagged; and every figure traced to something measured, at the precision it was written to.
Method derived from @anthropics/fixed-income-portfolio (anthropics/financial-services, Apache-2.0). Bond Desk is a derived work, not a republication of that skill: the skill routes pricing, reference data, cashflows and scenarios to a market data provider's tools and synthesises the result, while Bond Desk keeps the method and replaces the tooling with an in-browser engine over your own pasted marks. The approximation-error column, the removal simulation and the carry break-even are this app's own documented extensions.