Risk (PV01 / DV01)
PV01 is the dollar change in a position's value for a one-basis-point move in rates — the app's primary risk-sizing number, shown per swap and rolled up into the portfolio ladder.
Per-swap PV01Annuity basis
Uses the swap market's current variable rate as a discount rate and an annuity factor over the swap's remaining life.
annuityFactor(y, T) = (1 − e^−yT) / y pv01 = notional × annuityFactor(y, T) × 0.0001
discount rate y = current variableremaining tenor Tportfolio/risk.ts:27
Unified ladder
Merges exact per-swap customer PV01 with an LP's pro-rata share of the swap market's DV01, bucketed by remaining tenor.
myShare = wallet's asset value in the swap market / its total deposited buckets: ≤30d · ≤3M · ≤6M · ≤1Y · >1Y
customer PV01 (exact)LP DV01 × mySharelib/dashboard/unified-risk.ts:53
Ladder totals
The headline numbers above the ladder chart, on the dashboard's "Risk & position" card.
Net PV01 = Σ rung.netUsd, receiving fixed + and paying fixed −Gross PV01 = Σ rung.grossUsdNet notional (10y equiv.) = Net PV01 ÷ PV01 of a 10y swap of 1, at the book's weighted variable ratelib/dashboard/unified-risk.ts:109
Cost of a rate rise (+1%)Simplified estimate
The dashboard headline's "if variable rises 1%, staying put costs" — a flat linear estimate on UNHEDGED debt, where a rise is a cost you pay. Not derived from PV01 or annuity discounting.
costPerYear = unhedgedDebt × 0.01
per yearlib/loans/premium.ts:rateRiseCost
Known limitation. The PV01 ladder above and the exit price a customer actually sees are computed on two different bases. The ladder uses an annuity discounting model; the live exit price (see Mark-to-market & early exit) uses a simpler linear model. The gap between them is small under normal conditions but real — it will close once the annuity basis lands in the pricing contract itself.