Arte SheetsLearn. Try. Understand.

Financial Modeling

Nelson-Siegel-Svensson (NSS) 4-Factor Yield Curve & Second Curvature Hump

Extend 4-parameter Nelson-Siegel with Lars Svensson’s (1994) second curvature loading beta_3 and decay tau_2 used by the ECB and Bundesbank to fit 10Y–30Y sovereign convexity.

Why central banks add Svensson’s beta_3 and tau_2 second hump at long maturities

Classic 4-parameter Nelson-Siegel has only one curvature hump controlled by tau_1, forcing ultra-long 15Y–30Y yields to decay monotonically toward beta_0 even when pension stripping or convexity demand depresses the 20Y–30Y sector. Lars E. O. Svensson (1994) added a fourth factor loading beta_3 * (((1 - EXP(-m / tau_2)) / (m / tau_2)) - EXP(-m / tau_2)) with independent decay constant tau_2—now the official daily zero-coupon curve specification of the European Central Bank and Deutsche Bundesbank.

At maturity m -> 0, both curvature loadings C_1(0) = 0 and C_2(0) = 0 vanish while slope loading L_1(0) -> 1, preserving the exact instantaneous short-rate anchor y(0) = beta_0 + beta_1.

Curve Component at m = 10 YearsLoading ExpressionContribution (tau1=2, tau2=10)
Long-Run Level beta_01.0000 * 0.045+0.0450
Short-Term Slope beta_1 * L_1(5)0.1987 * (-0.015)-0.0030
First Hump beta_2 * C_1(5)0.1919 * 0.020+0.0038
Second Svensson Hump beta_3 * C_2(1)0.2642 * (-0.012)-0.0032 -> Spot y(10) = 0.0427

Singularity-Safe Nelson-Siegel-Svensson Spot Rate Formula

Guard m <= 0 with short-rate limit B2 + B3, and otherwise evaluate both scaled maturities u_1 = m / tau_1 and u_2 = m / tau_2 inside LET.

=IF(B8 <= 0, ROUND(B2 + B3, 4), LET(u_one, B8 / B6, u_two, B8 / B7, slp_one, (1 - EXP(-u_one)) / u_one, crv_one, slp_one - EXP(-u_one), crv_two, ((1 - EXP(-u_two)) / u_two) - EXP(-u_two), ROUND(B2 + B3 * slp_one + B4 * crv_one + B5 * crv_two, 4)))

Second-Hump Basis-Point Attribution Check

Isolate beta_3 * C_2(m / tau_2) * 10000 in basis points and verify that setting beta_3 = 0 collapses NSS cleanly back to standard 4-parameter Nelson-Siegel (0.0459).

=IF(B8 <= 0, 0, LET(u_two, B8 / B7, ROUND(B5 * (((1 - EXP(-u_two)) / u_two) - EXP(-u_two)) * 10000, 2)))

Try the example

Use the original values or change them to test your understanding.

Further reading