Login     Register

        Contact Us     Search

Duration and Risk

Nov 18

Written by: Charles Flock
11/18/2008 7:33 PM  RssIcon

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.

Tags:
Categories:
Copyright 2008-2017 Westclintech LLC         Privacy Policy        Terms of Service