EntityComponentCapital.java

  1. package org.drip.capital.allocation;

  2. /*
  3.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  4.  */

  5. /*!
  6.  * Copyright (C) 2020 Lakshmi Krishnamurthy
  7.  * Copyright (C) 2019 Lakshmi Krishnamurthy
  8.  *
  9.  *  This file is part of DROP, an open-source library targeting analytics/risk, transaction cost analytics,
  10.  *      asset liability management analytics, capital, exposure, and margin analytics, valuation adjustment
  11.  *      analytics, and portfolio construction analytics within and across fixed income, credit, commodity,
  12.  *      equity, FX, and structured products. It also includes auxiliary libraries for algorithm support,
  13.  *      numerical analysis, numerical optimization, spline builder, model validation, statistical learning,
  14.  *      and computational support.
  15.  *  
  16.  *      https://lakshmidrip.github.io/DROP/
  17.  *  
  18.  *  DROP is composed of three modules:
  19.  *  
  20.  *  - DROP Product Core - https://lakshmidrip.github.io/DROP-Product-Core/
  21.  *  - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
  22.  *  - DROP Computational Core - https://lakshmidrip.github.io/DROP-Computational-Core/
  23.  *
  24.  *  DROP Product Core implements libraries for the following:
  25.  *  - Fixed Income Analytics
  26.  *  - Loan Analytics
  27.  *  - Transaction Cost Analytics
  28.  *
  29.  *  DROP Portfolio Core implements libraries for the following:
  30.  *  - Asset Allocation Analytics
  31.  *  - Asset Liability Management Analytics
  32.  *  - Capital Estimation Analytics
  33.  *  - Exposure Analytics
  34.  *  - Margin Analytics
  35.  *  - XVA Analytics
  36.  *
  37.  *  DROP Computational Core implements libraries for the following:
  38.  *  - Algorithm Support
  39.  *  - Computation Support
  40.  *  - Function Analysis
  41.  *  - Model Validation
  42.  *  - Numerical Analysis
  43.  *  - Numerical Optimizer
  44.  *  - Spline Builder
  45.  *  - Statistical Learning
  46.  *
  47.  *  Documentation for DROP is Spread Over:
  48.  *
  49.  *  - Main                     => https://lakshmidrip.github.io/DROP/
  50.  *  - Wiki                     => https://github.com/lakshmiDRIP/DROP/wiki
  51.  *  - GitHub                   => https://github.com/lakshmiDRIP/DROP
  52.  *  - Repo Layout Taxonomy     => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
  53.  *  - Javadoc                  => https://lakshmidrip.github.io/DROP/Javadoc/index.html
  54.  *  - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
  55.  *  - Release Versions         => https://lakshmidrip.github.io/DROP/version.html
  56.  *  - Community Credits        => https://lakshmidrip.github.io/DROP/credits.html
  57.  *  - Issues Catalog           => https://github.com/lakshmiDRIP/DROP/issues
  58.  *  - JUnit                    => https://lakshmidrip.github.io/DROP/junit/index.html
  59.  *  - Jacoco                   => https://lakshmidrip.github.io/DROP/jacoco/index.html
  60.  *
  61.  *  Licensed under the Apache License, Version 2.0 (the "License");
  62.  *      you may not use this file except in compliance with the License.
  63.  *  
  64.  *  You may obtain a copy of the License at
  65.  *      http://www.apache.org/licenses/LICENSE-2.0
  66.  *  
  67.  *  Unless required by applicable law or agreed to in writing, software
  68.  *      distributed under the License is distributed on an "AS IS" BASIS,
  69.  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  70.  *  
  71.  *  See the License for the specific language governing permissions and
  72.  *      limitations under the License.
  73.  */

  74. /**
  75.  * <i>EntityComponentCapital</i> holds the Component Capital for each Entity. The References are:
  76.  *
  77.  * <br><br>
  78.  *  <ul>
  79.  *      <li>
  80.  *          Bank for International Supervision(2005): Stress Testing at Major Financial Institutions: Survey
  81.  *              Results and Practice https://www.bis.org/publ/cgfs24.htm
  82.  *      </li>
  83.  *      <li>
  84.  *          Glasserman, P. (2004): <i>Monte Carlo Methods in Financial Engineering</i> <b>Springer</b>
  85.  *      </li>
  86.  *      <li>
  87.  *          Kupiec, P. H. (2000): Stress Tests and Risk Capital <i>Risk</i> <b>2 (4)</b> 27-39
  88.  *      </li>
  89.  *  </ul>
  90.  *
  91.  *  <br><br>
  92.  *  <ul>
  93.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
  94.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/CapitalAnalyticsLibrary.md">Capital Analytics</a></li>
  95.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/capital/README.md">Basel Market Risk and Operational Capital</a></li>
  96.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/capital/allocation/README.md">Economic Risk Capital Entity Allocation</a></li>
  97.  *  </ul>
  98.  *
  99.  * @author Lakshmi Krishnamurthy
  100.  */

  101. public class EntityComponentCapital
  102. {
  103.     private org.drip.capital.allocation.EntityCapital _noStress = null;
  104.     private org.drip.capital.allocation.EntityCapital _systemic = null;
  105.     private double _noStressStandaloneMultiplier = java.lang.Double.NaN;
  106.     private double _systemicStandaloneMultiplier = java.lang.Double.NaN;
  107.     private org.drip.capital.allocation.EntityCapital _correlated = null;
  108.     private double _correlatedStandaloneMultiplier = java.lang.Double.NaN;
  109.     private org.drip.capital.allocation.EntityCapital _idiosyncratic = null;
  110.     private double _idiosyncraticStandaloneMultiplier = java.lang.Double.NaN;

  111.     private static final double NoStressComponentCapitalMultiplier (
  112.         final org.drip.capital.allocation.CorrelationCategoryBetaManager correlationCategoryBetaManager,
  113.         final org.drip.capital.allocation.EntityCapitalAssignmentSetting entityCapitalAssignmentSetting,
  114.         final java.util.Map<java.lang.String, java.lang.Double> proRataNormalizerMap,
  115.         final double unitFloatBeta)
  116.     {
  117.         if (org.drip.capital.allocation.EntityComponentAssignmentScheme.PRO_RATA ==
  118.             entityCapitalAssignmentSetting.noStressAllocationScheme())
  119.         {
  120.             return null == proRataNormalizerMap || !proRataNormalizerMap.containsKey (
  121.                 "NOSTRESS"
  122.             ) ? 0. : proRataNormalizerMap.get (
  123.                 "NOSTRESS"
  124.             );
  125.         }

  126.         org.drip.capital.allocation.CorrelationCategoryBeta betaLoading =
  127.             correlationCategoryBetaManager.correlationCategoryBeta (
  128.                 entityCapitalAssignmentSetting.noStressAllocationCategory()
  129.             );

  130.         int elasticity = betaLoading.elasticity();

  131.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FIXED == elasticity)
  132.         {
  133.             return betaLoading.loading();
  134.         }

  135.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FLOAT == elasticity)
  136.         {
  137.             return betaLoading.loading() * unitFloatBeta;
  138.         }

  139.         return 0.;
  140.     }

  141.     private static final double SystemicComponentCapitalMultiplier (
  142.         final org.drip.capital.allocation.CorrelationCategoryBetaManager correlationCategoryBetaManager,
  143.         final org.drip.capital.allocation.EntityCapitalAssignmentSetting entityCapitalAssignmentSetting,
  144.         final java.util.Map<java.lang.String, java.lang.Double> proRataNormalizerMap,
  145.         final double unitFloatBeta)
  146.     {
  147.         if (org.drip.capital.allocation.EntityComponentAssignmentScheme.PRO_RATA ==
  148.             entityCapitalAssignmentSetting.systemicAllocationScheme())
  149.         {
  150.             return null == proRataNormalizerMap || !proRataNormalizerMap.containsKey (
  151.                 "Systemic"
  152.             ) ? 0. : proRataNormalizerMap.get (
  153.                 "Systemic"
  154.             );
  155.         }

  156.         org.drip.capital.allocation.CorrelationCategoryBeta betaLoading =
  157.             correlationCategoryBetaManager.correlationCategoryBeta (
  158.                 entityCapitalAssignmentSetting.systemicAllocationCategory()
  159.             );

  160.         int elasticity = betaLoading.elasticity();

  161.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FIXED == elasticity)
  162.         {
  163.             return betaLoading.loading();
  164.         }

  165.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FLOAT == elasticity)
  166.         {
  167.             return betaLoading.loading() * unitFloatBeta;
  168.         }

  169.         return 0.;
  170.     }

  171.     private static final double CorrelatedComponentCapitalMultiplier (
  172.         final org.drip.capital.allocation.CorrelationCategoryBetaManager correlationCategoryBetaManager,
  173.         final org.drip.capital.allocation.EntityCapitalAssignmentSetting entityCapitalAssignmentSetting,
  174.         final java.util.Map<java.lang.String, java.lang.Double> proRataNormalizerMap,
  175.         final double unitFloatBeta)
  176.     {
  177.         if (org.drip.capital.allocation.EntityComponentAssignmentScheme.PRO_RATA ==
  178.             entityCapitalAssignmentSetting.correlatedAllocationScheme())
  179.         {
  180.             return null == proRataNormalizerMap || !proRataNormalizerMap.containsKey (
  181.                 "Correlated"
  182.             ) ? 0. : proRataNormalizerMap.get (
  183.                 "Correlated"
  184.             );
  185.         }

  186.         org.drip.capital.allocation.CorrelationCategoryBeta betaLoading =
  187.             correlationCategoryBetaManager.correlationCategoryBeta (
  188.                 entityCapitalAssignmentSetting.correlatedAllocationCategory()
  189.             );

  190.         int elasticity = betaLoading.elasticity();

  191.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FIXED == elasticity)
  192.         {
  193.             return betaLoading.loading();
  194.         }

  195.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FLOAT == elasticity)
  196.         {
  197.             return betaLoading.loading() * unitFloatBeta;
  198.         }

  199.         return 0.;
  200.     }

  201.     private static final double IdiosyncraticComponentCapitalMultiplier (
  202.         final org.drip.capital.allocation.CorrelationCategoryBetaManager correlationCategoryBetaManager,
  203.         final org.drip.capital.allocation.EntityCapitalAssignmentSetting entityCapitalAssignmentSetting,
  204.         final java.util.Map<java.lang.String, java.lang.Double> proRataNormalizerMap,
  205.         final double unitFloatBeta)
  206.     {
  207.         if (org.drip.capital.allocation.EntityComponentAssignmentScheme.PRO_RATA ==
  208.             entityCapitalAssignmentSetting.idiosyncraticAllocationScheme())
  209.         {
  210.             return null == proRataNormalizerMap || !proRataNormalizerMap.containsKey (
  211.                 "Idiosyncratic"
  212.             ) ? 0. : proRataNormalizerMap.get (
  213.                 "Idiosyncratic"
  214.             );
  215.         }

  216.         org.drip.capital.allocation.CorrelationCategoryBeta betaLoading =
  217.             correlationCategoryBetaManager.correlationCategoryBeta (
  218.                 entityCapitalAssignmentSetting.idiosyncraticAllocationCategory()
  219.             );

  220.         int elasticity = betaLoading.elasticity();

  221.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FIXED == elasticity)
  222.         {
  223.             return betaLoading.loading();
  224.         }

  225.         if (org.drip.capital.allocation.CorrelationCategoryBeta.ELASTICITY_FLOAT == elasticity)
  226.         {
  227.             return betaLoading.loading() * unitFloatBeta;
  228.         }

  229.         return 0.;
  230.     }

  231.     /**
  232.      * Construct the Entity Component Capital Instance from the Individual Component Capital
  233.      *
  234.      * @param noStressComponentCapital No Stress Capital Component
  235.      * @param noStressStandaloneMultiplier No-Stress Stand-alone Multiplier
  236.      * @param systemicComponentCapital Systemic Capital Component
  237.      * @param systemicStandaloneMultiplier Systemic Stand-alone Multiplier
  238.      * @param correlatedComponentCapital Correlated Capital Component
  239.      * @param correlatedStandaloneMultiplier Correlated Stand-alone Multiplier
  240.      * @param idiosyncraticComponentCapital Idiosyncratic Capital Component
  241.      * @param idiosyncraticStandaloneMultiplier Idiosyncratic Stand-alone Multiplier
  242.      * @param grossEntityAllocation Entity Gross Capital Allocation
  243.      *
  244.      * @return The Entity Component Capital Instance from the Individual Component Capital
  245.      */

  246.     public static final EntityComponentCapital FromComponentCapital (
  247.         final double noStressComponentCapital,
  248.         final double noStressStandaloneMultiplier,
  249.         final double systemicComponentCapital,
  250.         final double systemicStandaloneMultiplier,
  251.         final double correlatedComponentCapital,
  252.         final double correlatedStandaloneMultiplier,
  253.         final double idiosyncraticComponentCapital,
  254.         final double idiosyncraticStandaloneMultiplier,
  255.         final double grossEntityAllocation)
  256.     {
  257.         try
  258.         {
  259.             return new EntityComponentCapital (
  260.                 new org.drip.capital.allocation.EntityCapital (
  261.                     noStressComponentCapital,
  262.                     noStressComponentCapital / grossEntityAllocation
  263.                 ),
  264.                 noStressStandaloneMultiplier,
  265.                 new org.drip.capital.allocation.EntityCapital (
  266.                     systemicComponentCapital,
  267.                     systemicComponentCapital / grossEntityAllocation
  268.                 ),
  269.                 systemicStandaloneMultiplier,
  270.                 new org.drip.capital.allocation.EntityCapital (
  271.                     correlatedComponentCapital,
  272.                     correlatedComponentCapital / grossEntityAllocation
  273.                 ),
  274.                 correlatedStandaloneMultiplier,
  275.                 new org.drip.capital.allocation.EntityCapital (
  276.                     idiosyncraticComponentCapital,
  277.                     idiosyncraticComponentCapital / grossEntityAllocation
  278.                 ),
  279.                 idiosyncraticStandaloneMultiplier
  280.             );
  281.         }
  282.         catch (java.lang.Exception e)
  283.         {
  284.             e.printStackTrace();
  285.         }

  286.         return null;
  287.     }

  288.     /**
  289.      * Generate the Entity Component Capital from the PnL Attribution
  290.      *
  291.      * @param correlationCategoryBetaManager The Correlation Category Beta Manager
  292.      * @param entityCapitalAssignmentSetting The Entity Capital Component Setting
  293.      * @param pnlAttribution The PnL Attribution
  294.      * @param proRataNormalizerMap The Pro-Rata Normalizer Map
  295.      * @param unitFloatBeta Unit Float Beta
  296.      * @param grossEntityAllocation Entity Gross Allocated Capital
  297.      *
  298.      * @return The Entity Component Capital Instance from the PnL Attribution
  299.      */

  300.     public static final EntityComponentCapital FromPnLAttribution (
  301.         final org.drip.capital.allocation.CorrelationCategoryBetaManager correlationCategoryBetaManager,
  302.         final org.drip.capital.allocation.EntityCapitalAssignmentSetting entityCapitalAssignmentSetting,
  303.         final org.drip.capital.explain.PnLAttribution pnlAttribution,
  304.         final java.util.Map<java.lang.String, java.lang.Double> proRataNormalizerMap,
  305.         final double unitFloatBeta,
  306.         final double grossEntityAllocation)
  307.     {
  308.         double noStressStandaloneMultiplier = NoStressComponentCapitalMultiplier (
  309.             correlationCategoryBetaManager,
  310.             entityCapitalAssignmentSetting,
  311.             proRataNormalizerMap,
  312.             unitFloatBeta
  313.         );

  314.         double systemicStandaloneMultiplier = SystemicComponentCapitalMultiplier (
  315.             correlationCategoryBetaManager,
  316.             entityCapitalAssignmentSetting,
  317.             proRataNormalizerMap,
  318.             unitFloatBeta
  319.         );

  320.         double correlatedStandaloneMultiplier = CorrelatedComponentCapitalMultiplier (
  321.             correlationCategoryBetaManager,
  322.             entityCapitalAssignmentSetting,
  323.             proRataNormalizerMap,
  324.             unitFloatBeta
  325.         );

  326.         double idiosyncraticStandaloneMultiplier = IdiosyncraticComponentCapitalMultiplier (
  327.             correlationCategoryBetaManager,
  328.             entityCapitalAssignmentSetting,
  329.             proRataNormalizerMap,
  330.             unitFloatBeta
  331.         );

  332.         return null == correlationCategoryBetaManager ||
  333.             null == entityCapitalAssignmentSetting ||
  334.             null == pnlAttribution ? null :
  335.             FromComponentCapital (
  336.                 noStressStandaloneMultiplier * pnlAttribution.fsGrossPnL(),
  337.                 noStressStandaloneMultiplier,
  338.                 systemicStandaloneMultiplier * pnlAttribution.systemicPnL(),
  339.                 systemicStandaloneMultiplier,
  340.                 correlatedStandaloneMultiplier * pnlAttribution.correlatedPnL(),
  341.                 correlatedStandaloneMultiplier,
  342.                 idiosyncraticStandaloneMultiplier * pnlAttribution.idiosyncraticGrossPnL(),
  343.                 idiosyncraticStandaloneMultiplier,
  344.                 grossEntityAllocation
  345.             );
  346.     }

  347.     /**
  348.      * EntityComponentCapital Constructor
  349.      *
  350.      * @param noStress Entity No Stress Capital
  351.      * @param noStressStandaloneMultiplier No-Stress Stand-alone Multiplier
  352.      * @param systemic Entity Systemic Capital
  353.      * @param systemicStandaloneMultiplier Systemic Stand-alone Multiplier
  354.      * @param correlated Entity cBSST Capital
  355.      * @param correlatedStandaloneMultiplier Correlated Stand-alone Multiplier
  356.      * @param idiosyncratic Entity Idiosyncratic Capital
  357.      * @param idiosyncraticStandaloneMultiplier Idiosyncratic Stand-alone Multiplier
  358.      *
  359.      * @throws java.lang.Exception Thrown if the Inputs are Invalid
  360.      */

  361.     public EntityComponentCapital (
  362.         final org.drip.capital.allocation.EntityCapital noStress,
  363.         final double noStressStandaloneMultiplier,
  364.         final org.drip.capital.allocation.EntityCapital systemic,
  365.         final double systemicStandaloneMultiplier,
  366.         final org.drip.capital.allocation.EntityCapital correlated,
  367.         final double correlatedStandaloneMultiplier,
  368.         final org.drip.capital.allocation.EntityCapital idiosyncratic,
  369.         final double idiosyncraticStandaloneMultiplier)
  370.         throws java.lang.Exception
  371.     {
  372.         if (null == (_noStress = noStress) || !org.drip.numerical.common.NumberUtil.IsValid (
  373.                 _noStressStandaloneMultiplier = noStressStandaloneMultiplier
  374.             ) || null == (_systemic = systemic) || !org.drip.numerical.common.NumberUtil.IsValid (
  375.                 _systemicStandaloneMultiplier = systemicStandaloneMultiplier
  376.             ) || null == (_correlated = correlated) || !org.drip.numerical.common.NumberUtil.IsValid (
  377.                 _correlatedStandaloneMultiplier = correlatedStandaloneMultiplier
  378.             ) || null == (_idiosyncratic = idiosyncratic) || !org.drip.numerical.common.NumberUtil.IsValid (
  379.                 _idiosyncraticStandaloneMultiplier = idiosyncraticStandaloneMultiplier
  380.             )
  381.         )
  382.         {
  383.             throw new java.lang.Exception (
  384.                 "EntityComponentCapital Constructor => Invalid Inputs"
  385.             );
  386.         }
  387.     }

  388.     /**
  389.      * Retrieve the Entity No Stress Capital
  390.      *
  391.      * @return The Entity No Stress Capital
  392.      */

  393.     public org.drip.capital.allocation.EntityCapital noStress()
  394.     {
  395.         return _noStress;
  396.     }

  397.     /**
  398.      * Retrieve the Entity Systemic Capital
  399.      *
  400.      * @return The Entity Systemic Capital
  401.      */

  402.     public org.drip.capital.allocation.EntityCapital systemic()
  403.     {
  404.         return _systemic;
  405.     }

  406.     /**
  407.      * Retrieve the Systemic Stand-alone Multiplier
  408.      *
  409.      * @return The Systemic Stand-alone Multiplier
  410.      */

  411.     public double systemicStandaloneMultiplier()
  412.     {
  413.         return _systemicStandaloneMultiplier;
  414.     }

  415.     /**
  416.      * Retrieve the Correlated Stand-alone Multiplier
  417.      *
  418.      * @return The Correlated Stand-alone Multiplier
  419.      */

  420.     public double correlatedStandaloneMultiplier()
  421.     {
  422.         return _correlatedStandaloneMultiplier;
  423.     }

  424.     /**
  425.      * Retrieve the Idiosyncratic Stand-alone Multiplier
  426.      *
  427.      * @return The Idiosyncratic Stand-alone Multiplier
  428.      */

  429.     public double idiosyncraticStandaloneMultiplier()
  430.     {
  431.         return _idiosyncraticStandaloneMultiplier;
  432.     }

  433.     /**
  434.      * Retrieve the No-Stress Stand-alone Multiplier
  435.      *
  436.      * @return The No-Stress Stand-alone Multiplier
  437.      */

  438.     public double noStressStandaloneMultiplier()
  439.     {
  440.         return _noStressStandaloneMultiplier;
  441.     }

  442.     /**
  443.      * Retrieve the Entity Correlated Capital
  444.      *
  445.      * @return The Entity Correlated Capital
  446.      */

  447.     public org.drip.capital.allocation.EntityCapital correlated()
  448.     {
  449.         return _correlated;
  450.     }

  451.     /**
  452.      * Retrieve the Entity Idiosyncratic Capital
  453.      *
  454.      * @return The Entity Idiosyncratic Capital
  455.      */

  456.     public org.drip.capital.allocation.EntityCapital idiosyncratic()
  457.     {
  458.         return _idiosyncratic;
  459.     }

  460.     /**
  461.      * Retrieve the Total Entity Capital
  462.      *
  463.      * @return The Total Entity Capital
  464.      */

  465.     public org.drip.capital.allocation.EntityCapital total()
  466.     {
  467.         try
  468.         {
  469.             return new org.drip.capital.allocation.EntityCapital (
  470.                 _noStress.absolute() + _systemic.absolute() + _correlated.absolute() +
  471.                     _idiosyncratic.absolute(),
  472.                 _noStress.fractional() + _systemic.fractional() + _correlated.fractional() +
  473.                     _idiosyncratic.fractional()
  474.             );
  475.         }
  476.         catch (java.lang.Exception e)
  477.         {
  478.             e.printStackTrace();
  479.         }

  480.         return null;
  481.     }
  482. }