Yield Curves and Curve Construction

Interest Rate Modeling




Tutorial Contents

  1. Fixed Income Notation
  2. Fixed Income Probability Measures
  3. Multi-Currency Markets
  4. The HJM Framework
  5. Basic Fixed Income Instruments
  6. Caps, Floors and Swaptions
  7. CMS Swaps, Caps and Floors
  8. Bermudan Swaptions
  9. Structured Notes and Exotic Swaps
  10. Callable Libor Exotics and TARNs
  11. Volatility Derivatives
  12. Yield Curves and Curve Construction
  13. Managing Yield Curve Risk
  14. Vanilla Models With Local Volatility
  15. Vanilla Models With Stochastic Volatility
  16. Introduction to Term Structure Models
  17. One-Factor Short Rate Models I
  18. One-Factor Short Rate Models II
  19. Multi-Factor Short Rate Models
  20. The Libor Market Model I
  21. The Libor Market Model II
  22. Risk Management and Sensitivity Computations
  23. P&L Attribution
  24. Payoff Smoothing
  25. Vegas in the Libor Market Model


Fundamentally, the goal of an interest rate model is to describe the random movement of a curve of discount bond prices (known as the term structure of interest rates) through time, starting from a known initial condition. In practice, only a few short-dated discount bonds are quoted directly at any given time. This is far from the continuous curve of discount bond prices up to a maturity of 20 or 30 years required as input in most IR models. However, as we have seen, there are a number of liquid securities whose values, in a no-arbitrage environment, depend in a straightforward fashion upon discount bonds. This allows the reverse engineering of theoretical values for these bonds for maturities far beyond those that are quoted directly. Even so, only a finite set of securities are quoted in the market, so constructing a continuous curve of discount bond prices requires assumptions on how the curve should act between observed points, i.e. an interpolation rule. This interpolation may be based on direct assumptions of the functional form of the curve, or on some regularity norm to be optimised over.

This area is known as discount curve construction, and is a fundamental step in the modelling of fixed income products. Before the financial crisis of 07-08, it was standard to construct only a single discount curve based on Libor rates. However, since the crisis, it is no longer reasonable to assume that Libor rates are an accurate proxy for the OIS rates that underlie instruments such as vanilla swaps. It is hence necessary for a whole family of inter-related curves to be constructed in an unified manner. Nonetheless, it is crucial to understand single-curve construction before moving on to the construction of multiple curves. In this section, we explore the principles of single-curve construction, as used before the crisis.

Notation

Discount curves

In this section, we are interested in a static discount curve at the initial time t=0t=0. Hence, we freeze time in Tour notation and write

P:[0,T](0,1],P(T):=P(0,T), \begin{aligned} & P : [0, \mathcal{T}] \rightarrow (0, 1], \\ & P(T) := P(0, T), \end{aligned}

to denote the continuous, decreasing discount curve. Here, T>0\mathcal{T} > 0 denotes the maximum maturity of the constructed curve.

The curve is constructed using NN benchmark securities, with time 0 prices V1,,VNV_1,\ldots,V_N. We assume that each of the benchmark securities can be priced as a linear combination of the discount bond prices, i.e.

Vi=j=1Mci,jP(tj),i=1,,N,(1) V_i = \sum_{j=1}^M c_{i,j} P(t_j), \quad i = 1,\ldots,N, \tag{1}

where 0<t1<<tMT0 < t_1 < \cdots < t_M \le \mathcal{T} is a given set of discount security dates. In practice, these dates are formed by merging the cashflow dates of the NN benchmark securities. Let {Tn}n=1N\{T_n\}_{n=1}^N denote the maturities dates of the benchmark securities, in which case we find that

ci,j=0,tj>Ti. c_{i,j} = 0, \quad t_j > T_i.

It should be clear that standard coupon-bearing bonds can be expressed in the form (1), but is also the case that, upon rearrangement, so can FRAs and standard vanilla fixed-floating swaps.

To see this in the case of the vanilla swap, suppose t=T0=0t = T_0 = 0. Then, the swap paying fixed rate KK has value

Vswap=A(0)(S(0)K)=A(0)S(0)A(0)K=n=0N1τnP(Tn+1)Ln(0)n=0N1τnKP(Tn+1)=n=0N1(P(Tn)P(Tn+1))n=0N1τnKP(Tn+1)=1P(TN)n=1Nτn1KP(Tn). \begin{aligned} V_{\text{swap}} & = A(0)(S(0) - K) \\ & = A(0)S(0) - A(0)K \\ & = \sum_{n=0}^{N-1} \tau_n P(T_{n+1})L_n(0) - \sum_{n=0}^{N-1} \tau_n K P(T_{n+1}) \\ & = \sum_{n=0}^{N-1} (P(T_n) - P(T_{n+1})) - \sum_{n=0}^{N-1} \tau_n K P(T_{n+1}) \\ & = 1 - P(T_{N}) - \sum_{n=1}^{N} \tau_{n-1} K P(T_{n}). \end{aligned}

to the fixed payer. By setting V:=1VswapV := 1 - V_{\text{swap}} we can write

V=n=1NcnP(Tn),(2) V = \sum_{n=1}^{N} c_n P(T_n), \tag{2}

where cn=τn1Kc_n = \tau_{n-1}K for n=1,,N1n=1,\ldots,N-1 and cN=1+τN1Kc_N = 1+\tau_{N-1}K. Very often it is the case that at initiation, KK is set such that Vswap=0V_{\text{swap}} = 0, so that in equation (2) we have V=1V = 1 on the LHS.

In the case of FRAs, consider a FRA on the Libor rate for the interval [Tn,Tn+1][T_n, T_{n+1}]. At t=0t=0, with FRA rate given by KK, the FRA has value

VFRA=τ(Ln(0)K)P(Tn+1). V_{\text{FRA}} = \tau (L_n(0) - K)P(T_{n+1}).

Using the definition of LnL_n, the above rearranges to

VFRA=τLn(0)P(Tn+1)τKP(Tn+1)=P(Tn)P(Tn+1)τKP(Tn+1)=P(Tn)(1+τK)P(Tn+1), \begin{aligned} V_{\text{FRA}} & = \tau L_n(0) P(T_{n+1}) - \tau K P(T_{n+1}) \\ & = P(T_n) - P(T_{n+1}) - \tau K P(T_{n+1}) \\ & = P(T_n) - (1 + \tau K)P(T_{n+1}), \end{aligned}

which takes the form of a linear combination of zero-coupon bonds, as required.

Clearly, to construct a benchmark curve, it is important that all the instruments used represent borrowing from the same lender. For example, to construct the US Treasury curve it is appropriate to use Treasury bonds and bills, whereas the curve for a corporate lender should be built from debt issued by the lender in question, in order to consistently represent the embedded credit-worthiness of the issuer along with other nuances of the particular lender.

The curve that we shall focus on is a generic Libor curve. Generally, this is constructed using certificates of deposit (CDs) for maturities up to 3 months, a strip of Eurodollar futures for maturities between 3 months and 3/4 years (after a convexity adjustment is applied to bring the futures price in line with the corresponding forward price), and par swaps for the rest of the curve (maturities of 5 up to 30 years).

Matrix representation

Introducing the vector PRMP \in \mathbb{R}^M to represent the discount factors ordered by time, i.e.

P=(P(t1),,P(tM)),(3) P = (P(t_1), \ldots, P(t_M))^{\intercal}, \tag{3}

and the vector VRNV \in \mathbb{R}^N to represent the observable security prices, i.e.

V=(V1,,VN), V = (V_1,\ldots,V_N)^\intercal,

it is possible to write

V=CP,(4) V = C P, \tag{4}

where CRN×MC \in \mathbb{R}^{N \times M} represents the coupons associated with each instrument at each payment date, i.e.

C=(ci,j)1iN,1jM. C = (c_{i,j})_{1 \le i \le N, 1 \le j \le M}.

This formulation reposes the above challenge of deducing the discount curve as a matrix inversion problem.

Typically, the matrix CC will be quite sparse. Supposing the first two securities are CDs, the next four are FRAs and the remaining N6N - 6 are swaps, the first two rows of CC will only have a single non-zero entry, the next four only 2 non-zero entries, and the remainder will have non-zero entries up until a certain column, and will be zero thereafter.

Construction principles and yield curves

In practice, our curve will contain many more cash flow dates than we have benchmark securities. In the above notation, this means M>NM > N. In this case, the matrix problem (4) will not have a unique solution, as our system is under-determined.

Our problem then, is to supplement equation (4) with enough additional assumptions in order for us to uniquely determine PP and to determine the entire function P()P(\cdot) for values of TT not contained in the discount security date set {tj}j=1M\{t_j\}_{j=1}^M.

Given that the discount curve has a roughly exponentially decaying shape, it is more common to perform the curve fitting exercise in yield space, rather than outright price space as discussed above. In yield space, the curve is much closer to a flat shape that can easily be interpolated and fitted. Specifically, we introduce the continuous yield function

y:[0,T]R0,y(T)=1TlogP(T). \begin{aligned} & y : [0, \mathcal{T}] \rightarrow \mathbb{R}_{\ge 0}, \\ & y(T) = -\frac{1}{T}\log P(T). \end{aligned}

Upon rearrangement, we see that the yield function y()y(\cdot) satisfies

P(T)=ey(T)T,(5) P(T) = e^{- y(T) \cdot T}, \tag{5}

so that y(T)y(T) can be seen as the continuous yield-to-maturity on the zero-coupon bond (discount factor) P(T)P(T). Plugging equation (5) into (3) gives

PP(y)=(ey(t1)t1,,ey(tM)tM). P \equiv P(y) = \left(e^{-y(t_1) \cdot t_1},\ldots, e^{-y(t_M)\cdot t_M} \right)^\intercal.

The mapping Ty(T)T \mapsto y(T) is known as the spot (zero) yield curve. It is important to note that the yield curve is simply an invertible transformation of the discount curve, using the transformation (5). Hence, the yield curve is just a more convenient way of viewing the discount curve, but contains exactly the same information. Another curve formed as a simple transformation of the discount curve is the instantaneous forward curve f(T)f(T) satisfying

P(T)=exp(0Tf(u)  du). P(T) = \exp\left(-\int_0^T f(u)\; \text{d}u \right).

Note that we can retrieve f(T)f(T) from P(T)P(T) via

f(T)=ddTlogP(T). f(T) = -\frac{d}{d T} \log P(T).

Likewise, using relationship (5) we find that

f(T)=ddT[y(T)T]=y(T)+dy(T)dTT, f(T) = \frac{d}{d T} \left[y(T) \cdot T \right] = y(T) + \frac{d y(T)}{d T} \cdot T,

or

y(T)=1T0Tf(u)  du. y(T) = \frac{1}{T}\int_0^T f(u) \; \text{d}u.

This shows that the yield yy can be viewed as the average instantaneous forward rate up to the time TT.

In the following, we choose to work in yield space, i.e. we will consider y()y(\cdot) as the fundamental curve which we seek to estimate.

Fundamentally, there are three approaches to solving the equation (4). These are:

  1. Introduce new, unspanned securities such that N=MN = M, giving (4) a single, unique solution.
  2. Parameterise the yield curve using NN parameters, so that the NN equations in (4) recover these parameters.
  3. Search all possible solutions to (4) and pick the one that is optimal according to some criteria.

Typically, option 1 is undesirable. If new securities were easy to include, they would already have been included. Hence, new securities generally have to be introduced via interpolation on already included prices. This often leads to odd looking curves and sub-optimal hedging parameters. Hence, if an interpolation rule is to be used, it is better to apply this directly to a fundamental quantity such as the yield curve itself.

Option 2 is used more commonly. Sometimes, it is implemented using functional forms, but it is much more common to work with a spline representation with NN user-chosen knots, with the level of yields at these knots constituting the NN unknowns for which the problem should be solved.

Option 3 represents the most sophisticated approach and can often be formulated as a totally non-parametric framework. If stated carefully, this approach can deal with situations where the system (4) is nearly singular, due to irregular/ non-smooth solutions or linearly dependent benchmark securities.

Table 1: Swap Benchmark set for yield curve construction tests.
Maturity (years)Swap par rate
14.20%
24.30%
34.70%
55.40%
75.70%
106.00%
126.10%
155.90%
205.60%
255.55%

In the following, we explore options 2 and 3, using the sample data given in table 1. The table consists of a set of 10 vanilla IRSs with semi-annual fixed and floating payments so that τi=τ=0.5\tau_i = \tau = 0.5 for all ii.

Yield Curve Fitting with NN-Knot Splines

A number of well known yield curve algorithms are based on polynomial and exponential splines of various degrees of differentiability. Here, we assume that we can arrange our benchmark security set to guarantee the maturities of the benchmark securities satisfy

Ti+1>Ti,i=1,2,,N1. T_{i+1} > T_{i}, \quad i = 1,2, \ldots,N-1.

This equation constitutes a spanning condition and allows the NN maturities to represent distinct knots in our yield curve splines.

C0C^0 yield curves: bootstrapping

If we simply require continuity of the yield curve, a common iterative procedure known as bootstrapping may be used. The basic idea is the following step by step procedure:

  1. Let P(Tj)P(T_j) be known for tjTi1t_j \le T_{i-1}, such that the prices of the benchmark securities with maturities T1,,Ti1T_1,\ldots,T_{i-1} are matched.
  2. Guess a value for P(Ti)P(T_i).
  3. Use an interpolation rule to fill in P(tj)P(t_j), Ti1<tj<TiT_{i-1} < t_j < T_i.
  4. Compute ViV_i from the now-known values of P(tj)P(t_j), tjTit_j \le T_i.
  5. If ViV_i equals the value observed in the market, stop. Otherwise repeat step 2.
  6. While i<Ni < N, set i=i+1i = i+1 and repeat step 1.

Updating the guesses in step 2 through 5 can be handled through a one-dimensional root-finding algorithm (such as Newton's method).

Importantly, there are limitations on the interpolation rule that can be applied in step 3. For example, one might use a representation of the yield curve in terms of instantaneous forward rates f(T)f(T), assuming that f(T)f(T) is a continuous, piecewise linear function on the maturity grid {Ti}i=1N\{T_i\}_{i=1}^N. However, this interpolation rule is numerically unstable and prone to oscillations.

Some stable, standard choices for interpolation rules will be explored in the following.

Piecewise linear yields

Perhaps the most common discount curve bootstrapping algorithm assumes that the continuously compounded yield y()y(\cdot) is a continuous, piecewise linear function on {Ti}i=1N\{T_i\}_{i=1}^N. Formally, we write P(T)=ey(T)TP(T) = e^{-y(T)\cdot T} in step 3. above, where y(T)y(T) satisfies

y(T)=(Ti+1TTi+1Ti)y(Ti)+(TTiTi+1Ti)y(Ti+1),T[Ti,Ti+1]. y(T) = \left( \frac{T_{i+1} - T}{T_{i+1} - T_i}\right)y(T_i) + \left(\frac{T - T_i}{T_{i+1} - T_i}\right) y(T_{i+1}), \quad T \in [T_i, T_{i+1}].

Notice that this interpolation rule requires us to provide an equation for y(t)y(t) when t<T1t < T_1. Normally, it is assumed that y(t)=y(T1)y(t) = y(T_1) for t<T1t < T_1.

The graph above shows this interpolation scheme applied to the swap data in Table 1. Notice that while yields are both linear and continuous under this scheme, forward rates are piecewise linear, but discontinuous. This motivates the use of a slightly different scheme - the piecewise flat forward rate scheme.

Piecewise flat forward rates

Under this scheme, we assume that between benchmark security dates TiT_i, the instantaneous forward rate f()f(\cdot) is constant, i.e.

f(T)=f(Ti),T[Ti,Ti+1). f(T) = f(T_i), \quad T \in [T_i, T_{i+1}).

This rule is equivalent to assuming that logP(T)\log P(T) is piecewise linear in TT since

logP(T)=logP(Ti)f(Ti)(TTi),T[Ti,Ti+1]. \log P(T) = \log P(T_i) - f(T_i)(T-T_i), \quad T \in [T_i, T_{i+1}].

Now, a bootstrapping algorithm can be used to determine the values of the NN unknowns f(T0),,f(TN1)f(T_0),\ldots,f(T_{N-1}). From the equation

y(T)T=0Tf(u)du, y(T)\cdot T = \int_0^T f(u) \text{d}u,

we see that we have, for T[Ti,Ti+1]T \in [T_i, T_{i+1}],

y(T)=y(Ti)Ti+f(Ti)(TTi)T.(6) y(T) = \frac{y(T_i)\cdot T_i + f(T_i)(T-T_i)}{T}. \tag{6}

By substituting in T=Ti+1T = T_{i+1} this gives

y(Ti+1)=y(Ti)Ti+f(Ti)(Ti+1Ti)Ti+1.(7) y(T_{i+1}) = \frac{y(T_i)\cdot T_i + f(T_i)(T_{i+1}-T_i)}{T_{i+1}}. \tag{7}

By rearranging (7) for f(Ti)f(T_i) and substituting into (6), we find that y(T)y(T) satisfies

y(T)=1T[(Ti+1TTi+1Ti)y(Ti)Ti+(TTiTi+1Ti)y(Ti+1)Ti+1]. y(T) = \frac{1}{T}\left[\left(\frac{T_{i+1} - T}{T_{i+1} - T_i}\right)y(T_i)\cdot T_i + \left(\frac{T - T_i}{T_{i+1} - T_i}\right)y(T_{i+1})\cdot T_{i+1} \right].

From this relationship, it should be clear that the yield curve will remain continuous under this scheme.

The graph above shows this scheme applied to the swap data in Table 1. Notice that under this scheme yields are non-linear functions of maturity.

C1C^1 yield curves: Hermite splines

In the previous section we saw that bootstrapping yields generally gives rise to discontinuous forward curves. Empirically, this is often unrealistic and can give rise to distorted derivative prices based off of said curves. The simplest extension to bootstrapping is to produce a once-differentiable yield curve and a continuous forward curve by utilising Hermite cubic splines. Hermitian cubic splines interpolate our yield curve function via a continuously-differentiable (C1C^1) function. Specifically, we write

y(T)=a0,i+a1,i(TTi)+a2,i(TTi)2+a3,i(TTi)3,T[Ti,Ti+1],(8) y(T) = a_{0,i} + a_{1,i}(T-T_i) + a_{2,i}(T-T_i)^2 + a_{3,i}(T-T_i)^3, \quad T \in [T_i, T_{i+1}], \tag{8}

for a set of constants {(a0,i,a1,i,a2,i,a3,i):i=1,,N1}\{(a_{0,i}, a_{1,i}, a_{2,i}, a_{3,i}) : i = 1,\ldots,N-1 \} to be determined from the values of y(Ti)y(T_i), y(Ti)y'(T_i), y(Ti+1)y(T_{i+1}) and y(Ti+1)y '(T_{i+1}) observed in the market.

To derive the values of the constants a0,i,a1,i,a2,i,a3,ia_{0,i}, a_{1,i}, a_{2,i}, a_{3,i}, it is easier to introduce the scaling constant hi:=Ti+1Tih_i := T_{i+1} -T_i and write

di(T):=TTihi,bj,i:=aj,ihij,j=0,1,2,3. \begin{aligned} d_i(T) & := \frac{T-T_i}{h_i}, \\ b_{j,i} & := a_{j, i} h_i^j, \quad j = 0,1,2,3. \end{aligned}

Then equation (8) becomes

y(T)=b0,i+b1,idi(T)+b2,idi(T)2+b3,idi(T)3=Di(T)Bi,T[Ti,Ti+1],(9) \begin{aligned} y(T) & = b_{0, i} + b_{1,i} d_i(T) + b_{2,i} d_i(T)^2 + b_{3,i}d_i(T)^3 \tag{9} \\ & = D_i(T)^\intercal B_i, \quad T \in [T_i, T_{i+1}], \end{aligned}

where

Di(T):=(1,di(T),di(T)2,di(T)3),Bi:=(b0,i,b1,i,b2,i,b3,i). \begin{aligned} D_i(T) & := (1, d_i(T), d_i(T)^2, d_i(T)^3)^\intercal, \\ B_i & := (b_{0,i}, b_{1,i}, b_{2,i}, b_{3,i})^\intercal. \end{aligned}

The goal is thus to find the vector BiB_i as a function of yi,yi,yi+1,yi+1y_i, y_i', y_{i+1}, y_{i+1}', the observed values of y(Ti)y(T_i), y(Ti)y'(T_i), y(Ti+1)y(T_{i+1}) and y(Ti+1)y'(T_{i+1}). As there are four unknowns to be found, we must provide four equations based on these values to uniquely determine the bj,ib_{j,i}. In this case, we can utilise the four conditions that we have imposed on our scheme a priori. These are the facts that y()y(\cdot) and y()y'(\cdot) are continuous, and that y(Ti)yiy(T_{i}) \equiv y_{i}, y(Ti)yiy'(T_{i}) \equiv y_{i}'.

Upon differentiating equation (8), we find that

y(T)=b1,ihi+2b2,ihidi(T)+3b3,ihidi(T)2,T[Ti,Ti+1], y'(T) = \frac{b_{1,i}}{h_i} + 2\frac{b_{2,i}}{h_i} d_i(T) + 3\frac{b_{3,i}}{h_i}d_i(T)^2, \quad T \in [T_i, T_{i+1}],

or equivalently

hiy(T)=b1,i+2b2,idi(T)+3b3,idi(T)2,T[Ti,Ti+1].(10) h_i y'(T) = b_{1,i} + 2 b_{2,i} d_i(T) + 3 b_{3,i} d_i(T)^2, \quad T \in [T_i, T_{i+1}] \tag{10}.

Now, utilising the four conditions stated above in equations (9) and (10) values to equations gives rise to the four equations

b0,i=yi,b1,i=yihi,b0,i+b1,i+b2,i+b3,i=yi+1,b1,i+2b2,i+3b3,i=yi+1hi. \begin{aligned} b_{0,i} & = y_i, \\ b_{1,i} & = y_i' h_i, \\ b_{0,i} + b_{1,i} + b_{2,i} + b_{3,i} & = y_{i+1}, \\ b_{1,i} + 2 b_{2,i} + 3 b_{3,i} & = y_{i+1}' h_i. \end{aligned}

In matrix form, this set of linear equations can be written as

Yi=Mi1Bi,(11) Y_i = M^{-1}_i B_i, \tag{11}

where

Yi:=(yi,yihi,yi+1,yi+1hi) Y_i := (y_i, y_i' h_i, y_{i+1}, y_{i+1}' h_i)^\intercal

and

Mi:=(1000010011110123)1. M_{i} := \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 \\ 0 & 1 & 2 & 3 \end{array} \right)^{-1}.

It is simple to show that the inverse of the above matrix is given by

Mi:=(1000010032312121). M_i := \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -3 & -2 & 3 & -1 \\ 2 & 1 & -2 & 1 \end{array} \right).

By rearranging equation (11) and substituting into equation (9), we thus find that an arbitrary point y(T)y(T), T[Ti,Ti+1]T \in [T_i, T_{i+1}] is given by

y(T)=Di(T)MiYi.(12) y(T) = D_i(T)^\intercal M_i Y_i. \tag{12}

A clear drawback of the scheme given above is the need to directly specify the derivatives yiy_{i}', values that are not directly observable. One popular approach to circumventing this issue is the Catmull-Rom spline scheme, where the derivative yiy_i' is approximated through the finite-difference approximation

yi:=yi+1yi1Ti+1Ti1,i=1,,N1. y_i' := \frac{y_{i+1} - y_{i-1}}{T_{i+1} - T_{i-1}}, \quad i = 1,\ldots,N-1.

At the endpoints y1y_1 and yNy_{N}, forwards and backwards differences are utilised instead. Notice that

Ti+1Ti1=(Ti+1Ti)+(TiTi1)=hi+hi1, \begin{aligned} T_{i+1} - T_{i-1} &= (T_{i+1} - T_i) + (T_i - T_{i-1}) \\ &= h_i + h_{i-1}, \end{aligned}

so that

yi=yi+1yi1hi+hi1,i=1,,N1,y0=y1y0h0,yN=yNyN1hN1,(13) \begin{aligned} y_i' & = \frac{y_{i+1} - y_{i-1}}{h_i + h_{i-1}}, \quad i = 1,\ldots,N-1, \tag{13} \\ y_0' & = \frac{y_1 - y_0}{h_0}, \\ y_N' & = \frac{y_N - y_{N-1}}{h_{N-1}}, \end{aligned}

under the Catmull-Rom scheme. Next, introduce the constants

αi:=hihi+hi1,βi:=hihi+1+hi. \begin{aligned} \alpha_i & := \frac{h_i}{h_i + h_{i-1}}, \\ \beta_i & := \frac{h_i}{h_{i+1} + h_i}. \end{aligned}

By substituting the approximation (13) into equation (12) and bringing the terms into the matrix MM gives rise to a new, derivative-free form

Bi=MiYi=(1000010032312121)(yi(yi+1yi1)αiyi+1(yi+2yi)βi)=(0100αi0αi02αi(βi3)(32αi)βiαi(2βi)(αi2)βi)(yi1yiyi+1yi+2)=AiY^ii=1,,N2. \begin{aligned} B_i & = M_i Y_i \\ & = \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -3 & -2 & 3 & -1 \\ 2 & 1 & -2 & 1 \end{array} \right) \left( \begin{array}{c} y_i \\ (y_{i+1} - y_{i-1}) \alpha_i \\ y_{i+1} \\ (y_{i+2} - y_i) \beta_i \end{array} \right) \\ & = \left( \begin{array}{cccc} 0 & 1 & 0 & 0 \\ -\alpha_i & 0 & \alpha_i & 0 \\ 2\alpha_i & (\beta_i - 3) & (3-2\alpha_i) & -\beta_i \\ -\alpha_i & (2-\beta_i) & (\alpha_i - 2) & \beta_i \end{array} \right) \left( \begin{array}{c} y_{i-1} \\ y_i \\ y_{i+1} \\ y_{i+2} \end{array} \right) \\ & = A_i \hat{Y}_i \quad i = 1,\ldots,N-2. \end{aligned}

where

Ai:=(0100αi0αi02αi(βi3)(32αi)βiαi(2βi)(αi2)βi),Y^i:=(yi1yiyi+1yi+2) \begin{aligned} A_i := \left( \begin{array}{cccc} 0 & 1 & 0 & 0 \\ -\alpha_i & 0 & \alpha_i & 0 \\ 2\alpha_i & (\beta_i - 3) & (3-2\alpha_i) & -\beta_i \\ -\alpha_i & (2-\beta_i) & (\alpha_i - 2) & \beta_i \end{array} \right), \quad \hat{Y}_i := \left( \begin{array}{c} y_{i-1} \\ y_i \\ y_{i+1} \\ y_{i+2} \end{array} \right) \end{aligned}

At the boundaries (i=1,N1i = 1, N-1) we find that

A0=(010001100(β01)1β00(1β0)1β0),AN1=(0100αN10αN102αN12(22αN1)0αN11(αN11)0). \begin{aligned} A_0 & = \left( \begin{array}{cccc} 0 & 1 & 0 & 0 \\ 0 & -1 & 1 & 0 \\ 0 & (\beta_0 - 1) & 1 & -\beta_0 \\ 0 & (1-\beta_0) & -1 & \beta_0 \end{array} \right), \\ A_{N-1} & = \left( \begin{array}{cccc} 0 & 1 & 0 & 0 \\ -\alpha_{N-1} & 0 & \alpha_{N-1} & 0 \\ 2\alpha_{N-1} & -2 & (2-2\alpha_{N-1}) & 0 \\ -\alpha_{N-1} & 1 & (\alpha_{N-1} - 1) & 0 \end{array} \right). \end{aligned}

The Catmull-Rom scheme appears to depend on the two ghost points y0y_0 and yN+1y_{N+1}, however the matrices A1A_1 and AN1A_{N-1} express no true dependence on these values. As in the previous schemes, the Catmull-Rom scheme specifies the curve between y1y_1 and yNy_N. To extend the curve to [0,T1)[0, T_1), a further extrapolation condition must be provided. Common choices are y(T)=y1y(T) = y_1 for T[0,T1)T \in [0, T_1) as before, or the slope condition

y1y0h0=y2y1h1, \frac{y_1 - y_0}{h_0} = \frac{y_2 - y_1}{h_1},

i.e.

y0=y1h0h1(y2y1). y_0 = y_1 - \frac{h_0}{h_1}(y_2 - y_1).

To fit the yield curve to the market under the Catmull-Rom scheme, notice that the price of the security ViV_i depends on y1,,yi+1y_1,\ldots,y_{i+1}, as all the intermediate cash-flows are given as some function of these yields. Hence, the pricing equations take the diagonal form

V1=F1(y1,y2),V2=F2(y1,y2,y3),VN1=FN1(y1,,yN),VN=FN(y1,,yN). \begin{aligned} V_1 & = F_1(y_1, y_2), \\ V_2 & = F_2(y_1, y_2, y_3), \\ & \vdots \\ V_{N-1} & = F_{N-1}(y_1,\ldots, y_N), \\ V_N & = F_N(y_1,\ldots,y_N). \end{aligned}

Unlike under the standard bootstrapping procedure, security ViV_i has dependence on the yield yi+1y_{i+1}. This necessitates the use of a slight modification of the standard bootstrap solving algorithm. The steps are as follows:

Let yi(0)y_i^{(0)} be given by some other scheme (such as a bootstrapping scheme as seen earlier) and let yi(k)y_i^{(k)} be the value for yiy_i found in the kkth iteration.

  1. Let yj(k)y_j^{(k)}, j=1,,i1j=1,\ldots,i-1 and yi+1(k1)y_{i+1}^{(k-1)} be known.
  2. Make a guess for yi(k)y_i^{(k)} using some root-finding scheme.
  3. Compute Vi=Fi(y1(k),,yi(k),yi+1(k1))V_i = F_i(y_1^{(k)},\ldots,y_i^{(k)}, y_{i+1}^{(k-1)}).
  4. If Vi=VmktV_i = V_{\text{mkt}} continue, otherwise repeat step 2.
  5. If i<Ni < N set i=i+1i = i+1 and repeat step 1.

Upon a single iteration, the algorithm gives y1(k),,yN(k)y_1^{(k)}, \ldots, y_N^{(k)}. Iterating over kk, we repeat the above steps until the RMSE is sufficiently small, i.e. we set an error tolerance ϵ\epsilon and stop once

1Ni=1N(yi(k)yi(k1))2<ϵ2. \frac{1}{N}\sum_{i=1}^N (y_i^{(k)} - y_i^{(k-1)})^2 < \epsilon^2.

The graph above shows the Catmull-Rom scheme applied to the swap data in Table 1. Notice that the forward curve is now continuous, though not differentiable. This leads us to the next type of yield curve construction scheme - twice differentiable cubic splines.

C2C^2 yield curves: twice differentiable cubic splines

Given the problematic forward curves produced by the previous method, one remedy is to stay within the realms of cubic splines but to insist upon twice differentiability on [T1,TN][T_1, T_N]. In the cubic spline setting, this is equivalent to assuming piecewise linear second derivatives on each interval [Ti,Ti+1][T_i, T_{i+1}] satisfying

y(T)=(Ti+1TTi+1Ti)yi+(TTiTi+1Ti)yi+1,T[Ti,Ti+1], y''(T) = \left(\frac{T_{i+1} - T}{T_{i+1} - T_i}\right)y_i'' + \left(\frac{T - T_i}{T_{i+1} - T_i}\right)y_{i+1}'', \quad T \in [T_i, T_{i+1}],

where yi:=y(Ti)y_i'' := y''(T_i). By integrating this equation twice on the interval [Ti,Ti+1][T_i, T_{i+1}], using the same notation for hih_i as before, and enforcing that y(Ti)=yiy(T_i) = y_i we find that

y(T)=(Ti+1T)36hiyi+(TTi)36hiyi+1+(Ti+1T)(yihihi6yi)+(TTi)(yi+1hihi6yi+1),T[Ti,Ti+1].(14) \begin{aligned} y(T) & = \frac{(T_{i+1} - T)^3}{6 h_i} y_i'' + \frac{(T - T_{i})^3}{6 h_i} y_{i+1}'' + (T_{i+1} - T)\left(\frac{y_i}{h_i} - \frac{h_i}{6} y_i'' \right) \\ & \quad\quad + (T - T_i)\left(\frac{y_{i+1}}{h_i} - \frac{h_i}{6} y_{i+1}'' \right), \quad T \in [T_i, T_{i+1}]. \tag{14} \end{aligned}

Clearly, this equation depends on the knowledge of the derivatives yiy_{i}'' at each point i=0,,Ni = 0,\ldots,N. To obtain these values, we can differentiate equation (14) and use the fact that y(T)y'(T) must be continuous across each TiT_i. Doing so gives the system of equations

hi16yi1+(hi1+hi3)yi+hi6yi+1=yi+1yihiyiyi1hi1,i=2,,N1.(15) \frac{h_{i-1}}{6}y_{i-1}'' + \left(\frac{h_{i-1} + h_i}{3} \right)y_i'' + \frac{h_i}{6}y_{i+1}'' = \frac{y_{i+1} - y_i}{h_i} - \frac{y_i - y_{i-1}}{h_{i-1}}, \quad i = 2,\ldots, N-1. \tag{15}

This system of equations is tridiagonal, so is amenable to O(N)\mathcal{O}(N) solutions such as via LU-decomposition. A final nuance is that we must provide boundary conditions for the derivatives y1y_1'' and yNy_N. A popular choice is to set y1=yN=0y_1'' = y_N'' = 0. This choice gives rise to an interpolation scheme known as natural splines.

Continuing with natural splines, we write Y:=(y2,,yN1)Y := (y_2,\ldots, y_{N-1}) and Y:=(y2,,yN1)Y'' := (y_2'', \ldots, y_{N-1}''). The system of equations (15) can then be written as

BY=CY+M,(16) BY'' = CY + M, \tag{16}

where BB and CC are (N2)×(N2)(N-2)\times(N-2) matrices with

Bi,i1=hi6,Bi,i=hi+hi+13,Bi,i+1=hi+16,Ci,i1=1hi,Ci,i=(1hi+1hi+1),Ci,i+1=1hi+1. \begin{aligned} B_{i,i-1} & = \frac{h_i}{6}, \quad B_{i,i} = \frac{h_i + h_{i+1}}{3}, \quad B_{i, i+1} = \frac{h_{i+1}}{6}, \\ C_{i, i-1} & = \frac{1}{h_i}, \quad C_{i,i} = -\left(\frac{1}{h_i} +\frac{1}{h_{i+1}}\right), \quad C_{i, i+1} = \frac{1}{h_{i+1}}. \end{aligned}

MM is a vector of length N2N-2 whose purpose is to encapsulate the boundary conditions. In the natural splines setting, we have

M=(y1h1,0,,0,yNhN1). M = \left(\frac{y_1}{h_1}, 0, \ldots, 0, \frac{y_N}{h_{N-1}} \right)^\intercal.

Notice that, from our construction, we can calculate y(T)y(T) for T[0,T1]T \in [0, T_1] via linear interpolation, by calculating the gradient y(T1)y'(T_1) through differentiating (14) and evaluating at T1T_1. Specifically, one we have calculated the yiy_i'', we can find y1y_1' as

y1=1h1(y2y1)h16(y2+2y1). y_1' = \frac{1}{h_1}(y_{2} - y_1) - \frac{h_1}{6}(y_{2}'' + 2 y_1'').

With the above in place, we have the ingredients to create a procedure to calculate the yield curve yiy_i, i=1,,Ni = 1,\ldots, N. The steps are as follows.

  1. Estimate the initial yields yi(0)y_i^{(0)}, i=1,,Ni = 1,\ldots, N using some simpler scheme such as bootstrapping and set k=0k=0.
  2. Using equation (16), calculate the second derivatives yiy_i'', i=1,,Ni=1,\ldots,N. Use these calculated values to calculate the yield curve at all required intermediary points via equation (14).
  3. Price all benchmark instruments ViV_i, i=1,,Ni = 1, \ldots, N using the calculated yield curve.
  4. Calculate the error function L(y1(k),,yN(k)):=i=1N(VimktVi)2L(y_1^{(k)},\ldots,y_N^{(k)}) := \sum_{i=1}^N (V_{i}^\text{mkt} - V_i)^2. If the error is within some predetermined threshold, stop. Else, using some form of optimisation routine, pick a new set of yields yi(k+1)y_i^{(k+1)}, i=1,,Ni = 1,\ldots, N and repeat step 2.

The above graph shows the twice differentiable cubic splines scheme using natural splines applied to the data in Table 1 using Gauss-Newton iterations to minimise the error in the benchmark set pricing. Notice that forward curve is now a continuous function - a clear improvement on the previous schemes.

While the natural splines scheme gives rise to a visually appealing forward curve, it still has clear drawbacks. Most notably, twice-differentiable cubic splines often give rise to oscillatory behaviour and can lead to non-local behaviour when benchmark prices are perturbed. This can be explained loosely by the fact that, while the previous schemes use only neighbouring yields when finding an interpolated yield from the constructed curve, twice-differentiable cubic splines require a full (N2)×(N2)(N-2)\times(N-2) matrix system to be solved, which leads to all yields in the constructed curve being incorporated into calculating interpolated yields off of the curve.

To see this effect in practice, we perturb the 10 year benchmark swap rate in Table 1 by 1bp and plot the changes (deltas) in the constructed forward curves for the natural spline scheme vs the same bump in the piecewise flat forward curve scheme.

Notice that in the flat forward scheme, the changes are localised to the 10 year point and the two neighbouring points (7 years and 12 years), whereas the changes in the natural spline scheme are propagated across the whole curve in an oscillatory manner.

Non-Parametric Yield Curve Fitting

The above framework is satisfactory when working with a well structured set of benchmark securities, such as a liquid staggered-maturity deposits, futures, and swaps as assembled by most banks for Libor yield construction purposes. In some situations, however, such as when constructing a corporate yield curve for an individual corporation, benchmark securities may be far more illiquid and less regular in their cash-flow structures. In this case, different techniques based on non-parametric optimisation may be more suitable. In this section, we will say a few words on one such technique.

Norm specification and optimisation

When the benchmark set is noisy, a direct solution to equation (4) may be unstable or may not even exist. To overcome this challenge, we may relax our requirement to solve equation (4) to just ensuring the error

E:=VCP, \mathcal{E} := V - CP,

is minimised in a penalised least-squares norm.

Specifically, we define the function space A:=C2([t1,tM])\mathcal{A} := C^2([t_1, t_M]), i.e. A\mathcal{A} is the set of all twice continuously-differentiable functions f:[t1,tM]Rf : [t_1, t_M] \rightarrow \mathbb{R}. Furthermore, we define the diagonal weighting vector WRN×NW \in \mathbb{R}^{N \times N}. Our goal is then to find

y^:=argminyAI(y),(16) \hat{y} := \text{argmin}_{y \in \mathcal{A}} \mathcal{I}(y), \tag{16}

where

I(y):=1N(VCP(y))W2(VCP(y))+λt1tM(y(t)2+σ2y(t)2)dt,(17) \mathcal{I}(y) := \frac{1}{N}\left(V - C P(y) \right)^\intercal W^2 \left( V - CP(y) \right) + \lambda \int_{t_1}^{t_M} \left( y''(t)^2 + \sigma^2 y'(t)^2 \right) \text{d} t, \tag{17}

where λ,σ>0\lambda, \sigma > 0 are constants.

Clearly, equation (16) consists of three distinct terms. These terms are

  1. An outright goodness-of-fit term
    1N(VCP(y))W2(VCP(y)), \frac{1}{N}\left(V - C P(y) \right)^\intercal W^2 \left( V - CP(y) \right),
    with weightings Wi,iW_{i,i} allowing the user to apply more importance to particular securities in the benchmark set, or s somehow transform the securities from raw, dollar amounts, to more comparable quantities such as security specific yields.
  2. A weighted smoothness term
    λt1tMy(t)2dt, \lambda \int_{t_1}^{t_M} y''(t)^2 \text{d} t,
    which penalises kinks and discontinuities in the constructed curve y(t)y(t).
  3. A weighted curve length term
    λσ2t1tMy(t)2dt, \lambda \sigma^2 \int_{t_1}^{t_M} y'(t)^2 \text{d} t,
    which penalises oscillations and excess convexity/concavity.

Theory dictates that the curve satisfying equation is a form of natural cubic spline with knots at the cash-flow dates t1,,tMt_1,\ldots,t_M. Hence, in practice, we can solve equation (16) by making an initial guess for the values y(tj)y(t_j), j=1,,tMj=1,\ldots,t_M and then use some optimisation routine to find the values y^(tj)\hat{y}(t_j), j=1,,Mj =1,\ldots,M that minimise (17).

© 2022 Will Douglas, All Rights Reserved.