Someone from Credit walks over and asks what your exposure to a counterparty is. You open the risk system. Depending on which report you click, you get 1.6m, 1.9m, 6.6m or 9.4m. Same counterparty, same trade, same close of business, same model.
All four numbers are correct. They answer different questions.
The short version: expected exposure vs PFE is not a matter of precision but of purpose. EE prices, PFE limits, EEPE capitalises, ENE gives you DVA. On the trade below they differ by a factor of six. Confusing them is not a rounding error — it is a limit breach you didn’t report, or a capital number your regulator disagrees with.
One profile, five numbers
Take a five-year par payer swap, semi-annual, 100m notional. The standard desk approximation for its mark-to-market at a future date
is
![]()
where
is the par swap rate at
,
the fixed rate struck today, and
the annuity of the remaining fixed leg. Model the swap rate as normal with 100bp annualised volatility, so
has standard deviation
.
Two forces fight each other. Rates diffuse, so the spread
widens like
— exposure grows. But every coupon that pays reduces
— exposure shrinks. The product peaks somewhere in the middle.
For this swap the peak sits at 1.96 years, or 39% of the life. That hump is the single most recognisable object in counterparty risk, and once you have seen it you will recognise the shape on every vanilla swap you ever look at.
EE is a mean
Expected exposure is the average of the positive part of the mark-to-market:
![]()
The
matters. If the counterparty defaults while you are out of the money, you still owe them — you have no claim to lose. Only positive mark-to-market is at risk.
At the money,
is symmetric around zero, and the Bachelier result gives a closed form:
![]()
That
is where the factor of four comes from in a moment.
EE is the pricing quantity. CVA is the EE profile weighted by the counterparty’s default density and loss given default, integrated over the life:
![]()
You want the mean here because CVA is an expected loss, and expected losses are built from expectations. A quantile would be the wrong object entirely.
PFE is a quantile
Potential future exposure is a high percentile of the same distribution:
![]()
Here is the number worth memorising. For an at-the-money trade, EE and PFE scale with exactly the same
, so their ratio is a pure constant:
![]()
Ninety-fifth percentile PFE is 4.12 times EE. Ninety-ninth is 5.83 times. Constant across the whole profile, from six months to four and a half years.
Credit limits use PFE because limits exist to control the tail. A line sized on the mean would be breached roughly half the time by construction, which is not what anyone means by a limit.
One honest caveat, because the clean factor is an at-inception fact. The ratio holds because the trade is at the money. Once it moves in your favour the intrinsic value enters EE but not the tail multiplier, and the ratio compresses:
- at the money: 4.12
- 50bp in the money: 3.33
- 100bp: 2.77
- 400bp: 1.58
So use 4.12 as a sanity check on a fresh trade, not as a conversion factor on a seasoned book. If someone hands you a PFE that is 4.1 times EE on a deeply in-the-money position, something in the pipeline is wrong.
ENE, and the other side of the trade
Expected negative exposure mirrors EE:
![]()
This is your counterparty’s exposure to you, and it is what DVA is built on. At the money on a symmetric trade it is simply
, which is why DVA and CVA are close in magnitude for an interbank swap and diverge sharply once collateral, thresholds or asymmetric credit enter.
EPE, EEE and EEPE: the regulatory chain
Three definitions stacked on each other, and the order matters.
- EPE — expected positive exposure — is the time-average of EE over a horizon, normally one year.
- EEE — effective EE — is EE made non-decreasing:
. It ratchets and never falls. - EEPE — effective EPE — is the time-average of EEE.
The ratchet exists to stop a bank rolling short-dated trades and reporting an artificially low average. It penalises profiles that peak and then decay inside the window.
For a five-year swap, EE is still climbing at the one-year mark, so EEE equals EE and the ratchet does nothing. That leads people to conclude the effective machinery is decorative. It is not — it just does nothing on the trades most people look at first:
swap tenor peak EE at EPE EEPE EEPE/EPE
0.75y 0.46y 0.058 0.107 1.840
1.00y 0.46y 0.170 0.226 1.325
2.00y 0.96y 0.427 0.451 1.056
5.00y 1.96y 1.151 1.159 1.007
10.00y 3.96y 2.223 2.227 1.002
A ten-year swap gets a 0.2% uplift. A nine-month swap gets 84%. If your intuition for the effective floor was built on the long end of the book, a short-dated desk will surprise you.
Exposure at default under the internal model method then applies a multiplier:
![]()
The 1.4 is a supervisory add-on for correlation and concentration effects that a single-counterparty simulation does not capture. It is not a modelling output and you do not get to calibrate it away.
Which measure for which job
- CVA and XVA pricing — EE, discounted, under the risk-neutral measure. The mean, because CVA is an expected loss.
- DVA — ENE.
- Credit limits and lines — PFE at 95% or 99%. A quantile, because limits are tail control.
- Regulatory capital (IMM) — EEPE, then multiplied by
. - Model backtesting — the whole distribution, under the real-world measure. This one catches people out: the exposure model you calibrated to market-implied vols for CVA is the wrong calibration for backtesting, and supervisors will ask.
The code
import numpy as np
from scipy.stats import norm
N, MAT, FREQ = 100e6, 5.0, 2
K, SIG, r = 0.030, 0.0100, 0.030 # ATM, 100bp normal vol
def annuity(t):
pay = np.arange(1/FREQ, MAT+1e-9, 1/FREQ)
rem = pay[pay > t + 1e-9]
return np.sum(np.exp(-r*(rem-t)))/FREQ
ts = np.arange(0.0, MAT+1e-9, 1/24)
A = np.array([annuity(t) for t in ts])
sd = SIG*np.sqrt(ts)
EE = N*A*sd/np.sqrt(2*np.pi) # Bachelier, at the money
PFE95 = N*A*sd*norm.ppf(0.95)
EEE = np.maximum.accumulate(EE)
def avg(x, hor):
m = ts <= hor
return np.trapezoid(x[m], ts[m])/hor
print(f"peak EE at {ts[np.argmax(EE)]:.2f}y = {EE.max()/1e6:.3f}m")
print(f"PFE95/EE = {PFE95[24]/EE[24]:.2f}")
print(f"EPE {avg(EE,1.0)/1e6:.3f}m EEPE {avg(EEE,1.0)/1e6:.3f}m")
print(f"EAD = 1.4 * EEPE = {1.4*avg(EEE,1.0)/1e6:.3f}m")
Output:
peak EE at 1.96y = 1.867m
PFE95/EE = 4.12
EPE 1.151m EEPE 1.159m
EAD = 1.4 * EEPE = 1.623m
Cross-checked against 400,000 Monte Carlo paths: analytic EE at one year is 1.492m, simulated 1.493m.
Where this bites in practice
Reporting a limit on the wrong measure. If a utilisation report is built on EE when the limit was sized on 95% PFE, you are understating usage by a factor of four on fresh trades. That error does not announce itself. It surfaces the day a counterparty deteriorates and someone recomputes properly.
Assuming the effective floor is cosmetic. True on the long end, false on the short end, and the difference is 84% on a nine-month swap. Books that roll short-dated trades are exactly the ones the ratchet was written for.
Using one calibration everywhere. CVA wants risk-neutral. Backtesting wants real-world. PFE for limits is conventionally real-world too, though practice varies by institution and it is worth knowing which one your engine is actually running before you defend the number.
Reading the 4.12 as a law. It is a consequence of being at the money, and it decays to 1.58 by 400bp in the money. Useful as a smell test on new trades, misleading as a shortcut on a seasoned portfolio.
The takeaway
One simulation, one profile, five numbers, each answering a different question. EE is the mean and prices. PFE is a quantile and limits — roughly 4x EE at inception, less as the trade seasons. EEPE is the regulatory average with a ratchet that does nothing on long tenors and a great deal on short ones, then multiplied by 1.4. ENE is the mirror and gives DVA.
When someone asks what your exposure is, the useful reply is a question: exposure for what?
This is the kind of plumbing that decides whether an exposure engine is trusted or quietly worked around. If you want the stochastic calculus underneath it — the measure change, the martingale machinery, the numerical validation — 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.