Technical

Nelson-Siegel Yield Curve Explained (2026)

Fit the Nelson-Siegel yield curve correctly, interpret level, slope and curvature, avoid decay-parameter traps and understand when it misleads.

12 min read·

A curve, not a pricing model

Charles Nelson and Andrew Siegel's 1987 paper, Parsimonious Modeling of Yield Curves, fitted US Treasury bill yields from 1981 to 1983 with four parameters. The paper reported that its model explained 96% of the variation in bill yields across maturities. The result was practical: a smooth curve without a parameter for every bond.

Nelson-Siegel is a static parameterisation of continuously compounded zero-coupon yields. It is not an SDE, a short-rate model or a derivative-pricing PDE. That distinction prevents several common mistakes.

Using a decay time τd>0\tau_d>0, the zero yield at maturity τ\tau is

y(τ)=β0+β11−e−xx+β2(1−e−xx−e−x),x=ττd.y(\tau)=\beta_0 +\beta_1\frac{1-e^{-x}}{x} +\beta_2\left(\frac{1-e^{-x}}{x}-e^{-x}\right), \qquad x=\frac{\tau}{\tau_d}.

Some texts instead write e−λτe^{-\lambda\tau}, where λ=1/τd\lambda=1/\tau_d. The two conventions give λ\lambda opposite dimensions. Copying a fitted value between them without inversion moves the hump to the wrong maturity.

The fitted curve implies

P(0,τ)=e−τy(τ)P(0,\tau)=e^{-\tau y(\tau)}

only when yy is continuously compounded. Coupon-equivalent, annually compounded and par yields need conversion or direct instrument pricing first.


Level, slope and curvature

The three loadings have useful limiting behaviour:

  • the level loading is one;
  • the slope loading (1−e−x)/x(1-e^{-x})/x falls from one to zero;
  • the curvature loading (1−e−x)/x−e−x(1-e^{-x})/x-e^{-x} starts at zero, rises and returns to zero.

It follows that

y(0)=β0+β1,lim⁡τ→∞y(τ)=β0.y(0)=\beta_0+\beta_1, \qquad \lim_{\tau\to\infty}y(\tau)=\beta_0.

So β1\beta_1 is the short-minus-long yield in this convention. A negative β1\beta_1 describes an upward-sloping endpoint difference. The sign of β2\beta_2 controls whether the middle of the curve is lifted or depressed relative to those endpoints.

The curvature loading reaches its maximum at x≈1.7933x\approx1.7933, found numerically from its first-order condition. Therefore its peak sits at

τpeak≈1.7933τd.\tau_{\text{peak}}\approx1.7933\tau_d.

With τd=2\tau_d=2 years, that is about 3.59 years. The occasionally quoted expression log⁡(2)/(1−log⁡(2))\log(2)/(1-\log(2)) is neither 1.79 nor the solution to this loading's peak condition.

Francis Diebold and Canlin Li (2006) popularised the level, slope and curvature labels in Forecasting the Term Structure of Government Bond Yields. The shapes resemble the first three empirical principal components, but they are imposed functions, not PCA eigenvectors estimated from the sample. Our linear algebra guide explains that difference.


Fitting the curve properly

If τd\tau_d is fixed, Nelson-Siegel is linear in β=(β0,β1,β2)′\boldsymbol\beta=(\beta_0,\beta_1,\beta_2)':

β^=arg⁡min⁡β∑iwi[yi−Xiβ]2.\widehat{\boldsymbol\beta} =\arg\min_{\boldsymbol\beta} \sum_i w_i[y_i-X_i\boldsymbol\beta]^2.

Weighted least squares is appropriate when the weights represent the error model. There is no universal "proper" choice. Equal yield errors, inverse bid-ask variance and duration-scaled price errors answer different questions. If the raw observations are coupon-bond prices, fitting quoted yields as if they were zero yields is not a shortcut. Price each cash flow from the trial discount curve and minimise price residuals.

Estimating τd\tau_d makes the problem nonlinear and can be ill-conditioned. A profile search is transparent: choose a grid of positive decay times, solve the linear regression at each point and refine around the best objective value. A coarse grid alone can miss a shallow minimum, while extreme decay times make the loading columns nearly collinear. This is an optimisation problem, not just three lines of regression.

The implementation below handles τ=0\tau=0 without dividing by zero and uses least squares rather than explicitly inverting X′WXX'WX.

import numpy as np def ns_loadings(maturities, decay_time): tau = np.atleast_1d(maturities).astype(float) x = tau / decay_time slope = np.empty_like(x) small = np.abs(x) < 1e-7 slope[small] = 1.0 - x[small] / 2.0 + x[small]**2 / 6.0 slope[~small] = -np.expm1(-x[~small]) / x[~small] curvature = slope - np.exp(-x) return np.column_stack((np.ones_like(x), slope, curvature)) def fit_ns(maturities, zero_yields, decay_time, weights=None): X = ns_loadings(maturities, decay_time) w = np.ones(len(X)) if weights is None else np.asarray(weights) A = X * np.sqrt(w)[:, None] b = np.asarray(zero_yields) * np.sqrt(w) return np.linalg.lstsq(A, b, rcond=None)[0]

For the illustrative decimal yields

(4.20,4.15,4.05,3.85,3.75,3.65,3.72,3.85,4.10,4.05)%(4.20,4.15,4.05,3.85,3.75,3.65,3.72,3.85,4.10,4.05)\%

at maturities (0.25,0.5,1,2,3,5,7,10,20,30)(0.25,0.5,1,2,3,5,7,10,20,30) years, equal-weight OLS with τd=2\tau_d=2 gives

(β^0,β^1,β^2)=(4.1911%,0.1852%,−1.9097%).(\widehat\beta_0,\widehat\beta_1,\widehat\beta_2) =(4.1911\%,0.1852\%,-1.9097\%).

The large negative curvature term is what produces the five-year dip. Any fit of these data reporting a much smaller β2\beta_2 has either used a different decay time or a different weighting scheme.


Svensson and dynamic Nelson-Siegel

Lars Svensson's 1994 IMF working paper added a second curvature loading:

y(τ)=β0+β1L1(τ;τ1)+β2L2(τ;τ1)+β3L2(τ;τ2).y(\tau)=\beta_0+\beta_1L_1(\tau;\tau_1) +\beta_2L_2(\tau;\tau_1) +\beta_3L_2(\tau;\tau_2).

There are six parameters: four β\beta coefficients and two decay times. The extra hump improves cross-sectional fit, but τ1\tau_1 and τ2\tau_2 can swap roles or drift into poorly identified regions. Bounds, multiple starting points and parameter continuity checks are normal safeguards.

Institutional usage needs precise wording. The Federal Reserve Board's staff nominal curve uses Svensson from 1980 onwards and Nelson-Siegel for earlier dates with too few securities. It is not the H.15 official statistical release. The ECB's euro-area curves use Nelson-Siegel-Svensson. The Bank of England uses an adjusted Waggoner variable-roughness-penalty spline, not Svensson. "All major central banks use Nelson-Siegel" is too broad.

Diebold-Li makes the factors time-varying. After fixing the decay convention, estimate βt\boldsymbol\beta_t for each date and forecast the factors with univariate autoregressions, a VAR or a state-space model:

βt+1=μ+Φβt+εt+1.\boldsymbol\beta_{t+1} =\boldsymbol\mu+\Phi\boldsymbol\beta_t +\boldsymbol\varepsilon_{t+1}.

The 2006 paper found especially encouraging performance at longer forecast horizons against several benchmarks. It did not establish that a VAR(1) always beats a random walk at every six-to-12-month horizon, market and sample.


Where Nelson-Siegel helps and fails

Use Nelson-Siegel for a compact descriptive curve, missing-maturity interpolation, scenario factors and forecasting baselines. It is easy to explain to a risk committee: long end, endpoint slope and one medium-term bend. It can also compress a large panel of yields before a statistical model is estimated.

Do not feed par yields into the zero-yield formula and call the output a discount curve. Do not interpret β0\beta_0 as an observed infinite-maturity rate when the longest bond is 10 years. And do not use a low cross-sectional error as proof that the curve has sensible forwards outside the data range.

Static Nelson-Siegel can define a perfectly coherent set of discount factors for one date. Its deeper limitation is that it supplies no cross-time stochastic dynamics and therefore no no-arbitrage drift restriction for derivative pricing. Negative forwards are not automatically arbitrage in a negative-rate regime. The issue is the missing dynamic pricing structure, not the sign alone.

Christensen, Diebold and Rudebusch (2011) built an affine arbitrage-free Nelson-Siegel class. For direct rates pricing, the curve-fitting Hull-White model or a forward-rate framework is often more natural. For a positive one-factor short rate, the CIR model is the cleaner comparison.

A four-parameter curve is useful because it refuses to chase every mark. The same refusal is why it should not be asked to price every option.


References


Frequently Asked Questions

Is the Nelson-Siegel formula for zero yields or par yields?

It is normally written for continuously compounded zero-coupon yields. Par yields and coupon-bond yields must be converted or fitted through instrument prices.

What are the units of the decay parameter?

In the e−τ/τde^{-\tau/\tau_d} convention, τd\tau_d is a time. In the e−λτe^{-\lambda\tau} convention, λ\lambda is inverse time. Check the exponent before comparing fitted values.

Where does the curvature loading peak?

At approximately 1.7933τd1.7933\tau_d under the decay-time convention used here. A two-year decay time places the peak near 3.59 years.

Is Nelson-Siegel arbitrage-free?

The static formula is a curve parameterisation, not a dynamic no-arbitrage model. AFNS adds affine dynamics and pricing restrictions; plain Nelson-Siegel does not.

Does the Bank of England use Svensson?

No. Its published methodology uses an adjusted Waggoner variable-roughness-penalty spline. The ECB and the Federal Reserve Board's staff nominal-curve dataset are documented Svensson users.

When should I use Svensson instead?

Use Svensson when one curvature loading cannot fit the observed cross-section and the data can identify two decay scales. Expect a less stable nonlinear calibration and monitor parameter switching.

Skip the £25k programme - try the alternative

Master's programmes are slow and expensive. Quantt is a self-paced alternative. Start free with a real lesson and interview practice, then unlock 50+ courses and your personalised plan.

Free to start · No credit card required