Key Rate Duration Explained
Key rate duration (KRD) measures a bond or portfolio’s price sensitivity to a localized shift at a specified curve maturity while holding other key points fixed under a defined interpolation rule. It replaces the false precision of one parallel-duration number with a vector of curve exposures, but it remains a modelled finite-difference risk measure rather than an immutable property of a security.
Definition and curve shocks
For a bump Δy_k to key rate k, calculate central-difference KRD from fully repriced values:
KRD_k = -[P(y + bump_k) - P(y - bump_k)] / [2 P(y) Δy_k]
The phrase “bump key rate” is incomplete unless the shock shape is specified. A triangular tent bump, peaking at the chosen tenor and falling to zero at adjacent keys, is common. A node-only bump combined with cubic interpolation can unintentionally move a wide set of forwards. Always apply the shock in the same curve representation used for valuation.
| Risk measure | Assumed shift | Primary use |
|---|---|---|
| modified duration | parallel yield shift | fast scalar approximation |
| effective duration | repriced cash flows | optioned bonds |
| key rate duration | localized curve deformation | curve hedging |
| bucketed PV01 | quote-node bump | market risk and P&L attribution |
KRD on a government bond is normally concentrated near its maturity, but coupons distribute exposure across earlier nodes. An amortizer, floater, or callable security has a more dispersed and state-dependent profile. For the duration foundations, see duration and convexity.
A reproducible implementation
The following code builds a linear tent shock in zero-rate space. Production code must use dated curves, payment calendars, and the desk’s actual interpolation convention.
import numpy as np
def tent_bump(tenors, key, bump):
x = np.asarray(tenors, dtype=float)
i = np.where(x == key)[0][0]
left = x[i - 1] if i else x[i]
right = x[i + 1] if i + 1 < len(x) else x[i]
w = np.where(x <= key, (x - left) / max(key-left, 1e-12),
(right - x) / max(right-key, 1e-12))
return bump * np.clip(w, 0, 1)
def key_rate_duration(price_curve, base_zeros, tenors, key, bump=1e-4):
p0 = price_curve(base_zeros)
up = price_curve(base_zeros + tent_bump(tenors, key, bump))
dn = price_curve(base_zeros - tent_bump(tenors, key, bump))
return -(up - dn) / (2 * p0 * bump)
Choose the bump large enough to overcome numerical noise but small enough for local linearity; one basis point is conventional, not universally correct. Compare central differences at 0.5 bp, 1 bp, and 5 bp. Large discrepancies indicate optionality, discontinuous rules, or a curve-shock implementation defect.
Hedge as a constrained system
Let b be the portfolio KRD vector and columns of H be KRD vectors for hedge instruments. A minimum-norm hedge solves:
min_h ||W(b + Hh)||² subject to financing, liquidity, and position constraints
W should emphasize economically material buckets, not merely equalize tenor count. Exact neutralization is often undesirable: a sparse hedge of liquid futures and swaps can be more robust than a mathematically perfect combination of illiquid cash bonds.
| Portfolio exposure | Candidate hedge | Residual risk |
|---|---|---|
| long 5Y KRD | 5Y future or OIS swap | CTD and basis |
| 2s10s steepener | two matched swaps | roll and curve-model risk |
| MBS extension | longer swaps / swaptions | prepayment and volatility |
For callable and mortgage assets, recompute KRD across rate and volatility scenarios. Their cash-flow profile changes under the bump, so a single base-case vector hides contraction and extension. Rate-tree valuation techniques are covered in Bermudan swaptions and callable bonds.
Controls and attribution
KRD should reconcile to independent bucketed PV01 reports within a documented tolerance. Check that sum of KRD times a parallel shock approximates effective duration, but do not demand equality: different shock bases and interpolation can legitimately differ. Backtest daily P&L against key-rate explain, then classify the residual into convexity, spread, volatility, fixing, and model components.
Key takeaways
- KRD is a vector of localized, full-revaluation curve sensitivities.
- The bump shape, curve representation, and interpolation convention are part of its definition.
- Use central differences and bump-size tests to detect nonlinear or numerical instability.
- Hedge under liquidity and financing constraints, then report residual exposure explicitly.
- Recompute scenario KRDs for options and mortgages; base-case duration is insufficient.
