[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.

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.

 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 #========================================================## 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 graphsrm(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”)    Colored by Color Scripter 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.

# Never miss an update! Subscribe to R-bloggers to receive e-mails with the latest R posts.(You will not see this message again.)

Click here to close (This popup will not appear again)