Class FrtbDrc

java.lang.Object
com.quantfinlib.risk.FrtbDrc

public final class FrtbDrc extends Object
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 Classes
    Modifier and Type
    Class
    Description
    static enum 
    Default risk weights by credit quality (MAR22.24 Table 2, verified).
    static final record 
    A net JTD per obligor (signed) and its risk weight.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final double
     
    static final double
     
    static final double
     
    static final double
    LGD by seniority (MAR22.12, verified: equity and non-senior 100%, senior 75%, covered bonds 25%).
  • Method Summary

    Modifier and Type
    Method
    Description
    static double
    DRC of one bucket, max(Σ RW·long − HBR·Σ RW·|short|, 0) (MAR22.25, verified).
    static double
    Hedge benefit ratio HBR = Σ long / (Σ long + Σ|short|), not risk-weighted (MAR22.23, verified).
    static double
    jtd(double notional, double lgd, double pnl)
    Gross JTD of one position.
    static double
    maturityScale(double maturityYears)
    Maturity scaling min(max(M, 0.25), 1); M in years (MAR22.15 and MAR22.18 floor, verified).
    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)).
    static double
    Total non-securitisation DRC: simple sum of bucket charges (MAR22.26, verified).

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LGD_SENIOR

      public static final double LGD_SENIOR
      LGD 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. notional is signed (positive long credit exposure, negative short); pnl is 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

      public static double hedgeBenefitRatio(List<FrtbDrc.NetJtd> bucket)
      Hedge benefit ratio HBR = Σ long / (Σ long + Σ|short|), not risk-weighted (MAR22.23, verified).
    • bucketCharge

      public static double bucketCharge(List<FrtbDrc.NetJtd> bucket)
      DRC of one bucket, max(Σ RW·long − HBR·Σ RW·|short|, 0) (MAR22.25, verified).
    • total

      public static double total(List<List<FrtbDrc.NetJtd>> buckets)
      Total non-securitisation DRC: simple sum of bucket charges (MAR22.26, verified).