Skip to content
All library documents

SOFR Futures and Single-Period Swap Convexity

Article Quant Q&A · Author: Jester

Summary

The document examines how a short three-month SOFR futures position compares with a short single-period swap (SPS) over the same accrual period. Its answer emphasizes that the IMM dates and exact number of days matter when matching the instruments’ rate sensitivity. It illustrates the method by setting up a SOFR curve, sizing an interest rate swap against a futures position to make their delta nearly offset, then examining the portfolio’s gamma and repricing it after a rate shift.

The example reports that the delta-neutral portfolio retains positive gamma, with the repriced value close to the second-order Taylor estimate. This illustrates the convexity difference between futures and swaps and how to quantify it through risk measures and repricing. The result is specific to the dates, rates, conventions, and position sizes in the example; it does not establish a universal hedge ratio or explain every possible settlement convention.

Key ideas

  • The day count between IMM dates affects the swap notional needed to offset futures delta.
  • A delta-neutral futures and swap portfolio can still retain gamma exposure.
  • Portfolio gamma provides a second-order estimate of profit and loss under a rate move.
  • Repricing the portfolio after a curve shift checks the convexity estimate.

Tags

Full text
# SOFR futures versus a Single Period Swap


# SOFR futures versus a Single Period Swap












I apologize in advance if I have missed something very basic, but I am trying to replicate the calculations for the payoffs from a short SOFR 3m futures position and being short a 3 month OTC SPS on the same dates on the CME website: https://www.cmegroup.com/education/courses/understanding-stir-futures/understanding-convexity-bias.html

I am assuming that today is the IMM settlement date for both and varying the settlement interest rate as per the CME calculation. I can't seem to replicate the positive convexity of the SPS with the change in settlement rates: I do see positive convexity as rates go down on the left columns, but I have negative convexity in the right hand columns as rates move higher. I have checked my FRA settlement calculation and it looks to be correct.

Is it because the term I am using is too short to see the effect properly? Please tell me what I am missing, TIA!

## Answer by Attack68 (score 1)

https://quant.stackexchange.com/a/83900

The article does not specify which dates are used for the contract. This matters because the amount of days between IMMs determines the amount of risk required for the swap.

For a 91 day period I required 994.1215mm on the swap for delta neutrality. (For a 90 day period this would have been ~1005mm at 2% rates)

```
from rateslib import *  # rateslib 2.1, Python 3.12

sofr_curve = Curve(
    nodes={dt(2000, 9, 20): 1.0, dt(2000, 12, 20): 1.0}, 
    calendar="nyc", 
    convention="act360"
)

solver = Solver(
    curves=[sofr_curve],
    instruments=[
        IRS(dt(2000, 9, 20), dt(2000, 12, 20), spec="usd_irs", curves=[sofr_curve])
    ],
    s=[2.0],
    id="us_rates",
    instrument_labels=["future1"]
)
# SUCCESS: `func_tol` after 2 iters, `f_val`: 8.0e-12, `time`: 0.0025s
```

Now construct the instruments and evaluate their combined risks:

```
stir = STIRFuture(
    dt(2000, 9, 20), dt(2000, 12, 20), spec="usd_stir", curves=[sofr_curve], 
    contracts=-1000, price=98.0
)
irs = IRS(
    dt(2000, 9, 20), dt(2000, 12, 20), spec="usd_irs", curves=[sofr_curve], 
    notional=-994.1215e6, fixed_rate=2.0
)
pf = Portfolio([irs, stir])
```

Delta risk is almost exactly zero across the portfolio:

```
pf.delta(solver=solver)
```

Gamma risk is 1.28 $ bp/bp

```
pf.gamma(solver=solver)
```

You expect (1.285 * 10 * 10 * 0.5 = \$64.25) of PnL for a 10bp shift to second order Taylor expansion.

```
pf.npv(curves=sofr_curve.shift(10), base="usd")
# <Dual: 64.820667, ...>
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.