Class SaCcrHaircuts

java.lang.Object
com.quantfinlib.risk.SaCcrHaircuts

public final class SaCcrHaircuts extends Object
Supervisory haircuts for the collateral C and the NICA that enter SA-CCR. BCBS 279 (March 2014) values non-cash collateral with the supervisory haircuts of the comprehensive approach to credit risk mitigation. Two tables are offered. SaCcrHaircuts.Table.BASEL_II_2006 is the June 2006 Basel II text (BCBS 128): the table of paragraph 151, the 8% currency add-on of paragraph 152, and the square-root-of-time scaling of paragraphs 168-169. SaCcrHaircuts.Table.CRE22 is the current consolidated Basel Framework (December 2017 revision): the table of CRE22.49 for jurisdictions that use external ratings, the same 8% add-on in CRE22.52, and the same scaling in CRE22.56-59. Every value below was checked against those texts (published reference).

The plain idea: collateral the bank holds may fall in value before it can be sold, so it counts for less than its market value; collateral the bank has posted may rise in value and be lost if the counterparty fails, so it counts for more. Formally, for market value X and haircut H (as a decimal),

  held:   C = X (1 - H - H_fx)
  posted: C = -X (1 + H + H_fx)
  H_N = H_10 sqrt(N / 10)   for a holding period of N business days

Worked example (own hand computation): 1,000 of A-rated corporate bonds with 3 years to maturity, held, in a different currency, on a 10-day period: H = 6%, H_fx = 8%, C = 1,000 * 0.86 = 860. On a 20-day period both haircuts scale by sqrt(2): C = 1,000 (1 - 0.14 sqrt 2) = 802.0.

Table values (10-day, percent): sovereign debt AAA to AA- 0.5 / 2 / 4 for residual maturity up to 1y / 1y to 5y / over 5y, A+ to BBB- 1 / 3 / 6, BB+ to BB- 15; other issuers AAA to AA- 1 / 4 / 8, A+ to BBB- 2 / 6 / 12; main-index equities and gold 15; other listed equities 25; cash in the same currency 0 (BCBS 128 para 151).

CRE22.49 values (10-day, percent), buckets up to 1y / 1y to 3y / 3y to 5y / 5y to 10y / over 10y: sovereign AAA to AA- 0.5 / 2 / 2 / 4 / 4, A+ to BBB- 1 / 3 / 3 / 6 / 6, BB+ to BB- 15; other issuers AAA to AA- 1 / 3 / 4 / 6 / 12, A+ to BBB- 2 / 4 / 6 / 12 / 20, BB not eligible; main-index equities and gold 20; other listed equities 30; cash 0. Worked example (own hand computation): the same 1,000 of A-rated 3-year corporate bonds, held, different currency, 10 days, gives H = 4% under CRE22, so C = 1,000 * (1 - 0.04 - 0.08) = 880.

Securitisation rows of CRE22.49 (10-day, percent, same buckets): AAA to AA- 2 / 8 / 8 / 16 / 16, A+ to BBB- 4 / 12 / 12 / 24 / 24, BB not eligible (published reference). The 2006 table of paragraph 151 has no securitisation row, so SaCcrHaircuts.CollateralKind.SECURITISATION is rejected under SaCcrHaircuts.Table.BASEL_II_2006.

SaCcrHaircuts.Table.CRE22_NO_EXTERNAL_RATINGS is the CRE22.50 table for jurisdictions that do not allow external ratings. Debt is classed by SaCcrHaircuts.NoRatingsDebtClass instead of a rating and goes through haircut10DayNoExternalRatings(SaCcrHaircuts.NoRatingsDebtClass, double): sovereigns by issuer risk weight 0% 0.5 / 2 / 2 / 4 / 4, 20% or 50% 1 / 3 / 3 / 6 / 6, 100% 15; other investment-grade non-securitisation 2 / 4 / 6 / 12 / 20; senior securitisation with SA risk weight under 100% 4 / 12 / 12 / 24 / 24; main-index equities and gold 20; other listed equities 30; cash 0; other exposure types 30 (published reference). Worked example (own hand computation): 1,000 of a senior securitisation with SA risk weight 50% and 4 years to run, held, same currency, 10 days: H = 12%, C = 880. UCITS and mutual funds take the highest haircut of what the mandate allows (fundHaircut10DayMandate(double...)) or, where the bank may look through, the weighted average of the holdings (fundHaircut10DayLookThrough(double[], double[])). Research lane, deterministic.

  • Field Details

    • CURRENCY_MISMATCH

      public static final double CURRENCY_MISMATCH
      Currency-mismatch add-on H_fx on a 10-day holding period (BCBS 128 para 152; CRE22.52).
      See Also:
  • Method Details

    • haircut10Day

      public static double haircut10Day(SaCcrHaircuts.Table table, SaCcrHaircuts.CollateralKind kind, SaCcrHaircuts.DebtRating rating, double maturityYears)
      Supervisory haircut on a 10-day holding period from the chosen table.
      Parameters:
      table - BCBS 128 para 151 or CRE22.49
      kind - collateral kind
      rating - issue rating for debt, ignored (may be null) otherwise
      maturityYears - residual maturity for debt (≥ 0), ignored otherwise
      Returns:
      H as a decimal
    • haircut10DayNoExternalRatings

      public static double haircut10DayNoExternalRatings(SaCcrHaircuts.NoRatingsDebtClass debtClass, double maturityYears)
      Supervisory haircut on a 10-day holding period for debt under the CRE22.50 table (jurisdictions without external ratings).
      Parameters:
      debtClass - issuer risk-weight class or securitisation class
      maturityYears - residual maturity (≥ 0, finite)
      Returns:
      H as a decimal
    • fundHaircut10DayMandate

      public static double fundHaircut10DayMandate(double... mandateHaircuts)
      10-day haircut on units of a UCITS or mutual fund under the mandate rule: the highest haircut that applies to any security the fund can invest in (CRE22.49 and CRE22.50, row "UCITS/mutual funds"; published reference). The caller supplies the haircut of each instrument class in the mandate, from haircut10Day(SaCcrHaircuts.Table, SaCcrHaircuts.CollateralKind, SaCcrHaircuts.DebtRating, double) or haircut10DayNoExternalRatings(SaCcrHaircuts.NoRatingsDebtClass, double). Eligibility is the caller's check: daily public price and a mandate limited to eligible instruments (CRE22.34(6), CRE22.45(3); hedging derivatives allowed by footnote 139).
      Parameters:
      mandateHaircuts - 10-day haircuts in [0, 1], at least one
      Returns:
      the largest of them
    • fundHaircut10DayLookThrough

      public static double fundHaircut10DayLookThrough(double[] weights, double[] haircuts)
      10-day haircut on fund units under the look-through approach: the weighted average of the haircuts of the instruments the fund holds, available only when the bank may apply the LTA for equity investments in funds (CRE22.49 and CRE22.50, row "UCITS/mutual funds"; published reference). Weights are the holdings' shares of fund value and must sum to 1 within 1e-9 (library reading: the text says "weighted average" without fixing the weights; value shares are the only weights under which the haircut matches the value at risk of the units).
      Parameters:
      weights - holding weights, each at least 0
      haircuts - 10-day haircut of each holding, in [0, 1]
      Returns:
      the weighted average haircut
    • collateralValue

      public static double collateralValue(double marketValue, double haircut10Day, boolean currencyMismatch, double holdingBusinessDays, boolean held)
      Haircut value of one collateral item from a 10-day haircut the caller already has (for example from haircut10DayNoExternalRatings(SaCcrHaircuts.NoRatingsDebtClass, double)).
      Parameters:
      marketValue - X (≥ 0)
      haircut10Day - H_10
      currencyMismatch - true when the currencies differ
      holdingBusinessDays - holding period N
      held - true for collateral held, false for posted
      Returns:
      the signed contribution to C
    • haircut10Day

      public static double haircut10Day(SaCcrHaircuts.CollateralKind kind, SaCcrHaircuts.DebtRating rating, double maturityYears)
      Supervisory haircut on a 10-day holding period, BCBS 128 para 151 (the 2006 table, the default kept for 2.2 compatibility).
      Parameters:
      kind - collateral kind
      rating - issue rating for debt, ignored (may be null) otherwise
      maturityYears - residual maturity for debt (≥ 0), ignored otherwise
      Returns:
      H as a decimal
    • scale

      public static double scale(double haircut10Day, double holdingBusinessDays)
      Scales a 10-day haircut to N business days by the square-root-of-time rule, H_N = H_10 sqrt(N / 10) (BCBS 128 paras 168-169; CRE22.56-59).
      Parameters:
      haircut10Day - H_10
      holdingBusinessDays - N > 0
      Returns:
      H_N
    • collateralValue

      public static double collateralValue(SaCcrHaircuts.Table table, double marketValue, SaCcrHaircuts.CollateralKind kind, SaCcrHaircuts.DebtRating rating, double maturityYears, boolean currencyMismatch, double holdingBusinessDays, boolean held)
      Haircut value of one collateral item for C or NICA, from the chosen table.
      Parameters:
      table - BCBS 128 para 151 or CRE22.49
      marketValue - X, the market value (≥ 0)
      kind - collateral kind
      rating - issue rating for debt, else null
      maturityYears - residual maturity for debt, else 0
      currencyMismatch - true when the currencies differ
      holdingBusinessDays - holding period N
      held - true for collateral held, false for posted
      Returns:
      the signed contribution to C
    • collateralValue

      public static double collateralValue(double marketValue, SaCcrHaircuts.CollateralKind kind, SaCcrHaircuts.DebtRating rating, double maturityYears, boolean currencyMismatch, double holdingBusinessDays, boolean held)
      Haircut value of one collateral item for C or NICA, BCBS 128 para 151 table.
      Parameters:
      marketValue - X, the market value (≥ 0)
      kind - collateral kind
      rating - issue rating for debt, else null
      maturityYears - residual maturity for debt, else 0
      currencyMismatch - true when the collateral currency differs from the settlement currency
      holdingBusinessDays - holding period N (10 for the table values; the caller picks it, for example the MPOR)
      held - true for collateral the bank holds, false for collateral it has posted
      Returns:
      the signed contribution to C: positive held, negative posted