← All articles

At close of business every trading day, the middle office must produce a P&L explain: a complete attribution of the portfolio's change in value to its sources. If the portfolio gained €1.2 million, the desk risk manager needs to know whether that came from yield curve movements, carry accrual, convexity, FX translation, or new trades. Any amount that cannot be attributed to a known factor is the unexplained residual—and it should always be close to zero.

The P&L Explain Framework

P&L attribution decomposes the total mark-to-market change into additive factors. For a fixed income portfolio, the primary components are:

P&L Attribution Equation
ΔP&L = ΔP&Lrate + ΔP&Lcarry + ΔP&Lconvexity + ΔP&LFX + ΔP&Lnew trades + ε

The residual ε arises from higher-order terms, cross-effects, and model approximation. A well-calibrated risk model should keep ε below 5% of total P&L on average; regulators under the FRTB Internal Models Approach require formal P&L attribution tests.

Rate Delta (DV01 P&L)

The dominant component for most fixed income books is rate delta: the sensitivity of the portfolio to parallel yield curve shifts. It is calculated as the product of the portfolio's DV01 (dollar value of a basis point) and the change in rates during the day.

Rate Delta P&L
ΔP&Lrate = DV01 × Δy × 10,000

where Δy is the change in yield in basis points and the factor 10,000 converts from per-basis-point to full dollar value. A portfolio with DV01 of €42,000 experiencing a 3.5bp rally would attribute +€147,000 to rate delta.

In practice, the rate delta decomposition is done by key rate duration (KRD) across tenor buckets—typically 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 15Y, 20Y, 30Y—because yield curves rarely move in parallel. A steepening trade that is long the front end and short the back end might show a large positive KRD-2Y P&L and large negative KRD-10Y P&L, netting to a small total.

Carry and Theta

Carry is the income earned simply by holding a position overnight. For a bond, carry equals the coupon accrual minus the repo funding cost minus the passage of time (theta). It is the return you earn if nothing moves.

Daily Carry
Carrydaily = (Coupon Rate / 360) × Face Value − Repo Rate × (Face Value × Dirty Price) / 360

For a sovereign bond trading near par, daily carry is typically a small but predictable positive number. It becomes the primary P&L driver on quiet trading days with no yield movement.

Convexity Adjustment

The DV01 sensitivity assumes a linear price-yield relationship. In reality, bond prices are convex: for large rate moves, the actual P&L exceeds the linear approximation. The convexity adjustment captures this second-order effect:

Convexity P&L Component
ΔP&Lconvexity = ½ × Convexity × (Δy)² × Face Value

For a 10-year bond with convexity of 85 (in years²), a 50bp rate move generates a convexity benefit of approximately €10,625 per €1M face value. This term is always positive for long positions—convexity is a free option for bondholders.

Daily P&L Attribution — Sample Week (November 2021)
Stacked waterfall showing contribution of each factor to total daily P&L. EUR Government Bond Portfolio, notional €450M. Figures in €000s.

The Unexplained Residual and FRTB PLA Test

The P&L Attribution (PLA) test under FRTB compares the Hypothetical P&L (HPL)—computed from actual end-of-day market data—with the Risk-Theoretical P&L (RTPL), computed from the risk factors in the internal model. A large persistent gap signals that the internal model does not adequately represent the trading book's risks.

Banks are assessed over a 12-month rolling window. If the mean relative difference exceeds 10% or the variance ratio falls outside 0.8–1.2, the desk fails the PLA test and faces a capital surcharge or, in the worst case, must revert to the Standardised Approach for that desk.

Rolling 30-Day P&L by Trading Desk
Hypothetical P&L vs Risk-Theoretical P&L. Government rates desk Q3–Q4 2021. Monthly aggregation. EUR millions.

HTM vs AFS: Accounting Treatment

Not all fixed income portfolios flow through daily P&L. The accounting classification determines where valuation changes appear:

ClassificationMTM TreatmentIncome Statement ImpactTypical Use
Trading Book (FVTPL)Daily MTM to P&LUnrealised gains/losses flow throughProprietary trading, market-making
AFS (FVOCI)MTM to Other Comprehensive IncomeOnly impairment and realised gains hit P&LLiquidity buffer, ALM
HTM (Amortised Cost)No MTM — held at amortised costOnly coupon income and impairmentCore deposit funding, long-term ALM

The 2023 Silicon Valley Bank collapse illustrated the risk of large HTM portfolios: unrealised losses that were invisible in P&L until forced liquidation. Under IFRS 9, a portfolio reclassification from HTM to AFS triggers immediate recognition of all accumulated OCI—a significant earnings event.

"The unexplained residual is not noise—it is information. It tells you which risk factors your model is missing, which approximations are breaking down, and which trades your system cannot reprice correctly."

DV01 Profile Over Time

Key Rate DV01 (€ per basis point) — Portfolio Evolution
Sensitivity decomposition by tenor bucket over Q3–Q4 2021. Positive = long duration; negative = short duration.

Middle Office Workflow

The daily P&L production cycle follows a strict timeline. After the trading day closes, risk systems reprice the entire book using end-of-day market data. The attribution engine then runs each factor one at a time, computing the sensitivity contribution. Results are loaded into the P&L report for trader sign-off before the overnight risk management run begins.

Python — P&L Attribution Engine (simplified)
import numpy as np
from dataclasses import dataclass

@dataclass
class BondPosition:
    notional: float       # Face value €
    dv01: float           # € per bp
    convexity: float      # years²
    coupon_rate: float    # annual, decimal
    repo_rate: float      # funding rate, decimal

def attribute_pnl(pos: BondPosition, delta_y_bp: float,
                  delta_fx: float = 0.0) -> dict:
    """Full P&L attribution for a single bond position."""

    # Rate delta (first order)
    rate_pnl = pos.dv01 * delta_y_bp

    # Convexity (second order)
    delta_y_dec = delta_y_bp / 10_000
    convexity_pnl = 0.5 * pos.convexity * delta_y_dec**2 * pos.notional

    # Daily carry (coupon accrual minus funding)
    gross_carry = (pos.coupon_rate / 360) * pos.notional
    funding_cost = (pos.repo_rate / 360) * pos.notional
    carry_pnl = gross_carry - funding_cost

    # FX translation (if non-base currency)
    fx_pnl = pos.notional * delta_fx

    total = rate_pnl + convexity_pnl + carry_pnl + fx_pnl

    return {
        "rate_delta": rate_pnl,
        "convexity": convexity_pnl,
        "carry": carry_pnl,
        "fx": fx_pnl,
        "total_attributed": total,
    }

Implications for Data Infrastructure

A robust P&L attribution system requires several data inputs to arrive with both precision and timeliness: end-of-day yield curves from the market data vendor, repo rate fixings from treasury, trade captures from the front-office system, and FX rates at the precise evaluation time.

Any data quality issue in these inputs propagates directly into the unexplained residual. A common source of phantom residuals is timestamp mismatch: the risk system may reprice bonds at a London close snapshot while the front office books use a New York close. The 5-hour difference in US treasury yields alone can generate tens of basis points of spurious DV01 P&L.