Sofr Bootstrapping Modeling Methodologies and Issues (W/ Python and Excel Replicas of Bloomberg Sofr at Github)
Sofr Bootstrapping Modeling Methodologies and Issues (W/ Python and Excel Replicas of Bloomberg Sofr at Github)
Sofr Bootstrapping Modeling Methodologies and Issues (W/ Python and Excel Replicas of Bloomberg Sofr at Github)
Vilen Abramov
Xianwen Zhou
Bian Zhengye
Contents
1 SOFR instruments 2
2 What tenor? 3
4 Bootstrapping implementation 4
8 To smooth or not? 12
9 Conflicting rates? 12
1
Electronic copy available at: https://ssrn.com/abstract=3654466
Abstract
Following the 2008 financial crisis, interest rate market experienced major changes in the
ways Libor rate was treated. Since Libor is not a risk free rate, the dual curve boot-
strapping (Libor-OIS) has been introduced. The term risk premium (e.g., 3m6m Libor
basis) has been handled via newly introduced multi-curve framework. The discovery of the
Libor rate manipulations back in 2007 broke Libor’s back. Citigroup introduced Nybor
in 2008 as an alternative to Libor. Following the Libor crisis, the Alternative Reference
Rates Committee (ARRC) has been established to ”ensure a successful transition from
U.S. dollar (USD) Libor to a more robust reference rate, its recommended alternative, the
Secured Overnight Financing Rate (SOFR).” This rippled through other countries with
introductions of SONIA1 (for GBP Libor), ESTER (for Euribor), etc. Although there are
a lot of modeling similarities between Libor and SOFR rate bootstrapping, there are a
number of differences. In this paper we discuss bootstrapping methodologies along with
some modeling differences and new modeling considerations.
1 SOFR instruments
SOFR futures celebrated two-year anniversary this year. The average daily volume grew from
under 2,000 contracts back in May of 2018 to more than 60,000 contracts in February of 2020
[1]. SOFR futures contract specifications can be found on CME page here. In our formulas,
we will use rates measured in percentage points, e.g. 4% rate will be recorded as 4.00 rather
than .04. Leaving out convexity adjustments, the 1-month SOFR (SR1) and 3-month SOFR
(SR3) quotes can be represented as follows.
Nm
1 X
100 − SR1 ≈ SOF RtFi wd ,
Nm
i=1
where NQ is the number of days in a reference quarter, dti = ti+1 − ti is the the forward rate
tenor.
SOFR swaps are also used for bootstrapping as in case of Libor. SOFR swaps are traded over-
the-counter (OTC). Swap contract specifications can be found in [2]. They are consistent with
Libor swap specifications except for discounting. SOFR swaps use SOFR for both discounting
and projections, while Libor swaps use Libor for projections and OIS for discounting. It is
worth noticing that LCH is planning on the OIS-to-SOFR discounting transition starting on
October 16th of 2020. The impact of this transition on market risk modeling is discussed in [3].
1
SONIA was actually introduced in March 1997. Bank of England took control of SONIA in 2016 to support
the risk free rate transition in sterling markets.
2
Electronic copy available at: https://ssrn.com/abstract=3654466
2 What tenor?
What do SOFR futures quotes represent? In case of Eurodollar futures (EDF), the EDF quote
represents a 100 - 3-month termed forward rate.
It is well know that EDF quotes that represent 3-month rates can’t be used directly to derive
1-month rates. The tenor basis spread need to be used instead. So, can SOFR futures quotes
be used for overnight rate bootstrapping? In actuality, the SOFR futures market participants
express their beliefs about future values of the overnight rates during a certain period (1-month
or 3-month) by the means of SOFR futures quotes. They are not necessarily expressing their
beliefs about 1-month or 3-month SOFR rates. That’s why these instruments can be used for
overnight curve bootstrapping.
Q Q Q
Y Y !
360 Y dt i dt i dt i
1−SR3 = SOF RtRzd
i <t
+1 Btd
SOF Rt≤t i <t
0 ∗ +1 SOF RtFi ≥t
wd
0 ∗ +1 −1 ,
NQ 360 360 360
i=1 i=1 i=1
Btd
where SOF Rt≤t 0 denote unrealized SOFR rates that are pre-bootstrapped using 1-month
i <t
SOFR futures.
3
Electronic copy available at: https://ssrn.com/abstract=3654466
4 Bootstrapping implementation
We have implemented a simple bootstrapping methodology in Python and Excel. Both im-
plementations are freely available at GitHub. For the sake of simplicity we have not included
convexity adjustments in the code. The size of the convexity adjustments is small and, there-
fore, can be ignored without significant loss in replication accuracy. The raw method, the
so-called constant forward interpolation method, is coded in SOFR-v2.ipynb . The input
files are 1m futures data.csv , 3m futures data.csv , and rzd rates.csv . An excel version of
this code is captured in SOFR-BBG.xlsm . In the next section, we will describe this simple
bootstrapping methodology in details. We have also included a natural cubic spline imple-
mentation that is coded in Cubic Splice-SOFR-Git.py . The raw method is consistent with
Bloomberg SOFR curve with raw interpolation method.
• 1-month SOFR futures expiring prior to the expiration of the front 3M SOFR futures
• SOFR swap rates are based on the daily resets and annual payments
• SOFR forward rates are recorded in % units (e.g. 0.04% is equivalent to .0004 or 4 bps)
4
Electronic copy available at: https://ssrn.com/abstract=3654466
Data inputs In our example, we will bootstrap SOFR forward curve as of 04/30/2020. We
will be using realized SOFR rates along with prices of the instruments (such as SR1, SR3,
etc.) to bootstrap the unknown SOFR rates. To be able to use this code for a different date,
the user will need to modify the inputs accordingly.
In this paper we will use the following notation for SR1 and SR3 futures. The front SR1 and
SR3 futures will be denoted as SR1-0 and SR3-0. The other ones, will be sorted/denoted
according to their maturity dates SR3-1, SR3-2, etc.
In our case, the front SR1-0 futures expires on 04/30/2020 and is equivalent to the SOFR
spot rate. The second SR1 futures (SR1-1) expires on 5/29/2020. And this is the only SR1
futures that we will use since the front SR3-0 futures expires on 06/16/2020. There will be 6
more SR3 futures (SR3-1 through SR3-6) with SR3-6 futures maturing on 12/15/2021.
We will also use SOFR swap rates starting from 2 years through 40 years (SWP-2Y through
SWP-40Y).
where Nm represents a number of days in a contract month. Since we are using constant
forward assumption, all SOF RtFi wd rates are assumed to be the same and we obtain the
following formula.
On 04/30/2020, the SR1-0 futures expires and the last forward rate is determined. Hence, we
will simply use the spot SOFR rate without bootstrapping this info from the expiring front
SR1-0 futures. However, we use the next SR1-1 futures to bootstrap rates through May of
5
Electronic copy available at: https://ssrn.com/abstract=3654466
2020.
The spot SOFR rate 0f .04% (4bps) implies SR1-0 price of 99.98. The actual market quote
was 99.981 which leads to the SOFR spot of .029% (3bps). We will use the market spot SOFR
rate of .04%.
Q Q Q
Y Y !
360 Y dt i dt i dt i
1−SR3 = SOF RtRzd
i <t
+1 Btd
SOF Rt≤t i <t
0 +1 SOF RtFi ≥t
wd
0 +1 −1 ,
NQ 360 360 360
i=1 i=1 i=1
where NQ is the number of days in a reference quarter. Notice that dti is not necessarily
1/360 due to weekends and holidays. For example, on Friday it will be 3/360. As one can see
in the formula above, there are three types of SOFR forward rates - realized rates (that were
determined in the past ti < t) and unrealzied rates (spot rate at ti = t and future rates at
ti > t). Some of the unrealized SOFR rates have been bootstraped in the earlier steps using
spot SOFR and SR1 (at t ≤ ti < t0 ). We will use those bootstrapped values.
Starting from the second futures and on (SR1-1 through SR1-6), one does not need to deal
with the realized and pre-bootstrapped rates. Hence, their prices can be calculated using a
simpler formula.
Q !
360 Y dti
100 − SR3 = SOF RtFi wd +1 −1
NQ 360
i=1
SOF RTj−1 <ti ≤Tj represents all the bootstrapped and P forward SOFR rates within year T j
(ti ∈ (Tj−1 , Tj ]), dTj = Tj − Tj−1 . It is easy to see that Tj−1 <ti ≤Tj ti = Tj .
As before, one needs to keep track of the rates that have been bootstrapped earlier. For the
first two-year SOFR swap (SWP-2Y), all rates in year one as well as some rates from year 2
have been bootstrapped earlier. We will need to calculate those first.
6
Electronic copy available at: https://ssrn.com/abstract=3654466
A 2-year SOFR swap can be viewed as a sum of present values of the year 1 and year 2
cash flows (floating leg minus fixed leg). The year 1 value is pre-determined due to the pre-
bootstrapped rates. When we run optimizer, the unknown rate should make the value of the
year 2 equal to the negative of the year 1 value. So that the total value of the swap is equal
to zero. This is exactly what is happening in the code. The year 1 and year 2 values offset
each other.
In the following steps, we will use simplified SOFR swap pricing formula assuming no weekends.
In other words, dti = 1 and dTj = 365. We then obtain.
!
X 1 365
360 X
1 + SOF RTj−1 <ti ≤Tj −1 P (0, Tj ) = K P (0, Tj )
360 365
j j
Let’s denote floating leg cash flow corresponding to year Tj as F lt(Tj ), then the formula can
be re-written as follows.
X X
F lt(Tj )P (0, Tj ) = K P (0, Tj )
j j
Now, it is easy to see that in order to find F lt(Tj+1 ), one needs to solve the following equation.
X X
F lt(Tj )P (0, Tj ) + F lt(Tj+1 )P (0, Tj )P (Tj , Tj+1 ) = K P (0, Tj ) + KP (0, Tj )P (Tj , Tj+1 )
j j
Notice, that swap rate K will change when moving from one tenor to another.
It is worth noticing that futures implied rate EQ [F (T1 , T2 )] is different from the forward rate
F (t; T1 , T2 ) estimated at time t.
SR3 1 EQ [P (t, T1 )] 1 P (t, T1 )
1− = EQ [F (T1 , T2 )] 6= −1 = − 1 = F (t; T1 , T2 )
100 τ EQ [P (t, T2 )] τ P (t, T2 )
In other words, the forward rate is implied from the expected discount factors (under risk
neutral measure) and is different from the expected forward rate (under risk neutral measure
as well). This is due to a non-linear relationship between forward rates and discount factors.
In simple terms, this concept can be expressed using the following inequality.
1 1
EQ >
1 + τ F (T1 , T2 ) 1 + τ EQ [F (T1 , T2 )]
7
Electronic copy available at: https://ssrn.com/abstract=3654466
The SR3 convexity adjustment can be defined as follows.
The second complication is related to the fact that SR1 does not represent a 1-month SOFR
rate. It represents an average overnight rate. Therefore, the total convexity adjustment in
this case, can be viewed as a sum of overnight convexity adjustments. Let’s discuss this issues
in details.
drt = θt dt + σdWt ,
where Wt is a Wiener process.
For the sake of simplicity, we will introduce another process R̂t , such that.
P (t, T1 ) 1
ln R̂t = ln
P (t, T2 ) τ
Using definition of R̂t we get.
P (t, T1 ) 1 P (t, T1 )
d ln R̂t = d ln = d ln
P (t, T2 ) τ P (t, T2 )
Applying Ito’s formula, and using dP (t, T ) = P (t, T )(rt dt − σ(T − t)dWt ) expression we can
derive.
2
Without loss of generality we will use T1 and T2 notation to represent the start and end points of any
SOFR futures.
8
Electronic copy available at: https://ssrn.com/abstract=3654466
P (t, T1 )
d ln[R̂t ] = d ln = d ln[P (t, T1 )] − d ln[P (t, T2 )]
P (t, T2 )
(dP (t, T1 ))2 (dP (t, T2 ))2
dP (t, T1 ) dP (t, T2 ) 1
= − + − +
P (t, T1 ) P (t, T2 ) 2 P 2 (t, T1 ) P 2 (t, T2 )
= (rt dt − σ(T1 − t)dWt ) − (rt dt − σ(T2 − t)dWt )
1
+ [−(rt dt − σ(T1 − t)dWt )2 + (rt dt − σ(T2 − t)dWt )2 ]
2
1
= στ dWt + σ 2 [(T2 − t)2 − (T1 − t)2 ],
2
where τ = T2 − T1 . Notice, that P (t, T1 ) is known for t > T1 and can be viewed as a
deterministic process dP (t, T ) = P (t, T )rt dt. Therefore, the formula above simplifies to the
following form.
1
d ln[R̂t ] = σ 2 (T2 − t)2 dt + σ(T2 − t)dWt
2
This can be rewritten as follows.
T2 T2
1
Z Z
ln(R̂T2 ) − ln(R̂t ) = σ 2 2
(T2 − t) dt + σ (T2 − t)dWt
2 t t
In the latter case (t > T1 ), the right hand side is normally distributed with mean 12 σ 2 (T2 − t)2
and variance σ 2 (T2 − t)2 . Taking exponential and using Gaussian moment generating function
we obtain.
Z T2
1 2
EQ [R̂T2 |Ft ] = R̂t exp σ 2 (T2 − t)2 dt = exp σ (T2 − t)3
t 3
Using R̂t = F (t; T1 , T2 ) + τ1 , we obtain.
1 1 1 2
EQ [R̂(t, w)|Ft ] = EQ [F (T1 , T2 )(w)|Ft ] + = F (t; T1 , T2 ) + exp σ (T2 − t)3
τ τ 3
1
After moving τ to the right side and subtracting F (t; T1 , T2 ) from both side, we get.
1 1 2
CASR3 = EQ [F (T1 , T2 )|Ft ] − F (t; T1 , T2 ) = F (t; T1 , T2 ) + exp σ (T2 − t)3 −1
τ 3
1 2 3 1 1 2 3
EQ [F (T1 , T2 )|Ft ] = exp σ (T2 − t) F (t; T1 , T2 ) + exp σ (T2 − t) − 1
3 τ 3
9
Electronic copy available at: https://ssrn.com/abstract=3654466
For t ≤ T1 we can take expectation with respect to information FT1 first and Ft second.
1 2 3 1 1 1 2 3
EQ [EQ [R̂(t, w)|FT1 ]|Ft ] = exp σ τ EQ [R̂T1 |Ft ] + + exp σ τ −1
3 τ τ 3
Let’s derive expression for EQ [R̂T1 |Ft ] for t < T1 . It has been shown earlier that.
1
d ln[R̂t ] = σ 2 [(T2 − t)2 − (T1 − t)2 ] + στ dWt
2
This can be rewritten as follows.
1 2 T1
Z Z T1
2 2
ln(R̂T1 ) − ln(R̂t ) = σ (T2 − t) − (T1 − t) dt + σ τ dWt
2 t t
Let’s calculate the first integral on the right side, but let’s rewrite the integrand first.
(T2 − t)2 − (T1 − t)2 = (T22 − 2T2 t + t2 ) − (T12 − 2T1 t + t2 ) = T22 − T12 − 2T2 t + 2T1 t
= τ (T2 + T1 ) − 2tτ = τ (T2 − t + T1 − t) = τ (2T2 − 2t − T2 + T1 ) = τ (2(T2 − t) − τ )
T1 T1
1 2 1
Z Z
2
σ τ 2(T2 − u) − τ du = σ τ (T2 − u) − τ du
2 t t 2
2
2 u T 1 1
= σ τ T2 (T1 − t) − − τ (T1 − t)
2 t 2
2 1 1 2 2
= σ τ (T1 − t) T2 − τ − (T1 − t )
2 2
2 1 1
= σ τ (T1 − t) T2 − τ − (T1 + t)
2 2
1
= σ 2 τ (T1 − t)(T2 − t)
2
We get the following expression for ln(R̂T1 ).
1
ln(R̂T1 ) − ln(R̂t ) = σ 2 τ (T1 − t)(T2 − t) + στ (WT1 − Wt )
2
The right hand side is normally distributed with mean 12 σ 2 τ (T1 − t)(T2 − t) and variance
σ 2 τ 2 (T1 − t). Taking exponential and using Gaussian moment generating function we obtain.
1 1 2 1 2 2
EQ [R̂T1 |Ft ] + = R̂t exp σ τ (T1 − t)(T2 − t) + σ τ (T1 − t)
τ 2 2
Using the earlier formula for EQ [EQ [R̂(t, w)|FT1 ]|Ft ] we obtain.
1 2 3 1 2 1 2 2
EQ [EQ [R̂(t, w)|FT1 ]|Ft ] = exp σ τ R̂t exp σ τ (T1 − t)(T2 − t) + σ τ (T1 − t)
3 2 2
1 1 2 3
+ exp σ τ −1
τ 3
10
Electronic copy available at: https://ssrn.com/abstract=3654466
Finally, using R̂t = F (t; T1 , T1 ) + τ1 and after some rearranging we obtain the following ex-
pression for the convexity adjustment CASR3 = EQ [Rt |Ft ] − F (t; T1 , T2 ).
1 1 σ2 τ 3 + 1 σ2 τ (T1 −t)(T2 −t)+ 1 σ2 τ 2 (T1 −t)
CASR3 = F (t; T1 , T2 ) + e3 2 2 −1
τ
It is worth noticing that when dealing with Eurodollar futures rather than SOFR futures,
there is no convexity adjustment for t > T1 since the rate is fixed at time T1 . When t < T1 ,
1 2 3
the SOFR convexity has extra term e 3 σ τ that accounts for the volatility over the [T1 , T2 ]
time period.
Notice that for ti > t, F (t; ti , ti+1 ) = SOF RtFi wd ; and for ti ≤ t, F (t; ti , ti+1 ) = SOF RtRzd
i
. For
unrealized rates, using results from the previous section, we get the following expression for
the total convexity adjustment CASR1 by adding up and averaging daily convexity adjustment
EQ [F (ti , ti+1 )|Ft ] − F (t; ti , ti+1 ).
Nm
1 X 1 1 σ2 τ (ti −t)(ti+1 −t)+ 1 σ2 τ 2 (ti −t)
CASR1 = F (t; ti , ti+1 ) + e 2 2 −1
Nm τ
i=1
In case of SR1, τ = ti+1 − ti and it can vary depending on day of the week and holidays. It
is also important to remember that SOFR futures are based on the ACT/360 day counting
convention, therefore τ used for SOFR forward rates scaling and τ used in the expectation
calculations above may differ.
and
N
1 X (∆SOF Rti − θ̂τ )2
σ̂ 2 =
N τ
i=1
11
Electronic copy available at: https://ssrn.com/abstract=3654466
8 To smooth or not?
The federal funds target rate is determined by a meeting of the members of the Federal Open
Market Committee (FOMC) which occurs eight times a year. FOMC may also hold additional
meetings and implement target rate changes outside of its normal schedule. The overnight
rates are subject to the FOMC policy changes. Hence, one may argue that forward rates should
not be smooth to reflect FOMC’s discreet interventions. However, the market participants
start pricing in anticipated changes into the futures ahead of time and the current market
typically morphs as well. Therefore, the futures rates may start increasing prior to the FOMC
meeting if the market participants all agree that FOMC will lift rates. So, the forward rate
smoothness assumption is still reasonable. There is typically still a lot of uncertainty about
timing and magnitude of the FOMC rate changes. Some of the changes are not anticipated,
like the most recent rate cut due to COVID-19. All in all, potential FOMC rate changes have
to be somehow accounted for during bootstrapping.
One of the ways to deal with the problem was described in [4]. The authors proposed to use
two assumptions when taking into consideration the impact of FOMC changes on the rate -
policy gradualism and six months jump window.
Let’s describe the first assumption - policy gradualism. As the name suggests, this assump-
tion assumes gradual rather than abrupt changes in rates. In simple terms, the SOFR-implied
increase in rates follows the pattern that minimizes the absolute size of the largest individual
jump. In other words, if two FOMC meetings are captured under one SOFR futures con-
tract that is pointing to a 50 bps increase, one would assume two 25 bps increases during
each FOMC meeting rather than one 50 bps increase. This approach does not eliminate rate
jumps, but rather minimizes the size of the jumps. And in this regard, it is ”consistent” (at
least in spirit) with the smoothness assumption.
The six months jump window assumption suggests that no jumps will occur beyond 6-month
point (starting from the current time). The authors argue that such distant projections are
not reliable. In this case, the rates will increase naturally and the regular smoothness assump-
tions will apply. Although the probabilities of future distant increases can be high, the timing
is hard to predict. Alternatively, one could utilize the dot plots to make assumptions beyond
6-month point.
9 Conflicting rates?
It is a common issue, when different instruments imply different rates for the same time pe-
riod. For example, three consecutive 1-month SOFR futures may disagree (in terms of implied
rates) with the 3-month SOFR futures. This may occur due to a number of different reasons -
liquidity, dealer pricing, execution type/platform, etc. In this case, there are two approaches
to close the gap - instrument prioritization and pricing error minimization.
One way to deal with this problem is to impose prioritization rules. For example, one may
prefer a rate implied from the 3-month SOFR futures. This can be done by using 3-month
futures and assuming interpolated rate within the futures time period or implying the rates
from the first two 1-month contracts and the 3-month contract. In the latter case, one takes
12
Electronic copy available at: https://ssrn.com/abstract=3654466
into consideration information implied from some, but not all 1-month futures.
Alternatively, one can try minimizing the pricing error for both instruments. In this case, it is
impossible to find a rate that will allow one to price 1-month and 3-month contracts correctly.
However, one would be able to price both of them closely assuming that different rates are
not far apart.
The selection of the ”right” methodology may depend on the usage. For example, for a trader
using 3-month futures as a hedge, building the curve that prioritizes 3-month rate over 1-
month rate might be the right approach. However, from the risk management perspective,
this may lead to the heightened risk due to potential mispricing that currently exists in the
market.
The author argues that historical SOFR rates can be approximated using survey rate and
DTCC’s GCF rate in the following manner.
References
[1] CME, SOFR Futures Celebrate Two-Year Anniversary, May 13, 2020. Available here.
[3] Sun, P., SOFR Discounting Analysing the Market Impact, Journal of Risk, February 19,
2020.
[4] Heitfield, E., and Park, Y., Inferring Term Rates from SOFR Futures Prices, 2019.
Available here.
[5] Bowman, D., Historical Proxies for the Secured Overnight Financing Rate, 2019. Availabe
here.
13
Electronic copy available at: https://ssrn.com/abstract=3654466