Class FrtbDrc
java.lang.Object
com.quantfinlib.risk.FrtbDrc
FRTB standardised default risk charge (DRC) for non-securitisation
positions, styled after BCBS d457 chapter MAR22. Not certified.
Securitisations (non-CTP and CTP, MAR22.27 to MAR22.45) are in
FrtbDrcSecuritisation.
Plain idea. Each position's loss if the issuer defaulted tomorrow (jump to default, JTD) is scaled down for maturities under a year, longs and shorts of the same obligor are netted, and in each bucket the risk-weighted net longs are offset by risk-weighted net shorts only to the extent of the hedge benefit ratio. Buckets are summed with no diversification.
Formal statement (per MAR22).
JTD_long = max(LGD·notional + P&L, 0), JTD_short = min(−LGD·notional + P&L, 0) scaled JTD = JTD · min(max(M, 0.25), 1) WtS = Σ JTD_long / (Σ JTD_long + Σ |JTD_short|) DRC_b = max(Σ RW·JTD_long − WtS · Σ RW·|JTD_short|, 0)
Worked example (own test): one bucket with a net long of 100 at RW 6% and a net short of 50 at RW 3%: WtS = 100/150, DRC = 6 − (2/3)·1.5 = 5.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumDefault risk weights by credit quality (MAR22.24 Table 2, verified).static final recordA net JTD per obligor (signed) and its risk weight. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final doublestatic final doublestatic final doublestatic final doubleLGD by seniority (MAR22.12, verified: equity and non-senior 100%, senior 75%, covered bonds 25%). -
Method Summary
Modifier and TypeMethodDescriptionstatic doublebucketCharge(List<FrtbDrc.NetJtd> bucket) DRC of one bucket, max(Σ RW·long − HBR·Σ RW·|short|, 0) (MAR22.25, verified).static doublehedgeBenefitRatio(List<FrtbDrc.NetJtd> bucket) Hedge benefit ratio HBR = Σ long / (Σ long + Σ|short|), not risk-weighted (MAR22.23, verified).static doublejtd(double notional, double lgd, double pnl) Gross JTD of one position.static doublematurityScale(double maturityYears) Maturity scaling min(max(M, 0.25), 1); M in years (MAR22.15 and MAR22.18 floor, verified).static doublenetObligor(double[] grossJtd, double[] maturityYears) Net JTD of one obligor from its gross JTDs (signed) and maturities in years: Σ JTD_i·min(max(M_i, 0.25), 1) (MAR22.15, MAR22.19(3)).static doubletotal(List<List<FrtbDrc.NetJtd>> buckets) Total non-securitisation DRC: simple sum of bucket charges (MAR22.26, verified).
-
Field Details
-
LGD_SENIOR
public static final double LGD_SENIORLGD by seniority (MAR22.12, verified: equity and non-senior 100%, senior 75%, covered bonds 25%).- See Also:
-
LGD_NON_SENIOR
public static final double LGD_NON_SENIOR- See Also:
-
LGD_EQUITY
public static final double LGD_EQUITY- See Also:
-
LGD_COVERED_BOND
public static final double LGD_COVERED_BOND- See Also:
-
-
Method Details
-
jtd
public static double jtd(double notional, double lgd, double pnl) Gross JTD of one position.notionalis signed (positive long credit exposure, negative short);pnlis the market value less notional already recognised (MAR22.11, verified). -
maturityScale
public static double maturityScale(double maturityYears) Maturity scaling min(max(M, 0.25), 1); M in years (MAR22.15 and MAR22.18 floor, verified). -
netObligor
public static double netObligor(double[] grossJtd, double[] maturityYears) Net JTD of one obligor from its gross JTDs (signed) and maturities in years: Σ JTD_i·min(max(M_i, 0.25), 1) (MAR22.15, MAR22.19(3)). The caller must only pass shorts that may offset the longs, ie of the same or lower seniority (MAR22.19(1)). -
hedgeBenefitRatio
Hedge benefit ratio HBR = Σ long / (Σ long + Σ|short|), not risk-weighted (MAR22.23, verified). -
bucketCharge
DRC of one bucket, max(Σ RW·long − HBR·Σ RW·|short|, 0) (MAR22.25, verified). -
total
Total non-securitisation DRC: simple sum of bucket charges (MAR22.26, verified).
-