14 minutes reading time (2743 words)

Turn-of-the-Month Effect in SOFR Curve built out of 1- & 3- Month Futures


In my previous article about building a SOFR yield curve in Excel using QuantLib and Deriscope I was confronted with an unexpected result concerning the short term – less than two years – section of the curve that exhibited a strong oscillatory behavior.

In this post I will show how to smooth out this front section of the curve and investigate the benefits drawn by incorporating the assumption of end-of-the-month jumps in the overnight rate.

Table Of Contents 

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

Get a free Deriscope activation code that enables you to run the accompanied spreadsheet!

Oscillations Caused by Mixing Different Types of Futures Contracts 

The following two charts were produced that show the continuously compounded zero rates for every calendar maturity for the next two-years based on Bloomberg COB market rates as of November 10, 2020.

The first chart was produced out of SOFR OIS rates with the 15 maturities 1W, 2W, 3W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M and 12M during the first year followed by the two OIS rates for 18M and 2Y.

The second chart was produced out of 1-month and 3-month SOFR futures prices with a total of 16 expiries ranging from December 1, 2020 to November 1, 2021 during the first year followed by the two OIS rates for 18M and 2Y. 

While the first curve's oscillations during the front 6 months could be explained away by suspected thin trading volumes in the respective OIS contracts, the second curve remained a puzzle.

My suspicion was that the bumps were caused by attempting to mix the two diverse markets of 1-month and 3-month futures. Even though both types of contracts reference the same underlying reference SOFR, their prices may still not be at synch with each other due to various market frictions that are idiosyncratic to their respective trading environments.

In order to investigate this suspicion, I decided to rebuild the curve twice using a) only 1-month futures and b) only 3-month futures, with the following results: 

Indeed, this seemed to alleviate the problem.

Since these two charts differ only on the type of futures contracts employed during the first one year, it is better to concentrate on the first-year portion only.

Below is the chart with all curves combined, restricted in the first 12 months: 

I have intentionally shown the zero rate maturity dates on the horizontal axis with the first day of each month explicitly labeled so that I can investigate a possible turn-of-the-month effect. These dates are also important because they coincide with the settlement dates of the 1-month futures contracts.

In general, the turn-of-the-month effect refers to a pattern of market prices displaying abrupt jumps on the last business day of a month. Such jumps are common on the stock market and have been also observed in various types of overnight interest rates with either positive or negative sign. They can be attributed to liquidity crunches or flushes following the rush of industry participants to meet end-of-month deadlines relating to a) actual financial obligations and b) balance sheet reporting to stakeholders or overseeing authorities.

My first observation is that the blue curve (1M futures) is consistently higher than the grey curve (3M futures), with a gap ranging from ½ to 1/6 of a basis point.

This indicates that the main source of the oscillations in the orange curve (mixed futures) is the attempt of mixing two disparate sources.

It may well be possible that the apparent disparity between the 1M and 3M futures implied curves is caused by a convexity effect embedded in the market prices of the 1M futures that remains unaccounted for by Deriscope. I am referring to the convexity effect that arises from the fact that the final settlement of the 1M futures is based on the arithmetic average of the published SOFRs rather than their compounded average.

If the 1M futures trading behavior is influenced either directly or indirectly by this convexity effect, the resulting market prices will differ from those calculated by Deriscope for any given assumption of discount factors. Reversely, the discount factors implied by matching the given market prices would be off by a certain amount that translates to the vertical gap in the two zero rate curves depicted above, whereby the grey curve corresponds to the "correct" discount factors and the blue curve to the "wrong" discount factors.

A possible solution to this problem could be a supplementary user input of convexity corrections in the spreadsheet formula that creates the yield curve out of 1M futures prices. Deriscope already allows for the specification of such convexity corrections.

In the current post I will ignore both the possible convexity effect and the orange curve and instead focus on further smoothing out the blue and grey curves.

I am curious to find out whether the observed slight remaining oscillation is caused by a turn-of-the-month effect priced in by the market. 

Implied Forward Overnight and Term Rates 

Before introducing the consideration of jumps in my curve construction, it would be smarter to abandon the zero rates chart and instead focus on a chart that is more sensitive to curve input parameters, which is not other than the chart of forward overnight rates. This holds because every other term rate equals a certain integral (compounded average) of forward overnight rates, which means that its respective chart would necessarily be smoother than the chart of forward overnight rates.

A single Deriscope formula suffices for calculating the several forward overnight rates implied by a given Yield Curve object for any set of forward maturities.

If you are not familiar with the Deriscope notions of objects and formulas, you are advised to visit my previous post on SOFR curve bootstrapping.

Below is the required formula in cell AK3.

I have greyed out the three ranges AG3:AH6, AK1 and AJ3:AJ252 that are passed as input to the Deriscope ds formula:

=ds($AG$3:$AH$6,"Object=",AK1,"Start Dates=",$AJ$3:$AJ$252,"End Dates=",$AJ$4:$AJ$253)

Note, this formula is entered in the single cell AK3, but returns a whole array of values as output, utilizing the new Excel's dynamic array feature.

The first input range AG3:AH6 contains the key-value pairs:

Function= Forward Rate

DayCount= %ACT/365F

Compounding= Continuous

Frequency= No Frequency

that define the task at hand.

The next input cell AK1 holds the handle name &Fut1M.1 of a previously created object of type Yield Curve. It tells the function Forward Rate the yield curve to be used in the calculation of the forward rates.

The next input is the key-value pair Start Dates= AJ3:AJ252 that supplies 250 dates that are interpreted as the start dates in a series of 250 forward time intervals. The 250 dates in column AJ have been produced by a different Deriscope function named Date Sequence. These are consecutive business days from today = November 10, 2020 to one year later at November 10, 2021.

Finally, the remaining input is the key-value pair End Dates= AJ4:AJ253 that supplies 250 dates that are interpreted as the corresponding end dates of the 250 forward time intervals.

The rates in column AL are produced by the same formula copied over in cell AL3. 

Below is the chart with the corresponding two curves of forward overnight rates:  


  • The "drama" evolves in a vertical range of about 2 basis points.
  • The 1M (blue) curve is distinctly bumpier than the 3M (grey) curve.
  • The observed oscillations may be caused by the current curves having been produced ignoring a possible market-expected jump pattern in the future end-of-month realizations of the SOFR index. This aspect will be explored below.
  • The economic impact of the observed variations can be relatively small in real world transactions, since such transactions generally depend on term rates rather than overnight rates.

The next chart addresses the last point by depicting the behavior of the forward 3-month forward-looking rate as a function of the start date of the underlying 3-month forward interval.

Note the expression "forward 3-month forward-looking rate" as opposed to "forward 3-month backward-looking rate". Both rates are forward in the sense they are observed today but they reference a future date T. Their difference is that the forward-looking rate – depicted below – is associated with the interest accrual period (T , T + 3M), whereas a backward-looking rate would be associated with the interest accrual period (T – 3M , T).

The forward 3-month forward-looking rate for maturity T is similar to a today-observed forward term rate – such as Libor – expected to be set at T.

Instead, the forward 3-month backward-looking rate for maturity T is similar to a today-observed forward compounded over the interval (T – 3M , T) rate expected to be set at T. 

As expected, these curves are much smoother than those of the overnight rate.

Let's see if we can improve them even more by incorporating rate jumps in the curve construction. 

Yield Curve Creation Incorporating Overnight Rate Jumps 

Deriscope supports the building of a yield curve that a) matches the market prices of a given set of instruments and b) implies forward overnight rates that display pre-defined fixed-size jumps on specific dates.

The easiest way to set up the formulas that create a yield curve incorporating jumps is to check the -Check Overnight Rate Jumps box in the wizard during the selection of the instruments that will be used as input in the screen presented when the type Yield Curve is selected in the Type Selector, as shown below, where also the -Use Futures and -Use Swaps boxes have been checked in order to have the curve generated out of futures and swaps: 

Then, clicking on the Go button would result in the wizard creating and pasting the required formulas under the currently selected spreadsheet cell.

After making a few manual adjustments, the final formula that creates the Yield Curve object is as shown below in cell A1: 


  • The input Jump Type= Transient means the jumps entered in the table affect the forward overnight rate only on the corresponding jump dates. For example, with the given jump of 0.5 bps on December 31, 2020, the forward overnight rate will be higher by 0.5 bps on December 31, 2020, but it will bounce back to its pre-jump level (approximately) on the following business day.
  • The input Calendar= %US_GOVBOND determines which dates are regarded as business days. This is important for finding out the time period over which the overnight rate experiencing the jump accrues. In the current example, this calendar entry implies that the jump of 0.5 bps on December 31, 2020 affects the overnight rate spanning the time interval from December 31, 2020 to January 4, 2021.
  • The input DayCount= %ACT/360 is needed in order to define the interest accrued by the overnight rate experiencing the jump. Note here that the rate is by default defined as being continuously compounded.
  • I can fill the table under Set= with any dates and values I want. I have decided to enter the last business day of each consecutive month because I know that these are the days when a likely turn-of-the-month effect may apply. For now, I have set all jump sizes to 0 except the one at the end of the year. I did so only in order to study the effect of the assumed jump on the implied curves, before trying to set more reasonable values.

Forwards Implied by a Yield Curve that Incorporates a Single Overnight Rate Jump of 0.5 Basis Points at Year End 

 After forcing the forward overnight rate to jump upwards by 0.5 bps on December 31, 2020, the following graph for the term structure of the implied forward overnight rate is produced.

It exhibits the jump exactly as expected.

No noticeable shift of the other forward overnight rates in relation to their earlier seen values is discerned, as any such effect is expected to be very small.

The following chart shows the term structure of the implied forward 3-month forward-looking rates.

A very small drop on both curves is observed on the dotted vertical line passing through January 1, 2021.

It is a drop rather than a hike because on each date the forward-looking 3-month rate is observed. It would have been a hike if the backward-looking rate had been depicted.

The drop is so small because the jump of 0.5 bps affects only one of the about 65 overnight rates that are compounded to form the depicted 3-month term rate. 

The following chart shows the term structure of the implied zero rates.

A small hike on both curves is observed on the dotted vertical line passing through January 1, 2021.

The jump size is more pronounced than that of the forward 3-month case because of the timing of the jump. It occurs on December 31, 2020, a date which is about half a distance away from today than the 3-month interval that underlies the forward 3-month rates. 

The earlier the jump date, the bigger its impact on the zero rate curve is.

For example, if the jump were specified to occur on the next business day from today, i.e. on November 12, 2020, the zero rate curve would exhibit a big size jump as shown below: 

Exploring a Realistic Application of SOFR Jumps in the Yield Curve Construction 

Now that we have seen what jumps are and how they may be applied, it is time to look at what extent they may or may not apply in the SOFR market.

Historical data on published daily SOFR values can be found online at https://fred.stlouisfed.org

Pulling the data over the range of the past year, I get the following chart of the daily differences of the published SOFR values, expressed in basis points: 

The huge drop on March 16, 2020 for 84 basis points is due to … corona. On that day, stock markets around the world crashed as a result of impeding widespread lockdowns and SOFR rates followed suit dropping precipitously as markets thought there will be … no tomorrow!

Apart from that - hardly predictable by non-politicians - rate drop (allow me some humor here), no discernible turn-of-the-month pattern can be observed.

Looking at the data though, I could see that there seemed to exist a positive jump one or two basis points on most of the month-end dates, but not on all of them.

I felt, it would be highly unlikely for the market to price in future SOFR turn-of-the-month jumps, given the fact such jumps are not clearly observed in the recent past data.

Nevertheless, I tried to set various jump sizes on the month-end dates with the hope of getting smoother implied forward curves, but to no avail.

For example, below are the charts produced after setting a jump of 0.5 bps on all month-end dates.

These charts indicate that the incorporation of an end-of-month flat jump fails to eliminate the humps in the forward overnight and 3-month term rate curves implied by either the 1-month (blue curve) or 3-month (grey curve) SOFR futures. 

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

Feel free to contact me if you want to share any thoughts with regard to this product or if you want to request any particular features. Contact info and social media links are available at my web site https://www.deriscope.com 

Libor Cessation: Price and Risk of existing Vanill...
How to build a SOFR Yield Curve in Excel using Qua...