Price and Duration of Floating Rate Note using R
[This article was first published on K & L Fintech Modeling, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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. Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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.
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 (\(C_{reset}\)) is as follows.
ZERO pricing\[\begin{align} P_{zero}^{FRN} = &D_{0,1}C_{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}C_{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}C_{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+C_{reset}) \end{align}\] \(P_{zero}^{FRN}\) has a cashflow of \(1+C_{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.
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+C_{reset}) \end{align}\] \(P_{zero}^{FRN}\) has a cashflow of \(1+C_{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 a forward rate 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, \(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 reset dates.
R code
Using the following R code, let’s understand the price pattern of FRN.
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 ALM, Financial Econometrics & Derivatives # ML/DL using R, Python, Tensorflow by Sang-Heon Lee # # https://kiandlee.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/k # 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).
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.
To leave a comment for the author, please follow the link and comment on their blog: K & L Fintech Modeling.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.