CapitalSegment.java

  1. package org.drip.capital.entity;

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

  102. public abstract class CapitalSegment
  103.     implements org.drip.capital.entity.CapitalSimulator
  104. {
  105.     private org.drip.capital.label.CapitalSegmentCoordinate _coordinate = null;

  106.     protected CapitalSegment (
  107.         final org.drip.capital.label.CapitalSegmentCoordinate coordinate)
  108.         throws java.lang.Exception
  109.     {
  110.         if (null == (_coordinate = coordinate))
  111.         {
  112.             throw new java.lang.Exception (
  113.                 "CapitalSegment Constructor => Invalid Inputs"
  114.             );
  115.         }
  116.     }

  117.     /**
  118.      * Retrieve the Capital Segment Coordinate
  119.      *
  120.      * @return Capital Segment Coordinate
  121.      */

  122.     public org.drip.capital.label.CapitalSegmentCoordinate coordinate()
  123.     {
  124.         return _coordinate;
  125.     }

  126.     /**
  127.      * Retrieve the Array of Capital Units
  128.      *
  129.      * @return Array of Capital Units
  130.      */

  131.     public abstract org.drip.capital.entity.CapitalUnit[] capitalUnitArray();

  132.     /**
  133.      * Generate the Grid of Capital Unit Path Realizations
  134.      *
  135.      * @param simulationControl Simulation Settings
  136.      * @param simulationPnLControl PnL Settings
  137.      *
  138.      * @return Grid of Capital Unit Path Realizations
  139.      */

  140.     public org.drip.capital.simulation.PathPnLRealization[][] capitalUnitPathPnLRealizationGrid (
  141.         final org.drip.capital.setting.SimulationControl simulationControl,
  142.         final org.drip.capital.setting.SimulationPnLControl simulationPnLControl)
  143.     {
  144.         org.drip.capital.entity.CapitalUnit[] capitalUnitArray = capitalUnitArray();

  145.         int capitalUnitCount = capitalUnitArray.length;
  146.         org.drip.capital.simulation.PathPnLRealization[][] capitalUnitPathPnLRealizationGrid = new
  147.             org.drip.capital.simulation.PathPnLRealization[capitalUnitCount][];

  148.         for (int capitalUnitIndex = 0; capitalUnitIndex < capitalUnitCount; ++capitalUnitIndex)
  149.         {
  150.             if (null == (capitalUnitPathPnLRealizationGrid[capitalUnitIndex] =
  151.                 capitalUnitArray[capitalUnitIndex].pathPnLRealizationArray (
  152.                     simulationControl,
  153.                     simulationPnLControl
  154.                 )
  155.             ))
  156.             {
  157.                 return null;
  158.             }
  159.         }

  160.         return capitalUnitPathPnLRealizationGrid;
  161.     }

  162.     @Override public org.drip.capital.simulation.PathPnLRealization[] pathPnLRealizationArray (
  163.         final org.drip.capital.setting.SimulationControl simulationControl,
  164.         final org.drip.capital.setting.SimulationPnLControl simulationPnLControl)
  165.     {
  166.         int pathCount = simulationControl.pathCount();

  167.         org.drip.capital.simulation.PathPnLRealization[][] capitalUnitPathPnLRealizationGrid =
  168.             capitalUnitPathPnLRealizationGrid (
  169.                 simulationControl,
  170.                 simulationPnLControl
  171.             );

  172.         if (null == capitalUnitPathPnLRealizationGrid)
  173.         {
  174.             return null;
  175.         }

  176.         org.drip.capital.entity.CapitalUnit[] capitalUnitArray = capitalUnitArray();

  177.         int capitalUnitCount = capitalUnitArray.length;
  178.         org.drip.capital.simulation.PathPnLRealization[] pathPnLRealizationArray =
  179.             new org.drip.capital.simulation.PathPnLRealization[pathCount];

  180.         for (int pathIndex = 0;
  181.             pathIndex < pathCount;
  182.             ++pathIndex)
  183.         {
  184.             org.drip.capital.simulation.PathPnLRealization[] singlePathPnLRealizationArray =
  185.                 new org.drip.capital.simulation.PathPnLRealization[capitalUnitCount];

  186.             for (int capitalUnitIndex = 0;
  187.                 capitalUnitIndex < capitalUnitCount;
  188.                 ++capitalUnitIndex)
  189.             {
  190.                 singlePathPnLRealizationArray[capitalUnitIndex] =
  191.                     capitalUnitPathPnLRealizationGrid[capitalUnitIndex][pathIndex];
  192.             }

  193.             if (null == (pathPnLRealizationArray[pathIndex] =
  194.                     org.drip.capital.simulation.PathPnLRealization.Combine (
  195.                         singlePathPnLRealizationArray
  196.                     )
  197.                 )
  198.             )
  199.             {
  200.                 return null;
  201.             }
  202.         }

  203.         return pathPnLRealizationArray;
  204.     }

  205.     @Override public org.drip.capital.simulation.CapitalSegmentPathEnsemble pathEnsemble (
  206.         final org.drip.capital.setting.SimulationControl simulationControl,
  207.         final org.drip.capital.setting.SimulationPnLControl simulationPnLControl)
  208.     {
  209.         org.drip.capital.simulation.PathPnLRealization[][] capitalUnitPathPnLRealizationGrid =
  210.             capitalUnitPathPnLRealizationGrid (
  211.                 simulationControl,
  212.                 simulationPnLControl
  213.             );

  214.         if (null == capitalUnitPathPnLRealizationGrid)
  215.         {
  216.             return null;
  217.         }

  218.         int pathCount = simulationControl.pathCount();

  219.         java.util.Map<java.lang.String, org.drip.capital.simulation.PathEnsemble> pathEnsembleMap = new
  220.             org.drip.analytics.support.CaseInsensitiveHashMap<org.drip.capital.simulation.PathEnsemble>();

  221.         org.drip.capital.entity.CapitalUnit[] capitalUnitArray = capitalUnitArray();

  222.         int capitalUnitCount = capitalUnitArray.length;
  223.         org.drip.capital.simulation.CapitalSegmentPathEnsemble capitalSegmentPathEnsemble = null;
  224.         org.drip.capital.simulation.PathPnLRealization[] pathPnLRealizationArray = new
  225.             org.drip.capital.simulation.PathPnLRealization[pathCount];

  226.         for (int capitalUnitIndex = 0;
  227.             capitalUnitIndex < capitalUnitCount;
  228.             ++capitalUnitIndex)
  229.         {
  230.             org.drip.capital.simulation.CapitalUnitPathEnsemble capitalUnitPathEnsemble =
  231.                 new org.drip.capital.simulation.CapitalUnitPathEnsemble();

  232.             for (org.drip.capital.simulation.PathPnLRealization pathPnLRealization :
  233.                 capitalUnitPathPnLRealizationGrid[capitalUnitIndex])
  234.             {
  235.                 if (!capitalUnitPathEnsemble.addPathPnLRealization (pathPnLRealization))
  236.                 {
  237.                     return null;
  238.                 }
  239.             }

  240.             pathEnsembleMap.put (
  241.                 capitalUnitArray[capitalUnitIndex].coordinate().fullyQualifiedName(),
  242.                 capitalUnitPathEnsemble
  243.             );
  244.         }

  245.         try
  246.         {
  247.             capitalSegmentPathEnsemble = new org.drip.capital.simulation.CapitalSegmentPathEnsemble (
  248.                 pathEnsembleMap
  249.             );
  250.         }
  251.         catch (java.lang.Exception e)
  252.         {
  253.             e.printStackTrace();

  254.             return null;
  255.         }

  256.         for (int pathIndex = 0;
  257.             pathIndex < pathCount;
  258.             ++pathIndex)
  259.         {
  260.             org.drip.capital.simulation.PathPnLRealization[] singlePathPnLRealizationArray =
  261.                 new org.drip.capital.simulation.PathPnLRealization[capitalUnitCount];

  262.             for (int capitalUnitIndex = 0;
  263.                 capitalUnitIndex < capitalUnitCount;
  264.                 ++capitalUnitIndex)
  265.             {
  266.                 singlePathPnLRealizationArray[capitalUnitIndex] =
  267.                     capitalUnitPathPnLRealizationGrid[capitalUnitIndex][pathIndex];
  268.             }

  269.             if (null == (pathPnLRealizationArray[pathIndex] =
  270.                     org.drip.capital.simulation.PathPnLRealization.Combine (
  271.                         singlePathPnLRealizationArray
  272.                     )
  273.                 )
  274.             )
  275.             {
  276.                 return null;
  277.             }
  278.         }

  279.         for (org.drip.capital.simulation.PathPnLRealization pathPnLRealization : pathPnLRealizationArray)
  280.         {
  281.             if (!capitalSegmentPathEnsemble.addPathPnLRealization (
  282.                 pathPnLRealization
  283.             ))
  284.             {
  285.                 return null;
  286.             }
  287.         }

  288.         return capitalSegmentPathEnsemble;
  289.     }

  290.     /**
  291.      * Generate the Simulation Path Ensemble Constricted to the specified Path Ensemble Map
  292.      *
  293.      * @param pathEnsembleMap The Path Ensemble Constriction Map
  294.      *
  295.      * @return The Constricted Simulation Path Ensemble
  296.      */

  297.     public org.drip.capital.simulation.CapitalSegmentPathEnsemble pathEnsemble (
  298.         final java.util.Map<java.lang.String, org.drip.capital.simulation.PathEnsemble> pathEnsembleMap)
  299.     {
  300.         if (null == pathEnsembleMap || 0 == pathEnsembleMap.size())
  301.         {
  302.             return null;
  303.         }

  304.         java.util.Map<java.lang.String, org.drip.capital.simulation.PathEnsemble>
  305.             constrictedPathEnsembleMap = new
  306.                 org.drip.analytics.support.CaseInsensitiveHashMap<org.drip.capital.simulation.PathEnsemble>();

  307.         org.drip.capital.entity.CapitalUnit[] capitalUnitArray = capitalUnitArray();

  308.         int pathCount = -1;
  309.         int capitalUnitCount = capitalUnitArray.length;
  310.         org.drip.capital.simulation.PathPnLRealization[][] capitalUnitPathPnLRealizationGrid =
  311.             new org.drip.capital.simulation.PathPnLRealization[capitalUnitCount][];
  312.         org.drip.capital.simulation.CapitalSegmentPathEnsemble constrictedCapitalSegmentPathEnsemble =
  313.             null;

  314.         for (int capitalUnitIndex = 0;
  315.             capitalUnitIndex < capitalUnitCount;
  316.             ++capitalUnitIndex)
  317.         {
  318.             java.lang.String capitalUnitCoordinateFQN =
  319.                 capitalUnitArray[capitalUnitIndex].coordinate().fullyQualifiedName();

  320.             if (!pathEnsembleMap.containsKey (
  321.                 capitalUnitCoordinateFQN
  322.             ))
  323.             {
  324.                 return null;
  325.             }

  326.             org.drip.capital.simulation.PathEnsemble pathEnsemble = pathEnsembleMap.get (
  327.                 capitalUnitCoordinateFQN
  328.             );

  329.             constrictedPathEnsembleMap.put (
  330.                 capitalUnitCoordinateFQN,
  331.                 pathEnsemble
  332.             );

  333.             capitalUnitPathPnLRealizationGrid[capitalUnitIndex] = (
  334.                 (org.drip.capital.simulation.CapitalUnitPathEnsemble) pathEnsemble
  335.             ).pathPnLRealizationArray();

  336.             if (0 == capitalUnitIndex)
  337.             {
  338.                 pathCount = pathEnsemble.count();
  339.             }
  340.         }

  341.         try
  342.         {
  343.             constrictedCapitalSegmentPathEnsemble = new
  344.                 org.drip.capital.simulation.CapitalSegmentPathEnsemble (
  345.                     constrictedPathEnsembleMap
  346.                 );
  347.         }
  348.         catch (java.lang.Exception e)
  349.         {
  350.             e.printStackTrace();

  351.             return null;
  352.         }

  353.         org.drip.capital.simulation.PathPnLRealization[] pathPnLRealizationArray =
  354.             new org.drip.capital.simulation.PathPnLRealization[pathCount];

  355.         for (int pathIndex = 0;
  356.             pathIndex < pathCount;
  357.             ++pathIndex)
  358.         {
  359.             org.drip.capital.simulation.PathPnLRealization[] singlePathPnLRealizationArray =
  360.                 new org.drip.capital.simulation.PathPnLRealization[capitalUnitCount];

  361.             for (int capitalUnitIndex = 0;
  362.                 capitalUnitIndex < capitalUnitCount;
  363.                 ++capitalUnitIndex)
  364.             {
  365.                 singlePathPnLRealizationArray[capitalUnitIndex] =
  366.                     capitalUnitPathPnLRealizationGrid[capitalUnitIndex][pathIndex];
  367.             }

  368.             if (null == (pathPnLRealizationArray[pathIndex] =
  369.                     org.drip.capital.simulation.PathPnLRealization.Combine (
  370.                         singlePathPnLRealizationArray
  371.                     )
  372.                 )
  373.             )
  374.             {
  375.                 return null;
  376.             }
  377.         }

  378.         for (org.drip.capital.simulation.PathPnLRealization pathPnLRealization : pathPnLRealizationArray)
  379.         {
  380.             if (!constrictedCapitalSegmentPathEnsemble.addPathPnLRealization (
  381.                 pathPnLRealization
  382.             ))
  383.             {
  384.                 return null;
  385.             }
  386.         }

  387.         return constrictedCapitalSegmentPathEnsemble;
  388.     }
  389. }