Skip to content
All library documents

How Discount Curves and Credit Spreads Affect Floating Rate Note Pricing

Article Quant Q&A · Author: confucius_is_confused

Summary

This note examines when a floating rate note (FRN) prices at par and how its rate exposure depends on the relation between its coupon index and discount curve. With matching forecast and discount curves, the floating coupons telescope against the discounted principal, leaving par value for a zero-spread note. Adding a fixed spread produces extra discounted cash flows, creating price sensitivity similar to a fixed annuity.

A calibrated SOFR curve example illustrates par pricing for a zero-spread note and a price above par for a positive-spread note; the spread exposure is compared with the risk of a fixed annuity. The discussion says that using different forecast and discount curves introduces basis effects. It also cautions that OIS discounting is not universally appropriate: credit FRNs may require issuer-specific credit discount curves to reflect their risk. The example is illustrative, and its credit-curve price is not exactly par because of curve-shift and compounding conventions.

Key ideas

  • A zero-spread FRN can price at par when its floating coupon index matches the discount curve.
  • A positive coupon spread adds discounted cash flows and creates rate sensitivity similar to a fixed annuity.
  • Using different forecast and discount curves can introduce basis-related pricing and risk effects.
  • Credit FRNs may require issuer-specific credit discounting rather than an OIS curve alone.

Tags

Full text
# FRN are more complex than we think


# 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,

## Answer by Attack68 (score 2, accepted)

https://quant.stackexchange.com/a/80494

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
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.