# FRN are more complex than we think

In most books I see that Floating Rate Bond trade at par. Yet I never see a detailed proof of why this is true. When trying to go into the maths I don't find this result.

I feel like it also depends on a lot of things. What is the coupon we are getting with the FRN and what discount curve are we using?

If the coupon and the discount curve are the same then the FRN trades at par and in this case there's no duration risk. The problem is that most of the time the coupon and the discount curve are not the same right?

For example a $$1$$y floating rate note that pays compounded SOFR quaterly + spread doesn't trade at par. Let's say I use the SOFR curve to discount then:

The coupon are: $$N * \prod_{i=1}^{90}((1+SOFR_i / 360) -1 +s$$ where $$N$$ is the notional.

The discount factors are: $$\prod_{i=1}^{n*90}((1+SOFR_i / 360)$$ where $$n =1, 2, 3,4$$

Hence for each cash flow we get: $$\frac{N}{\prod_{i=1}^{(n-1)*90}(1+SOFR_i / 360)} - \frac{N}{\prod_{i=1}^{n*90}(1+SOFR_i / 360)} + \frac{N*s}{\prod_{i=1}^{n*90}(1+SOFR_i / 360)}$$

The sum is telescopic so that at the end we get:

$$N + \sum_{n=1,2,3,4} \frac{N*s}{\prod_{i=1}^{n*90}(1+SOFR_i / 360)}$$

Hence we get a fixed rate bond + the notional.

In this case the duration risk comes uniquely from the fixed spread that I add to the coupon. This is because my discount curve is the same as the floating part of my coupon.

Hence my observations are:

• A FRN that pays a floating rate with zero spread and this floating rate is the same as the discount curve then the FRN trades at par and has zero duration risk.
• A FRN that pays a floating rate with a non zero spread and this floating rate is the same as the discount curve then the FRN has a duration risk that comes only from the fixed spread.
• A FRN that pays a floating rate that is different from the discount curve used always has a duration risk. This duration is probably small and depends on the spread between the discount curve and the floating rate that you get.
• For a FRN the discount curve that should be used is the OIS curve.

My question:

Are these observation correct? Or am I completely wrong?

Many thanks,

You are 90% right.

I will prove some of your statements with a numerical library.

First we need to setup a market. I will construct a SOFR curve and calibrate it to 1y, 2y and 3y SOFR swaps rates.

# python==3.12, rateslib==1.4.0
from rateslib import *

curve = Curve(  # <- Define a curve to calibrate the discount factors
nodes={
dt(2000, 1, 1): 1.0,
dt(2001, 1, 1): 1.0,
dt(2002, 1, 1): 1.0,
dt(2003, 1, 10): 1.0,
},
id="curve",
)

solver = Solver(  # <- Solve the curve to the given swaps rates
curves=[curve],
instruments=[
IRS(dt(2000, 1, 1), "1y", spec="usd_irs", curves="curve"),
IRS(dt(2000, 1, 1), "2y", spec="usd_irs", curves="curve"),
IRS(dt(2000, 1, 1), "3y", spec="usd_irs", curves="curve"),
],
s=[3.5, 3.0, 2.75],
id="us"
)


### An FRN with zero spread, discounted at its paid index.

You suggest that this instrument should be valued at par and have no risk sensitivity. Since its flows are always forecast and discount at the same rate this is what you will get...

frn = FloatRateNote(dt(2000, 1, 1), "2y", "A", notional=-100e6, curves="curve")

frn.rate(solver=solver)
# 100.0000000

frn.delta(solver=solver)


### An FRN with some positive spread payable

Now you are discounting higher cashflows with the same discount curve. The NPV of the cashflows (i.e. the price of the bond) should be higher.

1% discounted for 2yrs is worth approx 1.9% on the NPV.

frn_spd = FloatRateNote(
dt(2000, 1, 1), "2y", "A", curves="curve", float_spread=100, notional=-100e6
)

frn_spd.rate(solver=solver)
# 101.934045

frn_spd.delta(solver=solver)


Is this amount just the delta of the fixed annuity associated with the FRN?

Yes it is. You can verify this by creating and analysing just the risk of a 100bps annuity. There is no annuity Instrument in rateslib (or many other libraries). I commonly simulate one by receiving and paying an IRS at two different rates to net the float legs.

pf = Portfolio([
IRS(dt(2000, 1, 1), "2y", spec="usd_irs", curves="curve", notional=-100e6, fixed_rate=1.0, payment_lag=0, calendar="all"),
IRS(dt(2000, 1, 1), "2y", spec="usd_irs", curves="curve", notional=100e6, fixed_rate=0.0, payment_lag=0, calendar="all")
])

pf.delta(solver=solver)  # <- the delta risk of the 100bps annuity


### FRNs forecasting and discount with different curves.

Yes you will get other small effects related to the basis/spread.

### Should the discount curve always be the OIS curve.

Absolutely not. Many credit names issue FRNs + spread at par. The reason this occurs is because of the credit risk associated with the bond. If you discount all FRNs at OIS you will vastly overprice those risky FRNs. In order to correctly price credit FRNs you need to discount the flows at a credit curve associated with the issuer.

The FRN at +100bps was shown earlier to have a price of 101.934. If we discount the flows at a credit curve of each O/N SOFR + 100 we get a price that might be better associated with that for this hypothetical issuer (the fact it is not exactly 100 is due to the shift method and compounding type differences).

credit_curve = curve.shift(100)
frn.rate(curves=[curve, credit_curve])  # [forecasting curve, discounting curve]
# 99.931956

• Thank you! super clear and helpful. To find the swap rate of an IRS swap that pays SOFR quaterly or FFER on the floating leg, we assume that the floating leg trades at par and then we just find the swap rate. But then doing so is an horribly wrong approximation to find the swap rate right? Since the floating leg will trade at par only when the floating leg is discounted at its paid index. So finding the swap rate accurately seems much harder when the floating leg doesn;t trade at par... Commented Sep 4 at 8:58
• To determine the fixed leg on a swap you just forecast and discount all of the floating leg cashflows (with or without any spread) and then find the fixed rate that when applied to the fixed leg makes the NPV of fixed leg equal to the floating leg. It is a closed form formula and is readily applied. It is not difficult to be honest.
– Attack68
Commented Sep 4 at 10:25
• but to discount all the floating leg cash flow we need to know what the cash flows will be. And we don't know since the cash flows are based on OIS. (like 3month from now idk what SOFR will be). The only way to make it simple is to discount using the same OIS so that it cancels out. Or maybe I am missing something? Commented Sep 4 at 10:50
• SOFR is forecast from the curve. Relative to the prices of swaps you build a sofr curve as we did above. The swaps prices for benchmark instruments are established in a tradable market. Gaps are filled in with a model of interpolation structures.
– Attack68
Commented Sep 4 at 14:46