Methodology
How the pricer and the carry monitor compute their numbers. All engine code is in src/lib and covered by unit tests.
1. Pricing
Time is ACT/360 (t = days/360), rates continuously compounded; settlement is two weekdays (weekends only, no holidays), so year fractions τ(t, T) count the days between settlement dates (÷ 360) — Dec26 runs Thu 13 Aug → Tue 22 Dec: 131 days.
Forward (carry model). The hedge funds the index at R = €STR + s (s = term funding) and receives the all-in share of dividends going ex in (t, T], paid on their window's expiry and reinvested at €STR:
F = S · e^{R(T_s − t_s)} − allIn · Σ Dᵢ · e^{€STR(T_s − payᵢ)} R = €STR + sSynthetic forward, priced by put–call parity and quoted as the switch vs spot:
Synth = F · e^{−(€STR + EQL) · t} − STRF, quoted as a spread s_TRF (bp): TRF = S + Accrual + S · s_TRF · τ(t, T), settling at ST + AccrualT. A future costs nothing to enter, so its fair price today is the expected final settlement; the accrual already earned is in both and cancels, leaving the basis to price the accrual still to come:
S · s_TRF · τ(t, T) = F − S + AD − AF AD = 100% of gross dividends in (t, T] distributions still to come AF = €STR · Σ_d F(d−1) · τ(d−1, d) funding still to come: daily (d = business days), on the forward path
To first order s_TRF ≈ s + (1 − allIn) · ΣD / (S · τ): the TRF is term funding plus the dividend pass-through (the TRF pays gross, the hedge earns 87%).
Inverse. Fwd, Synth and TRF are three quotes of the same forward, so any one of them implies the others. Each row solves for one slot — prices, funding, dividends or all-in — with a generic Brent root-finder on priceForward(). Rows are walked from first expiry to last: earlier dividend windows are held at their marks, and Forward Funding chains off the previous tenor. Forward Funding is term funding between consecutive tenors: s · τ = sprev · τprev + φ · (τ − τprev).
Dividend scaling curve. Each tenor owns the dividend window since the previous expiry (the first, since today). The Div column is cumulative gross dividends to expiry; solving or editing it scales only the row's own window by a factor k, with earlier windows held at the earlier rows' marks — a piecewise-flat scaling of the schedule:
ΣD(T) = ΣD_marks(T_prev) + k · ΣD_schedule(T_prev, T]
Solver. Every inversion is one call, implied(pricer, parameter, target): Brent's method (bisection-safeguarded inverse quadratic interpolation) on pricer(x) − target. It starts from a wide bracket per parameter (funding ±1,000bp, all-in 0–150%, k 0–3), widened automatically until it contains the root, and converges to 1e-14. Each pricer is monotonic in each of these parameters, so the root is unique.
Two-way. Marks are fixed at start-up from the run (TRF mid, schedule dividends, 87%). Each bid/ask side takes the input sides that push it that way, so outputs never cross unless an input does.
Simplifications: flat €STR (placeholder) and EQL; no holiday calendar; futures ≈ forwards (deterministic rates); flat term funding per tenor along the accrual path (no bootstrapped curve); dividends paid on their window's expiry; TRF launch = valuation date; static dividends, no VPD.
2. Carry and roll-down monitor
The monitor values a TRF calendar spread of notional N held to the near expiry — after that it is an outright far TRF. Receiving forward funding (the default) is long the near TRF and short the far one; paying is the mirror trade. A leg's P&L for a change in its spread is
P&L_leg = sign × N × Δs_TRF × τ sign = +1 long, −1 short; N = contracts × multiplier × S
Curve. TRF mids per tenor, linear in s_TRF · τ between tenors (flat forward spreads), flat before the first tenor. Carry and roll-down assume the TRF spread term structure is static in time-to-maturity: over the horizon spreads don't move, and a tenor with τ′ left at the horizon is priced on today's curve at τ′ (so the interpolation and the flat front end drive the roll-down). At the near expiry the near leg has expired (τ′ = 0) and the far leg has the forward period left, τ′ = τfar − τnear.
s_TRF(τ) · τ = s_TRF,1 · τ₁ + (τ − τ₁)/(τ₂ − τ₁) · (s_TRF,2 · τ₂ − s_TRF,1 · τ₁)
Carry is the spread each leg accrues as its basis decays: a long pays s_TRF over the elapsed time, a short receives it. It assumes the outstanding risk — index delta, dividends and €STR — is perfectly hedged at no cost, so only the spread accrual is earned. Roll-down re-marks the live far leg on today's curve at its shorter maturity.
carry = −sign × N × s_TRF × (τ − τ′) = N × (s_TRF,far − s_TRF,near) × τ_near (receiving) rolldown = sign × N × (s_TRF(τ′) − s_TRF) × τ′ = −N × (s_TRF(τ_far − τ_near) − s_TRF,far) × (τ_far − τ_near) annualized = amount × 360 / days, days = τ_near × 360
Forward funding is read off the Term Funding curve (carry-model terms, dividend pass-through stripped out). Its DV01 is bump-based: raise the far tenor's term funding by (τfar − τnear) / τfar bp so φ rises 1bp, re-solve the TRF spreads, revalue both legs. On the TRF curve, carry and roll-down tie out exactly to the forward TRF spread f:
φ = (s_far · τ_far − s_near · τ_near) / (τ_far − τ_near) carry + rolldown = TRF-forward DV01 × (f′ − f), TRF-forward DV01 = ± N × (τ_far − τ_near) × 1bp
Delta and IR DV01 bump spot +1% and €STR +1bp with the assumptions held (term funding, dividends, all-in), re-solve the TRF spreads and revalue each leg at S · (1 + s_TRF · τ). With quotes held fixed IR DV01 would be zero; the bump picks up the dividend pass-through moving with spot and the hedge compounding at €STR + s.
Worked example: receive Dec26 → Dec27, N = 100m
TRF mids 62.50 bp (Dec26, τ = 131/360) and 84.25 bp (Dec27, τ = 495/360); horizon 18 Dec 2026, 131 days; Dec27 rolls to 364 days, where today's curve gives 81.43 bp.
| Formula | To near expiry | Annualized | |
|---|---|---|---|
| Carry | 100m × (84.25 − 62.50)bp × 131/360 | +79,146 | +217,500 |
| Roll-down | −100m × (81.43 − 84.25)bp × 364/360 | +28,484 | +78,276 |
| Carry + roll-down | +107,630 | +295,776 | |
| Forward TRF spread f → f′ (identity check) | (84.25·495 − 62.50·131)/364 → s_TRF(364d) | 92.08 → 81.43 bp | |
| TRF-forward DV01 | −100m × 364/360 × 1bp | −10,111 EUR/bp | |
| Check | −10,111 × (81.43 − 92.08) | +107,630 | |
| Forward funding DV01 (bump) | far term funding +364/495 bp, re-solve | ≈ −10,287 EUR/bp |
Simplifications: perfect, costless hedging of the residual risk; mids rather than execution levels; static EUR notional; flat curve before the first tenor; no discounting or margin funding of the P&L; the monitor stops at the near expiry.