Comment on page
Rolling bond strategy
Primer on the RollingBondStrategy class.
The purpose of this primer is to show how the building block
RollingBondStrategy
works.A notebook containing all the code used in this page can be accessed in the research environment: Example notebooks.
Setting up your environment takes three steps:
- Import the relevant internal and external libraries
- Configure the environment parameters
- Initialise the environment
import sigtech.framework as sig
from sigtech.framework.schedules.roll_schedules.bond_schedule import otr_series
import datetime as dtm
import pandas as pd
import seaborn as sns
sns.set(rc={'figure.figsize': (18, 6)})
sig.config.init()
The RollingBondStrategy continually rolls on-the-run or off-the-run bonds for different tenors and issuers.
Here we define a helper function to generate the rolling bond strategies we will consider.
def get_rb(tenor, run_type):
return sig.RollingBondStrategy(
country='US',
currency='USD',
run_type=run_type,
# 'ON_THE_RUN', 'FIRST_OFF_THE_RUN', 'SECOND_OFF_THE_RUN'
start_date=dtm.date(2017, 1, 5),
tenor=tenor, # e.g. '2y', '5Y', '10Y', '30y'
)
on_the_run_10y_st = get_rb('10Y', 'ON_THE_RUN')
first_off_the_run_10y_st = get_rb('10Y', 'FIRST_OFF_THE_RUN')
Examples of on-the-run and off-the-run rolling strategies is given below, together with one roll schedule.
Python
Output
on_the_run_10y_st.history().plot(label='on_the_run', legend=True);
first_off_the_run_10y_st.history().plot(label='first_off_the_run', legend=True);

Python
Output
on_the_run_10y_st.roll_schedule.tail()
effective_date
2020-02-19 US 1.5 2030/02/15 GOVT
2020-05-19 US 0.625 2030/05/15 GOVT
2020-08-18 US 0.625 2030/08/15 GOVT
2020-12-02 US 0.875 2030/11/15 GOVT
2021-02-22 US 1.125 2031/02/15 GOVT
Name: bond_name, dtype: object
An alternative way of creating on-the-run
RollingBondStrategy
strategies, is to use the pre-built OTR schedules which can be access via the otr_series
function as per below.def get_schedules(country, tenor):
return otr_series(
group_name=f'{country} GOVT BOND GROUP',
tenor=tenor,
start=dtm.date(2005,1,5)
)
dict_otr = {}
TENORS = ['5Y']
COUNTRIES = ['ES']
for country in COUNTRIES:
for tenor in TENORS:
dict_otr[f'{country}_{tenor}'] = get_schedules(country, tenor)
Python
Output
dict_otr['ES_5Y'].head()

Last modified 10mo ago