You price CVA trade by trade. Two hundred swaps with the same counterparty, each one run through the engine, each one giving a sensible number. You add them up and take the total to the XVA desk.
They quote you a tenth of it.
Neither number is wrong. Netting is the difference, and netting CVA on a diversified book is not a haircut — it is most of the answer. The mechanism is one inequality, and the interesting part is not the 90% headline but the three conditions under which you get nowhere near it.
The one inequality
Without netting, each trade stands alone and you lose the positive ones:
![]()
With an enforceable netting agreement, the counterparty’s administrator cannot cherry-pick. Everything collapses to a single claim:
![Rendered by QuickLaTeX.com \[\text{Exposure}_{\text{net}} = \max\left(\sum_i V_i, 0\right)\]](https://quantmechanicslab.com/wp-content/ql-cache/quicklatex.com-74c0e82025edeea6a9c156cc354d4734_l3.png)
The second is never larger than the first. It is the same subadditivity that makes a portfolio less risky than the sum of its parts, applied to the
function. Your out-of-the-money trades now pay for your in-the-money ones instead of being ignored.
Since CVA is the exposure profile weighted by default probability, whatever netting does to expected exposure it does to CVA:
![]()
Scale EE by a factor and CVA scales with it. (Strictly, the netting benefit varies across the profile because trades mature at different dates, so the CVA benefit is a tenor-weighted average of the pointwise benefits. On a book of similar-tenor swaps the two are close enough that the distinction rarely matters.)
If you are unclear on why it is EE that enters here rather than PFE or EEPE, that distinction is worth getting straight first — it decides which number you are allowed to net in the first place.
Where the 90% comes from
Take
trades, each zero-mean with the same volatility, independent of each other. Without netting you pay the option premium
times:
![]()
With netting, the sum
has standard deviation
, not
, because independent risks add in quadrature:
![Rendered by QuickLaTeX.com \[\mathbb{E}\left[\max\left(\sum_i V_i, 0\right)\right] = \frac{\sigma \sqrt{n}}{\sqrt{2\pi}}\]](https://quantmechanicslab.com/wp-content/ql-cache/quicklatex.com-d40d2ca3f21add336fbae29e17e15829_l3.png)
The ratio is
, so the benefit is
![]()
For 100 trades that is
exactly. The headline is not a market anecdote, it is
.
Correlation is the binding constraint, not trade count
Here is where the headline stops being useful. Real trades are not independent. They are driven by the same curve, the same handful of risk factors, often the same view. With equicorrelation
the benefit becomes
![]()
trades rho=0.0 rho=0.2 rho=0.5 rho=0.8 rho=1.0
2 29.3% 22.5% 13.4% 5.1% 0.0%
10 68.4% 47.1% 25.8% 9.4% 0.0%
100 90.0% 54.4% 28.9% 10.4% 0.0%
500 95.5% 55.1% 29.2% 10.5% 0.0%
Read across the
column. Going from 10 trades to 500 — a fiftyfold increase in book size — moves the benefit from 25.8% to 29.2%. Three and a half percentage points.
The reason is in the limit. As
the ratio tends to
, so the benefit is capped:
![]()
: caps at 55.3%
: caps at 29.3%
: caps at 10.6%
You cannot trade your way out of correlation. Adding more of the same risk to a netting set buys you almost nothing, and the marginal benefit of trade 501 is essentially zero.
A directional book gets almost nothing
The second killer is direction. The
result assumes trades are zero-mean — as likely to be in your favour as against. Now suppose the counterparty is a corporate that only ever hedges one way, so every trade drifts the same direction relative to you.
With independent noise but a common drift of
per unit of trade volatility, 100 trades:
mean/sd per trade benefit
0.00 90.0%
0.25 53.4%
0.50 28.3%
1.00 7.7%
2.00 0.4%
At one standard deviation of directionality you keep 7.7% of the benefit. At two you have essentially none. Nothing offsets, because there is nothing pointing the other way.
This is why netting benefit is so uneven across a counterparty book in practice. A dealer counterparty running a two-way flow gets close to the textbook number. A corporate hedger with a single directional exposure gets a rounding error, and the CVA they are charged reflects it.
Which is why CVA is priced incrementally
Netting makes CVA nonlinear, and nonlinearity has a consequence that surprises people the first time they see it: the CVA of a new trade depends entirely on what is already in the netting set.
Define the incremental CVA as what the trade adds to the total:
![]()
Subadditivity guarantees
, always. And the gap can be large enough to change sign. Adding a trade correlated at various levels to an existing netting set:
corr(new, set) standalone incremental ratio
1.0 0.3979 0.3979 1.00
0.5 0.3992 0.2924 0.73
0.0 0.3998 0.1665 0.42
-0.5 0.3989 0.0011 0.00
-1.0 0.3981 -0.3979 -1.00
A perfectly offsetting trade has incremental CVA exactly equal to minus its standalone value. You are not charging the client for counterparty risk on that trade — you are paying them for reducing yours, and a competitive XVA desk will quote it that way.
The same trade, same client, same day, prices differently depending on what else is in the netting set. That is not a modelling artefact to be smoothed away. It is the correct answer, and any pricer that quotes standalone CVA on a hedging trade is leaving the trade to a competitor who does the arithmetic properly.
Overshoot and you go back the other way, incidentally. Hedge 150% of the existing set and the incremental CVA rises from
to
, because you have created exposure in the opposite direction.
The code
import numpy as np
def netting_benefit(n, rho):
"""1 - E[max(sum,0)] / sum E[max(V_i,0)], equicorrelated zero-mean trades."""
return 1 - np.sqrt((1 + (n-1)*rho)/n)
for n in (10, 100, 500):
print(f"n={n:>4}: " + " ".join(f"rho={r}: {100*netting_benefit(n,r):5.1f}%"
for r in (0.0, 0.5, 0.8)))
for r in (0.2, 0.5, 0.8):
print(f"rho={r}: cap as n->inf = {100*(1-np.sqrt(r)):.1f}%")
Output:
n= 10: rho=0.0: 68.4% rho=0.5: 25.8% rho=0.8: 9.4%
n= 100: rho=0.0: 90.0% rho=0.5: 28.9% rho=0.8: 10.4%
n= 500: rho=0.0: 95.5% rho=0.5: 29.2% rho=0.8: 10.5%
rho=0.2: cap as n->inf = 55.3%
rho=0.5: cap as n->inf = 29.3%
rho=0.8: cap as n->inf = 10.6%
Confirmed against 400,000 Monte Carlo paths at
: simulated 90.0% at
and 28.9% at
, matching the closed form to the decimal.
Where this bites in practice
Netting only counts if it is legally enforceable. An ISDA Master Agreement is necessary but not sufficient — you need a netting opinion covering the counterparty’s jurisdiction and entity type, and Basel requires legal certainty before recognising the benefit for capital. No opinion, no netting, gross exposure. This is the single largest driver of why the same portfolio faced to two counterparties in different jurisdictions carries wildly different capital.
The netting set is the unit, not the counterparty. One counterparty can sit behind several netting sets — separate master agreements, separate legal entities, products carved out into their own agreements. Trades in different netting sets do not offset, however perfectly they hedge each other economically. A hedge booked into the wrong netting set is not a hedge for CVA purposes.
Allocation back to trades is not unique. Because incremental CVA depends on order, splitting a netting-set CVA across its constituent trades has no canonical answer. Euler gradient allocation is the standard choice, but it means a trader’s allocated CVA moves when somebody else adds a trade to the same set. That is a real operational headache and a recurring source of arguments between desks, not a defect in the maths.
The 90% is a best case, not a rule of thumb. It requires 100 trades and near-independence. Take it into a meeting as an expectation and you will be embarrassed by the first directional corporate book you meet.
The takeaway
Netting turns a sum of options into an option on a sum, and the gap between those is worth more than most modelling refinements you could make. But the size of the gap is set by diversification, not by trade count: independent trades give you
, correlated trades cap out at
no matter how many you add, and a directional book gets close to nothing.
The practical consequence is that standalone CVA is not a number worth computing. What a trade costs depends on what it is netted against, and it can be negative.
Exposure aggregation, netting and CVA all sit on the same stochastic calculus — the measure change, the martingale machinery, the numerical validation that tells you when a simulated exposure profile is trustworthy. That is what the course modules are built to cover.
Get the Quant Reference Card — four pages covering stochastic calculus, measure change, the models you’ll meet, discretisation, rates, credit and XVA, with the practitioner notes that don’t make it into textbooks. Free.