# Sonia OIS Relative Carry and Roll-Down in Excel. Has Bloomberg got it Wrong?

I have discussed the generic concepts of *Carry* and *Roll-Down* in relation to the expected cash flows of any financial instrument in my post titled Carry and Roll-Down of USD Interest Rate Swaps in Excel with Bloomberg Comparison.

The emphasis there was placed on their absolute (dollar) definition and a USD Libor interest rate swap was used as example.

The corresponding relative *Carry* and *Roll-Down* rates were also defined as ratios formed by dividing the absolute values with the forward DV01s and approximating formulas used by the industry - and Bloomberg in particular - were derived from first principles.

In this post I will focus only on the relative *Carry* and *Roll-Down* rates and assume they are defined by the mentioned approximating formulas as described in Bloomberg. I will further restrict my analysis on Overnight Index Swaps (OIS) and use an example of a 5-year GBP OIS on the Sonia overnight index, as shown in the diagram below:

It will quickly become apparent that the definitions are not precise in the case when the assumed horizon period is not an exact year multiple, Then one is forced to make further assumptions that lead to different numerical outputs. The exact calculations will be carried out in Excel using Bloomberg market data as of the 17^{th} of June 2022 and spreadsheet formulas powered by the Deriscope Add-In.

Recommended for Deriscope starters: The Overview and Quick Guide pages.

###
Relative Carry and Roll-Down Definitions for Interest Rate Swaps

In the case of interest rate swaps – of which OIS are a special case – the following links provide the definitions for the relative *Carry* **C** and *Roll-Down* **RD**, as these are used in the industry.

The definitions' starting point is the following Bloomberg screenshot:

Accordingly, the *Carry* **C** is calculated as the par swap rate from horizon date to maturity minus the par rate from swap start to maturity, in bps per annum.

Assuming today is denoted as **T₀** and the horizon date as **Tʰ**, the formal definition is:

**C = rʰ - r₀**

where:

**r₀** is the swap's fair rate as of **T₀** using the supplied yield curves, which is defined as the rate the swap's fixed leg ought to have so that its PV at **T₀** equals **0**

and

**rʰ** is the fair rate as of **T₀** of a forward swap that starts at **Tʰ**, which is defined as the rate the forward swap's fixed leg ought to have so that its PV at **T₀** equals **0**.

Similarly, **RD** is calculated as the par rate from swap start to maturity minus the par rate from start to (maturity minus horizon date), in bps per annum.

Formally:

**RD = r₀ - rˢʰ**

where:

**rˢʰ** is the fair rate as of **T₀** of a shortened swap that starts at the same time as the original swap, but matures at the earlier time **Tˢʰ**, where **Tˢʰ = Tᵐ - Δʰ**

Here **Tᵐ** is the maturity date of the original swap and **Δʰ = Tʰ - T₀** is the time interval from **T₀** to the horizon date **Tʰ**.

### Lack of Clarity in the Bloomberg's Carry Definition

The equation **C = rʰ - r₀** is well defined only when the horizon date **Tʰ** falls on a date when a swap's accrual period starts. While this is always the case with spot Libor swaps and horizon periods that are exact multiples of the Libor's tenor, it is hardly valid with spot OIS that have maturities longer than a year.

If **Tʰ** falls on a date somewhere inside some accrual period, it is not at all clear how the forward swap "*from horizon date to maturity*" is defined!

The following illustration shows the two possible definition methods discussed below for a spot 5Y OIS and the case where the horizon** Tʰ** is in 3 months from today:

A natural assumption would be that the forward swap should have cash flows that are as close as possible to those of the original spot swap that fall in the time interval after **Tʰ**. But this would lead to a "dirty" definition of *Carry*, in the sense that if **Tʰ** were even only one day before the end of an accrual period, the forward swap would have a front stub period of one day and nevertheless pay a fully accrued amount on both of its legs. This would be consistent with a "dirty" definition, but as I discussed in my earlier post, market practitioners prefer the "clean" definition, whereby the rates on the forward swap's legs start accruing from **Tʰ**, rather than before **Tʰ**.

It is therefore natural to assume that the forward swap is so constructed that its first accrual period on either its fixed or floating leg starts accruing on **Tʰ**.

While this assumption suffices for the fixed leg where the rate is given, a question remains regarding the floating leg. There the rate is not given, and is not yet clear how it should be defined if the forward swap's first period does not match one of the spot swap's periods.

I believe that the rate should be the same as that referenced by the corresponding period of the spot swap, i.e., a rate that is fixed prior to **Tʰ**. I base my preference on the economics behind the traders' interest on the notion of *Carry* which has to do with the PnL expected under a scenario of unwinding on **Tʰ** their position on the spot swap. Unwinding means taking on **Tʰ** a short position on the remaining alive portion of the original spot swap, and that short position would necessarily reference the same floating rate as that in the spot swap. Furthermore, the market does not generally publish a floating rate that starts on **Tʰ** and has a spanning period of reduced length.

In order to deal with this lack of clarity in the Bloomberg definition, Deriscope has implemented both approaches by means of a Boolean flag named *Keep Reset Dates*. If that flag is set to TRUE, the reference rate of the first floating period of the forward swap is defined to equal the corresponding rate of the initial spot swap. Otherwise, it is defined so that it is fixed on **Tʰ** and its spanning period still ends on the same date as the spanning period of the corresponding rate of the initial spot swap.

As we will see, it seems that Bloomberg follows the latter approach.

Note that in the OIS case the floating rate associated with a given period is the compounded average of the daily overnight index values observed over that period.

So, for example, Bloomberg seems to calculate the 3-month Carry of a 1-year OIS by constructing a forward OIS that starts in 3 months, has a length of 9 months and the rate on its floating leg is calculated as the average of the overnight index values observed in that 9-month period, a calculation that corresponds to *Keep Reset Dates* = FALSE.

On the other hand, setting *Keep Reset Dates* = TRUE would mean that the rate on its floating leg would be calculated as the average of the overnight index values over the whole one-year period.

As we will see below, the two methods lead to *Carry* outputs for a specific 5y OIS that differ by about 6 basis points.

### Lack of Clarity in the Bloomberg's Roll-Down Definition

The equation **RD = r₀ - rˢʰ** does not involve a forward swap since **rˢʰ** is defined as the rate of a shortened swap "*from start to (maturity minus horizon date)*", which is still a spot swap at least if the original swap were spot. At any case, the start of the shortened swap is the same as the start of the original swap and there is therefore no ambiguity on how to define the floating rate associated with its first period.

The problem here is deeper and lies with the construction of all periods,

The sentence "*from start to (maturity minus horizon date)*" only specifies the beginning and end of the swap but leaves open the question how the periods of the resulting swap should be put together.

The following illustration shows the two possible definition methods discussed below for a spot 5Y OIS and the case where the horizon** Tʰ** is in 3 months from today:

According to the meaning of the *Roll-Down* concept, the shortened swap's schedule of cash flows ought to look to an observer standing at time **T₀** the same as that of the original swap would look to an observer standing at time **Tʰ**. This could be achieved by constructing the shortened swap by time shifting the forward swap used in the *Carry* calculation to the left by the amount of **Tʰ - T₀**. This construction would lead to a shortened swap having the same back end as the original swap but a different front end, at least when **Tʰ** does not fall on the start of a period of the original swap.

An alternative, conceptually wrong but much simpler, construction would keep the original swap and only chop off enough of its tail to make sure its length is reduced by** Tʰ - T₀**. Contrary to the previous method, this one would lead to a shortened swap that may differ from the original swap only regarding its last period.

Here again Deriscope implements both approaches by means of an input parameter that may be set to either *Fwd as Spot* or *Shorten Spot,* where *Spot* indicates the original swap, which is often a spot swap but not necessarily so.

As we will see below, the two methods lead to practically same *Roll-Down* outputs for a specific 5y OIS.

### Building the Yield Curve using Market Rates as of 17 June 2022

The formula =ds(C5:D11,C13:C15) in **cell C4** returns the

handle name **&Curve.1** that uniquely identifies a corresponding Deriscope Object of Deriscope Type *Yield Curve*.

The shown OIS rates are market data read of Bloomberg as of **17 June 2022**.

### Building the 5Y spot Sonia OIS

The formula =ds(C5:D12) in **cell C4** returns the

handle name **&Spot Ois.1**, which this time refers to an object of type *OIS*.

It can be easily seen that it is defined on the **Sonia** overnight index, starts on **17 Jun 2022** and has a **5Y** tenor.

### Carry Calculation using the Method 1 corresponding to Keep Reset Dates = TRUE

The Deriscope Local Function **Carry** expects an optional parameter represented by the input key **Keep Reset Dates** shown below in the highlighted **cell C10**.

When the Boolean value in **cell D10** is set to **TRUE**, the formula =ds(C5:D12) in **cell C4** returns **0.94**. This is the relative *Carry* in basis points for the shown horizon date of **21 Sep 2022**.

It will be instructive to also calculate the *Carry* by applying the formula **C = rʰ - r₀**. For that, I would first need to construct the appropriate forward swap that starts on **21 Sep 2022**. To that end I can use the Deriscope Local Function **Change Dates**, as shown below. As usually, the meaning of the various inputs can be read off the wizard by selecting the cells containing the corresponding keys.

Before proceeding with the fair rate calculation of this forward swap, it is important to ensure the constructed swap truly represents the intended forward swap.

The cash flows can be produced by applying the Deriscope Local Function **Price** on the forward swap with its **Output** input parameter set to **CashFlows**.

Below are the produced cash flow tables for the spot and forward swap:

The highlighted cells refer to the affected dates.

The first period of the forward swap starts accruing on **21 Sep 2022**, but the corresponding floating rate references the same period as that referenced by the floating rate in the spot swap, namely from **17 Jun 2022** to **19 Jun 2023**.

This is exactly what one would expect by the setting **Keep Reset Dates = TRUE**.

Now I can calculate the fair rates of the two swaps by applying the Deriscope Local Function **Fair Rate**.

For example, below in **cell I5** is shown the formula =ds("Fair Rate",I4,"Disc Crv=",curve!$C$4) that returns the fair rate of the original spot swap.

Next comes the **cell I7** that returns the fair rate of the forward swap.

Finally, the formula =(I7-I5)*10000 in **cell I8** returns the difference of the two rates as **0.94** bps, which exactly matches the *Carry* returned directly by the Deriscope formula.

The corresponding Bloomberg values are shown in the screenshot below, although it should be noted that these values have been computed at some time after the market OIS rates were captured for the purpose of building the discounting curve. This explains why the Bloomberg spot rate does not exactly match the Deriscope spot rate.

We observe that the Bloomberg Carry is **7.50 **bp and thus higher than the Deriscope **0.94** bp by **6.56** bp.

### Carry Calculation using the Method 2 corresponding to Keep Reset Dates = FALSE

The sheet that explores this case has a similar structure to the one analyzed already so that I can skip the details. It is as follows:

Now Bloomberg is very close to Deriscope, with the difference attributed to the different timing involved in the Bloomberg carry calculation and the capture of the market rates. As already mentioned, the **0.80** bp spot rate discrepancy is attributed to this timing difference.

The proximity of the results indicates that Bloomberg applies the logic associated with **Keep Reset Dates = FALSE**.

As before, the **columns H** and **I** are used for the manual replication of the direct Deriscope result in **cell C4**. This time, the forward swap is constructed using the Deriscope Local Function **Clone** and differs from the previous forward swap in that the floating rate of its first period references an interval that starts on the horizon date of **21 Sep 2022**.

The difference between the two forward swaps is clear by inspecting their cash flows, shown below. Please pay attention to the yellow-highlighted cells.

### Roll-Down Calculation using the Method 1 corresponding to Fwd as Spot

Without further ado, below is the sheet that computes the swap's relative *Roll-Down* under the *Fwd as Spot* assumption. The difference between Deriscope and Bloomberg is only **-0.44** bp.

###
Roll-Down Calculation using the Method 2 corresponding to Shorten Spot

Below is the sheet that computes the swap's relative *Roll-Down* under the *Shorten Spot* assumption. The difference between Deriscope and Bloomberg is only **-0.51** bp.

We also observe that this method produces an almost identical result with that of the previous method. But this could be only due to the given structure of the OIS as well as the shape of the discounting yield curve.

Click on **OisCarryRollDown.xlsx** to download the spreadsheet produced with the above steps.

At https://www.deriscope.com you can find more information about Deriscope and download the Excel Add-In required to run some of the formulas in the spreadsheet.