Duration measures interest rate sensitivity (years). Modified Duration = Macaulay / (1+y). Convexity captures curvature—important for large rate changes.
Duration = Σ t×PV(CFₜ) / Price
Modified Duration = MacDur / (1+y)
Convexity = Σ t(t+1)×PV(CFₜ) / (Price×(1+y)²)
function durationAndConvexity(coupon, yield, years) {
const c = coupon / 100;
const y = yield / 100;
let price = 0, macNumerator = 0, convNumerator = 0;
for (let t = 1; t <= years; t++) {
const cf = t < years ? c : 1 + c;
const pv = cf / Math.pow(1 + y, t);
price += pv;
macNumerator += t * pv;
convNumerator += t * (t + 1) * pv;
}
const macDuration = macNumerator / price;
const modDuration = macDuration / (1 + y);
const convexity = convNumerator / (price * Math.pow(1 + y, 2));
return { macDuration, modDuration, convexity };
}