Duration and Risk
Nov
18
Written by:
Charles Flock
11/18/2008 7:33 PM
Duration is one of those ubiquitous financial terms that is well defined but not well understood.
Duration is one of those ubiquitous financial terms that is well defined but not well understood. You can find numerous definitions on the web. Investopedia defines duration as:
the measure of the price sensitivity of a fixed-income security to an interest rate change of 100 basis points. Calculation is based on the weighted average of the present values for all cash flows.
In the EXCEL® documentation, duration is defined as:
the weighted average of the present value of the cash flows and is used as a measure of a bond price's response to changes in yield.
That makes it clear, right?
I am not brave enough to offer my own definition of duration (or of its cousin, modified duration), but I am going to attempt to explain what it means and how it is calculated.
The concept of duration was developed by Frederick R. Macaulay in 1938, which is why it is often referred to as Macaulay duration. Macaulay defined duration as “the total weighted average time for recovery of the payments and principal in relation to the current price of the bond.” All other definitions of duration seem to be modifications or explanations of this definition. As a result, they all perpetuate the same confusion; when Macaulay speaks of the market price he is referring to the dirty price of the bond (the price plus the accrued interest). For those of you have read Calculating the Price of a bond (without using the PRICE function), you know that the dirty price of the bond is the present value (PV) of the cash flows.
The calculation of bond duration was a time-consuming task until the development of electronic calculators and, later, computer applications and systems. Now the calculation of duration can be done almost instantaneously. Duration remains an important calculation as it tells us some things about the interest rate sensitivity of a bond, or of a portfolio of bonds. When we speak of interest rate sensitivity we are talking about how much (how sensitive) the price of a bond is to a change in interest rates.
Let’s say there is a bond with the following characteristics:
Settlement
|
4/30/2008
|
Maturity
|
10/31/2013
|
Rate
|
0.05
|
Yield
|
0.04
|
Redemption
|
100
|
Frequency
|
2
|
Basis
|
0
|
If we enter the following T-SQL statement
SELECT wct.DURATION('4/30/2008'
,'10/31/2013'
,.05
,.04
,2
,0)
It returns this result
----------------------
4.89378051863272
(1 row(s) affected)
Meaning, that it takes 4.894 years to recover the true cost of the bond. Let’s look at how that amount was calculated.
Coupon No.
|
Date
|
Cash Flow
|
Discount Factor
|
Discounted Cash Flow
|
Duration
|
1
|
10/31/2008
|
2.5
|
0.980392157
|
2.450980392
|
2.450980392
|
2
|
4/30/2009
|
2.5
|
0.961168781
|
2.402921953
|
4.805843906
|
3
|
10/31/2009
|
2.5
|
0.942322335
|
2.355805836
|
7.067417509
|
4
|
4/30/2010
|
2.5
|
0.923845426
|
2.309613565
|
9.23845426
|
5
|
10/31/2010
|
2.5
|
0.90573081
|
2.264327025
|
11.32163512
|
6
|
4/30/2011
|
2.5
|
0.887971382
|
2.219928455
|
13.31957073
|
7
|
10/31/2011
|
2.5
|
0.870560179
|
2.176400447
|
15.23480313
|
8
|
4/30/2012
|
2.5
|
0.853490371
|
2.133725928
|
17.06980742
|
9
|
10/31/2012
|
2.5
|
0.836755266
|
2.091888165
|
18.82699348
|
10
|
4/30/2013
|
2.5
|
0.8203483
|
2.05087075
|
20.5087075
|
11
|
10/31/2013
|
2.5
|
0.804263039
|
2.010657598
|
22.11723358
|
11
|
10/31/2013
|
100
|
0.804263039
|
80.42630391
|
884.689343
|
|
|
|
Total
|
104.893424
|
1026.65079
|
|
|
|
Duration/Total
|
|
9.787561037
|
|
|
|
(Duration/Total)/freq
|
|
4.893780519
|
Which might be a little easier to understand in this format.
Coupon No.
|
Date
|
Cash Flow
|
Discount Factor
|
Discounted Cash Flow
|
Duration
|
1
|
10/31/2008
|
2.5
|
1.02^-1
|
2.5 *(1.02^-1)
|
1*2.5 *(1.02^-1)
|
2
|
4/30/2009
|
2.5
|
1.02^-2
|
2.5 *(1.02^-2)
|
2*2.5 *(1.02^-2)
|
3
|
10/31/2009
|
2.5
|
1.02^-3
|
2.5 *(1.02^-3)
|
3*2.5 *(1.02^-3)
|
4
|
4/30/2010
|
2.5
|
1.02^-4
|
2.5 *(1.02^-4)
|
4*2.5 *(1.02^-4)
|
5
|
10/31/2010
|
2.5
|
1.02^-5
|
2.5 *(1.02^-5)
|
5*2.5 *(1.02^-5)
|
6
|
4/30/2011
|
2.5
|
1.02^-6
|
2.5 *(1.02^-6)
|
6*2.5 *(1.02^-6)
|
7
|
10/31/2011
|
2.5
|
1.02^-7
|
2.5 *(1.02^-7)
|
7*2.5 *(1.02^-7)
|
8
|
4/30/2012
|
2.5
|
1.02^-8
|
2.5 *(1.02^-8)
|
8*2.5 *(1.02^-8)
|
9
|
10/31/2012
|
2.5
|
1.02^-9
|
2.5 *(1.02^-9)
|
9*2.5 *(1.02^-9)
|
10
|
4/30/2013
|
2.5
|
1.02^-10
|
2.5 *(1.02^-10)
|
10*2.5 *(1.02^-10)
|
11
|
10/31/2013
|
2.5
|
1.02^-11
|
2.5 *(1.02^-11)
|
11*2.5 *(1.02^-11)
|
11
|
10/31/2013
|
100
|
1.02^-11
|
100 *(1.02^-11)
|
11*100 *(1.02^-11)
|
|
|
|
|
104.893424
|
1026.65079
|
|
|
|
|
|
1026.65079/104.893424
|
|
|
|
|
|
(1026.65079/104.893424)/2
|
The discount factor is 1 + yield/frequency raised to the negative coupon number, since we are doing multiplication. This is arithmetically the same as 1 + yield/frequency raised to coupon number and dividing the cash flow by the result. The discounted cash flow is the discount factor multiplied by the cash flow amount. The duration is the cash flow amount multiplied by the coupon number multiplied by the discount factor.
Total is the sum of the discounted cash flows (104.893424), which is the dirty price of the bond. Since we are doing this calculation on a coupon date, the dirty price and the clean price (the price without the accrued interest) are the same, as there is no accrued interest.
In this table, we have also summed up the duration column (1026.65079). We take this result and divide it by the price (1026.65079/104.893424) giving us 9.787561037, which is the sum of the duration column divided by the sum of discounted cash flow column.
We need to make one final adjustment, since duration is expressed in years, and we did this calculation in half-years (because the bond frequency was 2). 9.787561037/2 = 4.893780519. This is the result that was returned from out SELECT statement.
I think that this is pretty good fundamental explanation of the mechanics of the duration calculation, but you could have found similar explanations elsewhere. It gets us going in the right direction, but as with most bond examples, it never really considers what happens when the settlement date is not a coupon date. The fact of the matter is, that if you took the above calculations and put them into a spreadsheet, it would be very hard (by which I mean, I couldn’t do it) to calculate the duration of a bond settling between coupon dates.
So, I want to change the table a little bit and demonstrate how to calculate the duration for any settlement date:
Coupon No.
|
Date
|
Cash Flow
|
exp
|
disc factor
|
discounted cash flow
|
duration
|
1
|
10/31/2008
|
2.5
|
1
|
0.980392157
|
2.450980392
|
2.450980392
|
2
|
4/30/2009
|
2.5
|
2
|
0.961168781
|
2.402921953
|
4.805843906
|
3
|
10/31/2009
|
2.5
|
3
|
0.942322335
|
2.355805836
|
7.067417509
|
4
|
4/30/2010
|
2.5
|
4
|
0.923845426
|
2.309613565
|
9.23845426
|
5
|
10/31/2010
|
2.5
|
5
|
0.90573081
|
2.264327025
|
11.32163512
|
6
|
4/30/2011
|
2.5
|
6
|
0.887971382
|
2.219928455
|
13.31957073
|
7
|
10/31/2011
|
2.5
|
7
|
0.870560179
|
2.176400447
|
15.23480313
|
8
|
4/30/2012
|
2.5
|
8
|
0.853490371
|
2.133725928
|
17.06980742
|
9
|
10/31/2012
|
2.5
|
9
|
0.836755266
|
2.091888165
|
18.82699348
|
10
|
4/30/2013
|
2.5
|
10
|
0.8203483
|
2.05087075
|
20.5087075
|
11
|
10/31/2013
|
2.5
|
11
|
0.804263039
|
2.010657598
|
22.11723358
|
11
|
10/31/2013
|
100
|
11
|
0.804263039
|
80.42630391
|
884.689343
|
Total
|
|
|
|
|
104.893424
|
1026.65079
|
Duration/Price/2
|
|
|
|
|
|
4.893780519
|
Basically, I have introduced a new column, exp, which is the exponent that is used in the calculation of the discount factor. When the settlement date is a coupon date, the exponent is the coupon number. We can then think of the duration as the sum of (exponent * discount factor * cash flow).
Let’s move the settlement date of the bond forward one. Again, we can calculate this directly as:
SELECT wct.DURATION('5/1/2008'
,'10/31/2013'
,.05
,.04
,2
,0)
which returns the following result:
----------------------
4.89100274085494
(1 row(s) affected)
This table summarizes the mechanics of that calculation:
Coupon No.
|
Date
|
Cash Flow
|
exp
|
disc factor
|
discounted cash flow
|
duration
|
0
|
10/31/2008
|
2.5
|
0.994444444
|
0.98050002
|
2.451250051
|
2.437631995
|
1
|
4/30/2009
|
2.5
|
1.994444444
|
0.96127453
|
2.403186324
|
4.793021613
|
2
|
10/31/2009
|
2.5
|
2.994444444
|
0.942426009
|
2.356065024
|
7.055105821
|
3
|
4/30/2010
|
2.5
|
3.994444444
|
0.923947068
|
2.30986767
|
9.226638083
|
4
|
10/31/2010
|
2.5
|
4.994444444
|
0.905830459
|
2.264576147
|
11.31029976
|
5
|
4/30/2011
|
2.5
|
5.994444444
|
0.888069077
|
2.220172693
|
13.30870187
|
6
|
10/31/2011
|
2.5
|
6.994444444
|
0.870655958
|
2.176639896
|
15.22438682
|
7
|
4/30/2012
|
2.5
|
7.994444444
|
0.853584273
|
2.133960682
|
17.05983012
|
8
|
10/31/2012
|
2.5
|
8.994444444
|
0.836847326
|
2.092118316
|
18.81744196
|
9
|
4/30/2013
|
2.5
|
9.994444444
|
0.820438555
|
2.051096388
|
20.4995689
|
10
|
10/31/2013
|
2.5
|
10.99444444
|
0.804351525
|
2.010878812
|
22.10849538
|
10
|
10/31/2013
|
100
|
10.99444444
|
0.804351525
|
80.43515246
|
884.3398151
|
Total
|
|
|
|
|
104.9049645
|
1026.180937
|
|
|
|
|
|
|
4.891002741
|
The first thing to take note of is that the first coupon date now has a coupon number of zero. This is because the settlement date occurs after the first date of the coupon period. We are going to pay the seller 1/180 of the coupon amount and we will earn 179/180 of the coupon amount for the period. Thus, our exponent for the first period is 179/180 (.99444444); the exponent being the coupon number plus the fraction of the number of days from settlement to next coupon divided by the number of days in the coupon period where settlement occurs. In this case it is coupon number plus 179/180. Then, all calculations are as before. The discount factor is 1 + yield/frequency raised to the minus exponent. The discounted cash flow is the cash flow amount multiplied by the discount factor. The duration is the exponent times the discount factor times the cash flow. Take the sum of the duration values (1026.180937) divided by the discounted cash flows (104.9049645). Divide that by the frequency (2) and you get 4.891002741.
Now that we have the mechanics down, what is duration calculation actually telling us? It is important to remember, that duration was a tool for approximating interest rate sensitivity prior to the electronic calculator or computer. Nevertheless, access to more sophisticated tools doesn’t necessarily translate into greater understanding (witness the current financial crisis).
So, here is our first observation. The greater the duration, the greater the sensitivity to changes interest rates. There only three things that effect duration. The coupon rate, perceived market rate of interest, and the maturity date of the bond.
Let’s create a table called BONDS and insert the following three rows into it:
CREATE TABLE [dbo].[BONDS](
[SECID] [nchar](10) NOT NULL,
[MATURITY] [datetime] NOT NULL,
[COUPON] [float] NOT NULL,
[PAR] [float] NOT NULL,
[REDEMPTION] [nchar](10) NOT NULL,
[FREQUENCY] [float] NOT NULL,
[BASIS] [nchar](10) NOT NULL,
CONSTRAINT [PK_BONDS] PRIMARY KEY CLUSTERED
(
[SECID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
INSERT INTO BONDS VALUES (1,'11/30/2009',0.05,100,100,2,0)
INSERT INTO BONDS VALUES (2,'11/30/2014',0.05,100,100,2,0)
INSERT INTO BONDS VALUES (3,'11/30/2019',0.05,100,100,2,0)
If we run the following SELECT statements, we can observe directly the impact of different yields on the bonds:
select SECID
,left(convert(datetime, MATURITY, 101), 11) as [MATURITY DATE]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.03
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 3%]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.04
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 4%]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.05
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 5%]
from BONDS
Which returns the following results:
SECID MATURITY DATE PRICE @ 3% PRICE @ 4% PRICE @ 5%
---------- ------------- ---------------------- ---------------------- ----------------------
1 Nov 30 2009 102.039956799362 101.01103015741 99.9974918057807
2 Nov 30 2014 110.979739553911 105.320328247866 99.9974918057808
3 Nov 30 2019 118.682857412222 108.855453610026 99.9974918057809
(3 row(s) affected)
If we run this query:
select SECID
,left(convert(datetime, MATURITY, 101), 11) as [MATURITY DATE]
,wct.DURATION('11/14/2008'
,MATURITY
,COUPON
,.03
,FREQUENCY
,BASIS)as DURATION
from BONDS
It returns this result:
SECID MATURITY DATE DURATION
---------- ------------- ----------------------
1 Nov 30 2009 1.00872096988949
2 Nov 30 2014 5.22962314073239
3 Nov 30 2019 8.6846360438862
correctly identifying the relative sensitivity for each of the bonds by way of the duration calculation.
The next thing that we want to look at, is the effect of the coupon rate. As a result of the duration calculation, we would expect the the higher the coupon rate, the less sensitive to interest rates, relatively speaking, we would expect the bond to be. Why is this? Because, the higher the coupon rate, the higher the price (which is in the denominator of the duration calulation) and therefore the lower the duration.
Let’s add three more bonds to our table, holding everything constant but the coupon rate:
INSERT INTO BONDS VALUES (4,'11/30/2019',0,100,100,2,0)
INSERT INTO BONDS VALUES (5,'11/30/2019',0.05,100,100,2,0)
INSERT INTO BONDS VALUES (6,'11/30/2019',0.1,100,100,2,0)
Let’s calculate the duration:
select SECID
,left(convert(datetime, MATURITY, 101), 11) as [MATURITY DATE]
,COUPON
,wct.DURATION('11/14/2008'
,MATURITY
,COUPON
,.03
,FREQUENCY
,BASIS)as DURATION
from BONDS
where SECID > 3
which returns the following result:
SECID MATURITY DATE COUPON DURATION
---------- ------------- ---------------------- ----------------------
4 Nov 30 2019 0 11.0444444444444
5 Nov 30 2019 0.05 8.6846360438862
6 Nov 30 2019 0.1 7.68524960749362
indicating that security number 4 is the most sensitive to changes in interest rates and security 6 the least. We can observe this directly by calculating the price at different yields, with the following SELECT:
select SECID
,left(convert(datetime, MATURITY, 101), 11) as [MATURITY DATE]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.03
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 3%]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.04
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 4%]
,wct.PRICE(
'11/14/2008'
,MATURITY
,COUPON
,.05
,REDEMPTION
,FREQUENCY
,BASIS
) as [PRICE @ 5%]
from BONDS
where SECID > 3
which returns the following result
SECID MATURITY DATE PRICE @ 3% PRICE @ 4% PRICE @ 5%
---------- ------------- ---------------------- ---------------------- ----------------------
4 Nov 30 2019 71.9734484088726 64.5701449789464 57.9591127928144
5 Nov 30 2019 118.682857412222 108.855453610026 99.9974918057809
6 Nov 30 2019 165.392266415571 153.140762241106 142.035870818747
It is interesting to note, that the price on Bond 6 (the least sensitive) moved more than the price on Bond 4 (the most sensitive). But the way to interpret this is that for every 100 basis point move the price on bond 4 decreased by more than 10% while the price on bond 6 decreased by more than 7%. Thus, bond 4 was more sensitive. When we talk about rate sensitivity we are really walking about the ratio of the change in price over the price. The bigger that number is the more sensitive the bond (or the portfolio) is said to be.
The final characteristic of duration that I’d like to discuss, is the impact of yields on the duration calculation. In other words, what is the effect of the change in yield on the calculation of duration holding maturity and coupon rate constant?
Since duration is a function of the present value calculation and we know that the higher the interest rate the lower the PV, we would expect the following statement to be true. As yields (interest rate) increase, duration decreases. We can test with a simple select statement using the CTE feature of SQL Server.
with cte as
(
select cast(.01 as float) as yld
,B.SECID
,left(convert(datetime, B.MATURITY, 101), 11) as [MATURITY DATE]
,B.COUPON
,wct.DURATION('11/14/2008'
,B.MATURITY
,B.COUPON
,.01
,B.FREQUENCY
,B.BASIS)as DURATION
from BONDS B
where SECID = 6
union all
select c.yld + .01
,B.SECID
,left(convert(datetime, B.MATURITY, 101), 11) as [MATURITY DATE]
,B.COUPON
,wct.DURATION('11/14/2008'
,B.MATURITY
,B.COUPON
,c.yld + .01
,B.FREQUENCY
,B.BASIS)as DURATION
from BONDS B, cte C
where B.SECID = 6 and
yld < 0.25
)
select * from cte where yld < .15
which returns the following result:
yld SECID MATURITY DATE COUPON DURATION
---------------------- ---------- ------------- ---------------------- ----------------------
0.01 6 Nov 30 2019 0.1 7.96674478355913
0.02 6 Nov 30 2019 0.1 7.82755632054471
0.03 6 Nov 30 2019 0.1 7.68524960749362
0.04 6 Nov 30 2019 0.1 7.54008076355451
0.05 6 Nov 30 2019 0.1 7.39232927480052
0.06 6 Nov 30 2019 0.1 7.24229583171958
0.07 6 Nov 30 2019 0.1 7.09029977000839
0.08 6 Nov 30 2019 0.1 6.9366761583441
0.09 6 Nov 30 2019 0.1 6.7817725885497
0.1 6 Nov 30 2019 0.1 6.62594573357822
0.11 6 Nov 30 2019 0.1 6.46955774649715
0.12 6 Nov 30 2019 0.1 6.31297257875154
0.13 6 Nov 30 2019 0.1 6.15655229816509
0.14 6 Nov 30 2019 0.1 6.00065348630859
(14 row(s) affected)
which confirms our assumption.
As you can see, duration is a useful tool for understanding, in a general way, relation of a bond or a portfolio to changes in interest rates. It is certainly easy to calculate those changes (even across hundreds or thousands of bonds) more or less instantaneously, but the duration calculation is still used, even if it’s only to understand whether or not a purchase or sale of a bond is increasing or decreasing the interest rate risk in a portfolio.