In [11]:
%load_ext autoreload
%autoreload 2
import plotly
import plotly.graph_objs as go
import logging
from quantfinlib.util import configure_logger
import numpy as np
from quantfinlib.datasets import load_treasury_rates
from plotly.express.colors import sample_colorscale

plotly.offline.init_notebook_mode()
configure_logger(verbosity=logging.WARN, log_to_file=False)
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload

DAILY TREASURY PAR YIELD CURVE RATES

In [12]:
print('\n'.join(load_treasury_rates.__doc__.strip().split('\n')[1:10]))

    The dataset provides a snapshot of historical daily interest rates for various U.S. Treasury bond maturities.

    Source:https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve

    DATE        | 1m  | 2m  | 3m  | 4m  | 6m  | 1y  | 2y  | 3y  | 5y  | 7y  | 10y | 20y | 30y |
    ------------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
    1990-01-02  | NaN | NaN | 7.83| NaN | 7.89| 7.81| 7.87| 7.90| 7.87| 7.98| 7.94| NaN | 8.00|
    1990-01-03  | NaN | NaN | 7.89| NaN | 7.94| 7.85| 7.94| 7.96| 7.92| 8.04| 7.99| NaN | 8.04|
    ...
In [13]:
df = load_treasury_rates()

fig = go.Figure()
groups = {
    'short': [f'{str(i)}m' for i in [1,2,3,4,6]],
    'mid': [f'{str(i)}y' for i in [1,2,3,5]],
    'long': [f'{str(i)}y' for i in [7,10,20,30]]
}

colorscales = ['Algae', 'Burg', 'ice']
for i, (group, maturities) in enumerate(groups.items()):
    c = sample_colorscale(colorscales[i], list(np.linspace(0.2, 0.7, len(maturities))))


    for k, m in enumerate(maturities):
        fig.add_trace(go.Scatter(
            x=df.index,
            y=df[m],
            mode='lines',
            name=m,
            line=dict(color=c[k]),
            legendgroup=group,
            hovertemplate="%{y:.2f}%",
        ))


fig.update_layout(
    title='Treasury rates',
    xaxis_title='Date',
    yaxis_title='Yield (%)',
    legend_title='Maturity',
    template='plotly_white',
    legend_x=-0.11,
    width=1200,
    height=600,
    font=dict(size=12),
    margin=dict(l=40, r=40, t=40, b=40)
)

fig.show()