Price and Duration of Floating Rate Note using R

The price of a floating rate bond is always equal to the face value at the payment dates and the duration is the remaining time until the first next reset date. This post explains these arguments by using some heuristic derivations and R code.



Price and Duration of Floating Rate Note



Floating rate bond or note (FRN) usually refers to an instrument whose coupon is based on a short term rate (3-month T-bill, 6-month LIBOR). Variable coupon rates are fixed in advance at reset dates, which are 3- or 6-month (interest payment period) earlier. The remaining variable coupon rates for which reset dates have not yet arrived are determined by forward rates.


Fixed Rate Bond


Fixed rate bond price with unit notional amount, n maturity, coupon C, YTM y, quarterly frequency (k=4) is as follows.

YTM pricing \[\begin{align} P_{ytm} =\frac{\frac{C}{k}}{1+\frac{y}{k}} + \frac{\frac{C}{k}}{\left(1+\frac{y}{k}\right)^2} + ... +\frac{\frac{C}{k}}{\left(1+\frac{y}{k}\right)^{nk-1}} + \frac{1+\frac{C}{k}}{\left(1+\frac{y}{k}\right)^{nk}} \\ \\ \end{align}\] ZERO pricing \[\begin{align} P_{zero} =D_{0,\frac{1}{k}}\frac{C}{k} + D_{0,\frac{2}{k}}\frac{C}{k} + ... +D_{0,n-\frac{1}{k}}\frac{C}{k} + D_{0,n}\left(1+\frac{C}{k}\right) \end{align}\] Here, \(D_{0,t}\) denotes the t-maturity discount factor.


Floating Rate Note


Unlike the above fixed rate bond, a FRN can not be priced by using YTM because YTM is a traded price of fixed rate bond not FRN. In the case of FRN, zero pricing is used.

To derive a duration of FRN in a simple manner, we use an annual payment frequency to sidestep lengthy expressions but the extension to the quarterly or semi-annual frequency is straightforward.

Floating rate bond price with unit notional amount, n maturity, annual frequency (k=1), and the first coupon rate predetermined at previous reset date (\(R_{reset}\)) is as follows.

ZERO pricing \[\begin{align} P_{zero}^{FRN} = &D_{0,1}R_{reset} + D_{0,2}f_{1,2} \\ + & ... \\ + & D_{0,n-1}f_{n-2,n-1} + D_{0,n}(1+f_{n-1,n}) \\ \\ = &D_{0,1}R_{reset} + D_{0,2}\left(\frac{D_{0,1}}{D_{0,2}}-1\right) \\ + & ... \\ + & D_{0,n-1}\left(\frac{D_{0,n-2}}{D_{0,n-1}}-1\right) + D_{0,n}\left(\frac{D_{0,n-1}}{D_{0,n}}-1\right) \\ + & D_{0,n}\\ \\ = &D_{0,1}R_{reset} + (D_{0,1}-D_{0,2}) \\ + & ... \\ + & (D_{0,n-2}-D_{0,n-1}) + (D_{0,n-1}-D_{0,n}) + D_{0,n} \end{align}\] Here, \(s(0,t)\) denotes the spot rate from \(0\) to \(t\) and \(f(t_1,t_2)\) denotes the forward rate between \(t_1\) and \(t_2\).

Finally \(P_{zero}^{FRN}\) can be represented as follows.

\[\begin{align} P_{zero}^{FRN} = D_{0,1}(1+R_{reset}) \end{align}\] \(P_{zero}^{FRN}\) has a cashflow of \(1+R_{reset}\) at time 1 year because the corresponding discount factor is applied to one year. This is a pure discount bond and has a duration of 1 year which is the interest payment frequency.

If a remaining maturity of the above FRN is 4.25 year, the price of this FRN is

\[\begin{align} P_{zero}^{FRN} = D_{0,\frac{1}{4}}(1+R_{reset}) \end{align}\] \(P_{zero}^{FRN}\) has a cashflow of \(1+R_{reset}\) at time 1 quarter because the corresponding discount factor is applied to one quarter. This is also a pure discount bond and has a duration of 0.25 year.

If a remaining maturity of the above FRN is 4.0001 year after which next coupon rate is determined (i.e. the reset date is 4-year), the first coupon rate is determined by the first 1-year (interest payment period) forward rate (\(s_{0,1} = f_{0,1}\)) because at that time the next coupon is not determined yet. In this case, a price of this FRN is

\[\begin{align} P_{zero}^{FRN} = &D_{0,1}s_{0,1} + D_{0,2}f_{1,2} \\ + & ... \\ + & D_{0,n-1}f_{n-2,n-1} + D_{0,n}(1+f_{n-1,n}) \\ \\ = &D_{0,1}\left(\frac{D_{0,0}}{D_{0,1}}-1\right) + D_{0,2}\left(\frac{D_{0,1}}{D_{0,2}}-1\right) \\ + & ... \\ + & D_{0,n-1}\left(\frac{D_{0,n-2}}{D_{0,n-1}}-1\right) + D_{0,n}\left(\frac{D_{0,n-1}}{D_{0,n}}-1\right) \\ + & D_{0,n}\\ \\ = &(D_{0,0}-D_{0,1}) + (D_{0,1}-D_{0,2}) \\ + & ... \\ + & (D_{0,n-2}-D_{0,n-1}) + (D_{0,n-1}-D_{0,n}) + D_{0,n} \\ \\ = &1 \end{align}\]

In this case of a payment date, \(P_{zero}^{FRN}\) has a cashflow of \(1\) at time nearly 0 year because the corresponding discount factor is applied to nearly pricing date. We can find that this is a pure discount bond and has a duration of 0 year.

Summarizing the above all results, we can conclude that a duration of FRN has a range from 0 to interest payment period. Duration of FRN is zero right before the reset date and is an interest payment period right after the reset date and is a linearly interpolated year when pricing date is between two payment dates.


R code


Using the following R code, let's understand the price pattern of FRN. In this R code, I do not change the zero curve for a simple illustration. To find the price pattern of FRN, it is not important which zero curve is used.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#========================================================#
# Quantitative Financial Econometrics & Derivatives 
# ML/DL using R, Python, Tensorflow by Sang-Heon Lee 
#
# https://shleeai.blogspot.com
#--------------------------------------------------------#
# Generating daily 3-Year issued maturity FRN price
#========================================================#
 
graphics.off()  # clear all graphs
rm(list = ls()) # remove all files from your workspace
 
#-------------------------------------------------------
# Input
#-------------------------------------------------------
 
    # continuously compounded zero rate
    str.zero <-"month    zero
                3    0.0065946
                6    0.0068195
                9    0.0070484
                12    0.0073195
                15    0.0076309
                18    0.0079416
                21    0.0082324
                24    0.0085225
                27    0.0087675
                30    0.0090129
                33    0.0092574
                36    0.0095033"
    
    df.raw <- read.table(text = str.zero, header = TRUE)
    
    #df.raw$zero <- 0.02 # constant zero curve
 
    k <- 4  # interest payment frequency (quarterly)
 
#-------------------------------------------------------
# Calculation FRN price at all times until maturity
#-------------------------------------------------------
 
    # FRN price
    v.frn.price <- NULL
    
    # daily progress of time
    for(t in seq(0,36-1/30,1/30)) {
        
        # initialize
        df <- df.raw
 
        # remaining maturity (monthly)
        df$mat <- (df$month - t)/12
        
        # interest period
        df$tau <- df$mat
        df$tau[2:12<- df$mat[2:12- df$mat[1:11]
 
        # discount factor
        df$df  <- exp(-df$zero*df$mat)
        
        # forward rate
        df$fd  <- df$zero
        df$fd[2:12<- (1/df$tau[2:12])*(df$df[1:11]/df$df[2:12]-1)
 
 
        # reset the first coupon rate when pricing date is reset date
        # assumption of no reset lag
        
        if(t%%3 == 0) { # reset date
            
            # newly reset the reference index
            r_reset <- df$fd[min(which(df$mat>0))]
            
            # forward rates as cash flows
            df$cf <- df$fd/k
            
        } else { # not reset date
            
            # forward rates as cash flows
            df$cf <- df$fd/k
        }
        
        # set the first coupon rate
        df$cf[min(which(df$mat>0))] <- r_reset/
 
        # add nominal principal (1)
        df$cf[nrow(df)] <- 1 + df$cf[nrow(df)]
 
        # FRN price as sum of discounted variable CF
        v.frn.price <- c(v.frn.price, sum(df$df*df$cf*(df$mat > 0)))
    }
  
    print(v.frn.price)
    
    x11(width = 7.5, height = 4.5);
    plot(v.frn.price, type="l"
         xlab = "time", ylab="FRN price",
         main="FRN price as time goes by")
    
cs


The above R code draws the following zig-zag type graph of a time series of FRN prices until its maturity (3-year).

FRN price using R code


Concluding Remarks


From this post, we investigate a meaning of the FRN duration and a zig-zag pattern of the FRN price. It is interesting that the FRN price is always equal to the face value at the payment dates so that this price is periodically 1 right before resetting reference index because a bullet payment of coupon is paid at that time. \(\blacksquare\)

Refer to the following previous posts for the price, duration and convexity of a fixed rate bond.




No comments:

Post a Comment