Fixed Income Carry Strategy#

New user? The best way to learn SigTech is to follow the steps in our user guide.

Restricted data: You will only have access to the data used in this notebook if your organisation has specifically purchased it. To check your current data access, view Data. If you would like to access more data, please contact sales@sigtech.com.

Changes will not be saved: Edits made to SigTech’s example notebooks like this will only persist for the duration of your session. When you restart the research environment, this notebook will have been restored to its original state, and any changes you have made will have been lost. To make permanent changes, copy and paste the content to a new notebook in one of your workspaces.

Introduction#

The purpose of thise notebook is to show how one could make use of several different building blocks on the SigTech platform to build a simple FX-hedged fixed income carry strategy.

Environment#

This section will import relevant internal and external libraries, as well as setting up the platform environment.

[ ]:
import sigtech.framework as sig

import datetime as dtm
import seaborn as sns

sns.set(rc={'figure.figsize': (18, 6)})
env = sig.init(env_date=dtm.date(2024, 2, 22))

Universe#

[ ]:
def swap_carry_basket(
    ccy: str,
    start_date: dtm.date
) -> sig.BasketStrategy:
    # Create 5y rolling swap to short
    r_swap_short = sig.RollingSwapStrategy(
        currency=ccy,
        swap_currency=ccy,
        forward_start_months=3,
        start_date=start_date,
        tenor='5Y',
        ticker=f'{ccy} 5Y ROLLING SWAP'
    )
    # create 30y rolling swap to go long
    r_swap_long = sig.RollingSwapStrategy(
        currency=ccy,
        swap_currency=ccy,
        forward_start_months=6,
        start_date=start_date,
        tenor='30Y',
        ticker=f'{ccy} 30Y ROLLING SWAP'
    )
    # put the 30y and 5y in to a basket with equal notional positions
    basket = sig.BasketStrategy(
        currency=ccy,
        start_date=start_date,
        constituent_names=[r_swap_short.name, r_swap_long.name],
        weights=[-0.5, 0.5],
        rebalance_frequency='EOM',
        ticker=f'{ccy} BASKET'
    )
    # if the basket is not USD perform an FX hedging overlay
    if not ccy == 'USD':
        basket = sig.FXForwardHedgingStrategy(
            strategy_name=basket.name,
            currency='USD',
            start_date=basket.start_date,
            exposure_rebalance_threshold=0.02,
            hedge_rebalance_threshold=0.02,
            hedging_tenor='1M',
            ticker=f'USD {ccy} FX-HEDGING'
        )
    return basket
[ ]:
start_date = dtm.date(2010, 6, 14)
constituents = {
    ccy: swap_carry_basket(ccy, start_date)
    for ccy in ('USD', 'GBP', 'EUR')
}

Portfolio construction#

[ ]:
carry_strat = sig.BasketStrategy(
    currency = 'USD',
    start_date = start_date,
    constituent_names = [x.name for x in constituents.values()],
    weights = [1.0 / len(constituents)] * len(constituents),
    rebalance_frequency = 'EOM',
)

Performance analytics#

[ ]:
sig.PerformanceReport(carry_strat, cash=sig.CashIndex.from_currency('USD')).report()