The Analyst's Path

Interest rate swap valuation

A plain-vanilla interest rate swap, where one party pays a fixed rate and the other a floating rate on the same notional, is valued as a long fixed-rate bond and a short floating-rate bond for the fixed-rate receiver, with the mirror image for the payer. A floating-rate bond is worth par at a reset date, so only the fixed leg needs summing from the discount curve. The fixed rate that makes a new swap worth exactly zero is the par swap rate.

5 min readPart of Forwards, Futures & Swaps: Pricing & ValuationOpen in course mode

Advertisement

Everything in this module converges here. A plain-vanilla interest-rate swap, one party pays a fixed rate, the other pays a floating reference rate, on the same notional, for the same set of dates, has a genuinely elegant valuation identity: it is exactly equivalent to a portfolio that is long a fixed-rate bond and short a floating-rate bond (from the fixed-rate receiver's point of view), or the mirror image for the fixed-rate payer. That equivalence lets you value an entire swap using only tools you already have (present value and a discount curve) with one shortcut worth memorizing: a floating-rate bond, valued at (or immediately after) a reset date, is always worth par, because its next coupon is set to the current market rate by construction. So if DF_i are today's discount factors to each remaining payment date and N is the notional:

PV(fixed leg) = N × K × Σ DF_i (K = the swap's fixed rate) PV(floating leg) = N × (1 − DF_final) (the "floating leg is always worth par at a reset" shortcut)

Advertisement

How do you find the par rate and value an existing swap?

The rate c that makes a brand-new swap worth exactly zero at inception (the par swap rate) falls straight out of setting the two legs equal: c = (1 − DF_final) / Σ DF_i. Worked Examples 6 (a USD swap off a SOFR-style curve) and 7 (an INR swap off an OIS-style curve) both build this par rate from a small five-year discount curve, and then value an existing, off-market swap (one contracted years ago at some K that no longer matches today's curve) two independent ways: directly, as PV(fixed) − PV(floating), and via the shortcut N × (K − c_today) × Σ DF_i, where c_today is the par rate recomputed for the remaining tenor off today's curve. In both worked examples the two methods agree to the cent, not a coincidence, but the whole point of R3's discipline: a curve you have bootstrapped correctly reprices every derived quantity consistently, and checking that it does is how you catch a bug before it costs anyone anything. Practice P15 pushes this one level deeper, showing that the par swap rate is precisely the discount-factor-weighted average of the strip of one-year forward rates implied by the same curve, making the "swap = a strip of FRAs" claim from forward rate agreements a checked numerical fact, not a slogan.

Two honest simplifications, stated so you carry them correctly into practice: real swaps typically pay the fixed leg semi-annually (US) and the floating leg quarterly, each on its own day-count convention (30/360 fixed, Act/360 floating, for a standard USD swap), this module uses annual payments and a single day-count convention throughout so the mechanism stays transparent; and the discount curve here is always handed to you as a given input, bootstrapped off a small number of clean zero rates, building a real curve from actual market quotes (bootstrapping off deposit rates, futures, and par swap rates simultaneously) is FI1.03's dedicated job, not this module's.

Case Lab: once it lands in the app's Cases tab, run CL-DV.2 (The Swap That Moved a Duration Gap) for this module, an externally-sourced worksheet built on public SOFR curve data plus a synthetic corporate treasury, where you value an off-market swap exactly the way Worked Example 6 does above and diagnose how a curve shift widened a hedge's duration gap.

{
  "skill": "Bootstrapping a discount curve and re-pricing a swap in code, without letting the model's stated 'par rate' substitute for your own derivation",
  "use": "Use a code-capable assistant to draft the discount-factor and par-swap-rate functions from a set of zero rates, so you can quickly test many curves and tenors once you already know how the two consistency checks (direct PV vs. shortcut; par rate vs. DF-weighted forward-rate average) are supposed to come out.",
  "tools": ["Chat/code assistants — Claude, ChatGPT with code execution", "A local Jupyter/Python environment", "Public rate data — SOFR OIS levels (CME Group, Federal Reserve Bank of New York) or the INR OIS/MIBOR curve (CCIL, FBIL) for a real (not synthetic) curve to test against"],
  "prompt": "Given these annual zero rates <RATES>, write Python to compute the discount factors, the n-year par swap rate, and the value of an existing swap contracted at rate K with m years remaining. Then verify the value two ways: directly as PV(fixed)-PV(floating), and via the shortcut N*(K - par_rate_m)*annuity. Also compute the strip of one-year forward rates and confirm their discount-factor-weighted average equals the n-year par rate.",
  "verify": "Both internal checks (direct-vs-shortcut PV; par-rate-vs-weighted-forward-average) must match to a rounding error — if they do not, the curve or the code has a bug, full stop, regardless of how confident the explanation sounds. If you built the curve off a real published rate, trace every input to its named source (CME/NY Fed for SOFR, CCIL/FBIL for INR OIS) and date-check it before using the output for anything beyond practice (Guardrail 1-5, AI0.01).",
  "diy": "You must be able to derive the par-rate formula from 'PV(fixed)=PV(floating)' yourself, and explain in your own words why a floating leg is worth par at a reset, before trusting any code — or any AI explanation of that code — that claims to do this for you.",
  "market": "IN"
}

Advertisement

Part of the course

This page is part of Forwards, Futures & Swaps: Pricing & Valuation (DV1.01), in Phase 12: Finance Plus, AI and the quant-code track. The module's flashcards and its quiz are in the app.