ProjectFinanceDetail.java

  1. package org.drip.sample.betafixedfloat;

  2. import java.util.Map;

  3. import org.drip.analytics.support.CaseInsensitiveHashMap;
  4. import org.drip.capital.allocation.CorrelationCategoryBeta;
  5. import org.drip.capital.allocation.CorrelationCategoryBetaManager;
  6. import org.drip.capital.allocation.EntityCapital;
  7. import org.drip.capital.allocation.EntityCapitalAssignmentSetting;
  8. import org.drip.capital.allocation.EntityComponentCapital;
  9. import org.drip.capital.allocation.EntityComponentCapitalAssignment;
  10. import org.drip.capital.allocation.EntityComponentCorrelationCategory;
  11. import org.drip.capital.allocation.EntityElasticityAttribution;
  12. import org.drip.capital.entity.CapitalUnit;
  13. import org.drip.capital.entity.ManagedSegmentL1;
  14. import org.drip.capital.env.CapitalEstimationContextManager;
  15. import org.drip.capital.explain.AllocatedPnLAttribution;
  16. import org.drip.capital.explain.CapitalSegmentStandaloneMarginal;
  17. import org.drip.capital.explain.PnLAttribution;
  18. import org.drip.capital.label.BusinessRegionRiskTypeCoordinate;
  19. import org.drip.capital.label.CapitalSegmentCoordinate;
  20. import org.drip.capital.label.Coordinate;
  21. import org.drip.capital.setting.CapitalAllocationControl;
  22. import org.drip.capital.setting.SimulationControl;
  23. import org.drip.capital.setting.SimulationPnLControl;
  24. import org.drip.numerical.common.FormatUtil;
  25. import org.drip.service.env.EnvManager;

  26. /*
  27.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  28.  */

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

  98. /**
  99.  * <i>ProjectFinanceDetail</i> zeds the Managed Sub-segment Level Allocation for the Specified Managed
  100.  *  Segment using the Two Beta Scheme.
  101.  *
  102.  *     MANAGED SEGMENT  - Project Finance
  103.  *
  104.  *     HIGH   - Fixed    Beta
  105.  *     LOW    - Floating Beta
  106.  *    
  107.  * The References are:
  108.  *
  109.  * <br><br>
  110.  *  <ul>
  111.  *      <li>
  112.  *          Bank for International Supervision (2005): Stress Testing at Major Financial Institutions: Survey
  113.  *              Results and Practice https://www.bis.org/publ/cgfs24.htm
  114.  *      </li>
  115.  *      <li>
  116.  *          Glasserman, P. (2004): <i>Monte Carlo Methods in Financial Engineering</i> <b>Springer</b>
  117.  *      </li>
  118.  *      <li>
  119.  *          Kupiec, P. H. (2000): Stress Tests and Risk Capital <i>Risk</i> <b>2 (4)</b> 27-39
  120.  *      </li>
  121.  *  </ul>
  122.  *
  123.  *  <br><br>
  124.  *  <ul>
  125.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
  126.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/CapitalAnalyticsLibrary.md">Capital Analytics</a></li>
  127.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/README.md">DROP API Construction and Usage</a></li>
  128.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/betafixedfloat/README.md">Two Beta Float Float Scheme</a></li>
  129.  *  </ul>
  130.  *    
  131.  * @author Lakshmi Krishnamurthy
  132.  */

  133. public class ProjectFinanceDetail
  134. {

  135.     private static final CapitalUnit MakeCapitalUnit (
  136.         final String business,
  137.         final String region,
  138.         final String riskType,
  139.         final double varNotional)
  140.         throws Exception
  141.     {
  142.         Coordinate capitalUnitCoordinate = new BusinessRegionRiskTypeCoordinate (
  143.             business,
  144.             region,
  145.             riskType
  146.         );

  147.         return new CapitalUnit (
  148.             capitalUnitCoordinate,
  149.             CapitalEstimationContextManager.ContextContainer().capitalUnitStressEventContext().capitalUnitEventMap().get
  150.             (
  151.                 capitalUnitCoordinate.fullyQualifiedName()
  152.             ),
  153.             varNotional
  154.         );
  155.     }

  156.     private static final void DisplayPnLAttribution (
  157.         final String capitalSegmentFQN,
  158.         final PnLAttribution pnlAttribution)
  159.         throws Exception
  160.     {
  161.         Map<String, Double> gsstPnLExplainMap = pnlAttribution.systemicPnLExplainMap();

  162.         Map<String, Double> cBSSTPnLExplainMap = pnlAttribution.correlatedPnLExplainMap();

  163.         Map<String, Double> iBSSTPnLExplainMap = pnlAttribution.idiosyncraticPnLExplainMap();

  164.         Map<String, Integer> gsstInstanceCountMap = pnlAttribution.systemicInstanceCountMap();

  165.         Map<String, Integer> cBSSTInstanceCountMap = pnlAttribution.correlatedInstanceCountMap();

  166.         Map<String, Integer> iBSSTInstanceCountMap = pnlAttribution.idiosyncraticInstanceCountMap();

  167.         Map<String, Double> gsstGrossPnLExplainMap = pnlAttribution.systemicGrossPnLExplainMap();

  168.         Map<String, Double> fsPnLDecompositionExplainMap = pnlAttribution.fsPnLDecompositionExplainMap();

  169.         System.out.println ("\t|---------------------------------------------------------||");

  170.         System.out.println ("\t|              CONTRIBUTORY PnL ATTRIBUTION               ||");

  171.         System.out.println ("\t|---------------------------------------------------------||");

  172.         System.out.println ("\t|    Capital Segment FQN => " + capitalSegmentFQN);

  173.         System.out.println ("\t|    Expected Short-fall => " +
  174.             FormatUtil.FormatDouble (pnlAttribution.expectedShortfall(), 10, 2, 1.)
  175.         );

  176.         if (null != gsstPnLExplainMap)
  177.         {
  178.             System.out.println ("\t|---------------------------------------------------------||");

  179.             for (Map.Entry<String, Double> gsstPnLExplainEntry : gsstPnLExplainMap.entrySet())
  180.             {
  181.                 System.out.println (
  182.                     "\t|\t GSST | " + gsstPnLExplainEntry.getKey() + " => " +
  183.                     FormatUtil.FormatDouble (gsstPnLExplainEntry.getValue(), 10, 2, 1.)
  184.                 );
  185.             }
  186.         }

  187.         if (null != cBSSTPnLExplainMap)
  188.         {
  189.             System.out.println ("\t|---------------------------------------------------------||");

  190.             for (Map.Entry<String, Double> cBSSTPnLExplainEntry : cBSSTPnLExplainMap.entrySet())
  191.             {
  192.                 System.out.println (
  193.                     "\t|\tcBSST | " + cBSSTPnLExplainEntry.getKey() + " => " +
  194.                     FormatUtil.FormatDouble (cBSSTPnLExplainEntry.getValue(), 10, 2, 1.)
  195.                 );
  196.             }
  197.         }

  198.         if (null != iBSSTPnLExplainMap)
  199.         {
  200.             System.out.println ("\t|---------------------------------------------------------||");

  201.             for (Map.Entry<String, Double> iBSSTPnLExplainEntry : iBSSTPnLExplainMap.entrySet())
  202.             {
  203.                 System.out.println (
  204.                     "\t|\tiBSST | " + iBSSTPnLExplainEntry.getKey() + " => " +
  205.                     FormatUtil.FormatDouble (iBSSTPnLExplainEntry.getValue(), 10, 2, 1.)
  206.                 );
  207.             }
  208.         }

  209.         if (null != fsPnLDecompositionExplainMap)
  210.         {
  211.             System.out.println ("\t|---------------------------------------------------------||");

  212.             for (Map.Entry<String, Double> fsPnLDecompositionExplainEntry :
  213.                 fsPnLDecompositionExplainMap.entrySet())
  214.             {
  215.                 System.out.println (
  216.                     "\t|\t cVaR  | " + fsPnLDecompositionExplainEntry.getKey() + " => " +
  217.                     FormatUtil.FormatDouble (fsPnLDecompositionExplainEntry.getValue(), 10, 2, 1.)
  218.                 );
  219.             }
  220.         }

  221.         System.out.println ("\t|---------------------------------------------------------||");

  222.         if (null != gsstGrossPnLExplainMap)
  223.         {
  224.             for (Map.Entry<String, Double> gsstGrossPnLExplainEntry : gsstGrossPnLExplainMap.entrySet())
  225.             {
  226.                 System.out.println (
  227.                     "\t|\t Gross  GSST | " + gsstGrossPnLExplainEntry.getKey() + " => " +
  228.                     FormatUtil.FormatDouble (gsstGrossPnLExplainEntry.getValue(), 10, 2, 1.)
  229.                 );
  230.             }
  231.         }

  232.         System.out.println (
  233.             "\t|\t GSST         => " +
  234.             FormatUtil.FormatDouble (pnlAttribution.systemicPnL(), 10, 2, 1.)
  235.         );

  236.         System.out.println (
  237.             "\t|\t Gross cBSST  => " +
  238.             FormatUtil.FormatDouble (pnlAttribution.correlatedPnL(), 10, 2, 1.)
  239.         );

  240.         System.out.println (
  241.             "\t|\t Gross iBSST  => " +
  242.             FormatUtil.FormatDouble (pnlAttribution.idiosyncraticGrossPnL(), 10, 2, 1.)
  243.         );

  244.         System.out.println (
  245.             "\t|\t Gross cVaR   => " +
  246.             FormatUtil.FormatDouble (pnlAttribution.fsGrossPnL(), 10, 2, 1.)
  247.         );

  248.         System.out.println ("\t|---------------------------------------------------------||");

  249.         if (null != gsstInstanceCountMap)
  250.         {
  251.             for (Map.Entry<String, Integer> gsstInstanceCountEntry : gsstInstanceCountMap.entrySet())
  252.             {
  253.                 System.out.println (
  254.                     "\t|\t GSST  Instance Count | " + gsstInstanceCountEntry.getKey() + " => " +
  255.                     FormatUtil.FormatDouble (gsstInstanceCountEntry.getValue(), 6, 0, 1.)
  256.                 );
  257.             }
  258.         }

  259.         if (null != cBSSTInstanceCountMap)
  260.         {
  261.             for (Map.Entry<String, Integer> cBSSTInstanceCountEntry : cBSSTInstanceCountMap.entrySet())
  262.             {
  263.                 System.out.println (
  264.                     "\t|\t cBSST Instance Count | " + cBSSTInstanceCountEntry.getKey() + " => " +
  265.                     FormatUtil.FormatDouble (cBSSTInstanceCountEntry.getValue(), 6, 0, 1.)
  266.                 );
  267.             }
  268.         }

  269.         if (null != iBSSTInstanceCountMap)
  270.         {
  271.             for (Map.Entry<String, Integer> iBSSTInstanceCountEntry : iBSSTInstanceCountMap.entrySet())
  272.             {
  273.                 System.out.println (
  274.                     "\t|\t iBSST Instance Count | " + iBSSTInstanceCountEntry.getKey() + " => " +
  275.                     FormatUtil.FormatDouble (iBSSTInstanceCountEntry.getValue(), 6, 0, 1.)
  276.                 );
  277.             }
  278.         }

  279.         System.out.println ("\t|---------------------------------------------------------||");

  280.         System.out.println();
  281.     }

  282.     private static final EntityCapitalAssignmentSetting LowUniformBeta()
  283.     {
  284.         return EntityCapitalAssignmentSetting.UniformBeta (
  285.             EntityComponentCorrelationCategory.LOW_CORRELATION,
  286.             EntityComponentCorrelationCategory.LOW_CORRELATION,
  287.             EntityComponentCorrelationCategory.LOW_CORRELATION,
  288.             EntityComponentCorrelationCategory.LOW_CORRELATION,
  289.             EntityComponentCorrelationCategory.LOW_CORRELATION
  290.         );
  291.     }

  292.     private static final EntityCapitalAssignmentSetting HighUniformBeta()
  293.     {
  294.         return EntityCapitalAssignmentSetting.UniformBeta (
  295.             EntityComponentCorrelationCategory.HIGH_CORRELATION,
  296.             EntityComponentCorrelationCategory.HIGH_CORRELATION,
  297.             EntityComponentCorrelationCategory.HIGH_CORRELATION,
  298.             EntityComponentCorrelationCategory.HIGH_CORRELATION,
  299.             EntityComponentCorrelationCategory.HIGH_CORRELATION
  300.         );
  301.     }

  302.     private static final EntityCapitalAssignmentSetting HighLowUniformBeta()
  303.     {
  304.         return Math.random() < 13. / 34. ? HighUniformBeta() : LowUniformBeta();
  305.     }

  306.     private static final void Allocate (
  307.         final CapitalUnit[] capitalUnitArray,
  308.         final EntityComponentCapitalAssignment entityComponentCapitalAssignment)
  309.         throws Exception
  310.     {

  311.         double unitFloatBeta = entityComponentCapitalAssignment.unitFloatBeta();

  312.         double allocatedBetaCapital = entityComponentCapitalAssignment.allocatedTotalCapital();

  313.         Map<String, EntityComponentCapital> entityComponentCapitalMap =
  314.             entityComponentCapitalAssignment.entityComponentCapitalMap();

  315.         System.out.println (
  316.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  317.         );

  318.         System.out.println (
  319.             "\t|                                                                         THREE BETA CAPITAL ALLOCATION                                                                            ||"
  320.         );

  321.         System.out.println (
  322.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  323.         );

  324.         System.out.println (
  325.             "\t|      L -> R:                                                                                                                                                                     ||"
  326.         );

  327.         System.out.println (
  328.             "\t|            - Capital Segment Allocation Fraction  - GSST                                                                                                                         ||"
  329.         );

  330.         System.out.println (
  331.             "\t|            - Capital Segment Allocation Fraction  - cBSST                                                                                                                        ||"
  332.         );

  333.         System.out.println (
  334.             "\t|            - Capital Segment Allocation Fraction  - iBSST                                                                                                                        ||"
  335.         );

  336.         System.out.println (
  337.             "\t|            - Capital Segment Allocation Fraction  - No Stress                                                                                                                    ||"
  338.         );

  339.         System.out.println (
  340.             "\t|            - Capital Segment Allocation Fraction  - Total                                                                                                                        ||"
  341.         );

  342.         System.out.println (
  343.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  344.         );

  345.         System.out.println (
  346.             "\t|            - Capital Segment Allocation Absolute  - GSST                                                                                                                         ||"
  347.         );

  348.         System.out.println (
  349.             "\t|            - Capital Segment Allocation Absolute  - cBSST                                                                                                                        ||"
  350.         );

  351.         System.out.println (
  352.             "\t|            - Capital Segment Allocation Absolute  - iBSST                                                                                                                        ||"
  353.         );

  354.         System.out.println (
  355.             "\t|            - Capital Segment Allocation Absolute  - No Stress                                                                                                                    ||"
  356.         );

  357.         System.out.println (
  358.             "\t|            - Capital Segment Allocation Absolute  - Total                                                                                                                        ||"
  359.         );

  360.         System.out.println (
  361.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  362.         );

  363.         System.out.println (
  364.             "\t|            - Capital Segment Coordinate                                                                                                                                          ||"
  365.         );

  366.         System.out.println (
  367.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  368.         );

  369.         for (int capitalUnitIndex = 0;
  370.             capitalUnitIndex < capitalUnitArray.length;
  371.             ++capitalUnitIndex)
  372.         {
  373.             String capitalUnitFQN = capitalUnitArray[capitalUnitIndex].coordinate().fullyQualifiedName();

  374.             EntityComponentCapital entityComponentCapital = entityComponentCapitalMap.get (
  375.                 capitalUnitFQN
  376.             );

  377.             EntityCapital entityComponentCapitalNoStress = entityComponentCapital.noStress();

  378.             EntityCapital entityComponentCapitalTotal = entityComponentCapital.total();

  379.             EntityCapital entityComponentCapitalIBSST = entityComponentCapital.idiosyncratic();

  380.             EntityCapital entityComponentCapitalCBSST = entityComponentCapital.correlated();

  381.             EntityCapital entityComponentCapitalGSST = entityComponentCapital.systemic();

  382.             System.out.println (
  383.                 "\t|    " +
  384.                 FormatUtil.FormatDouble (entityComponentCapitalGSST.fractional(), 2, 2, 100.) + "% |" +
  385.                 FormatUtil.FormatDouble (entityComponentCapitalCBSST.fractional(), 2, 2, 100.) + "% |" +
  386.                 FormatUtil.FormatDouble (entityComponentCapitalIBSST.fractional(), 2, 2, 100.) + "% |" +
  387.                 FormatUtil.FormatDouble (entityComponentCapitalNoStress.fractional(), 2, 2, 100.) + "% | " +
  388.                 FormatUtil.FormatDouble (entityComponentCapitalTotal.fractional(), 2, 2, 100.) + "% || " +
  389.                 FormatUtil.FormatDouble (entityComponentCapitalGSST.absolute(), 10, 2, 1.) + " | " +
  390.                 FormatUtil.FormatDouble (entityComponentCapitalCBSST.absolute(), 10, 2, 1.) + " | " +
  391.                 FormatUtil.FormatDouble (entityComponentCapitalIBSST.absolute(), 10, 2, 1.) + " | " +
  392.                 FormatUtil.FormatDouble (entityComponentCapitalNoStress.absolute(), 10, 2, 1.) + " | " +
  393.                 FormatUtil.FormatDouble (entityComponentCapitalTotal.absolute(), 10, 2, 1.) +
  394.                     " <= " + capitalUnitFQN
  395.             );
  396.         }

  397.         System.out.println (
  398.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  399.         );

  400.         EntityCapital entityCapitalGSST = entityComponentCapitalAssignment.systemic();

  401.         EntityCapital entityCapitalCBSST = entityComponentCapitalAssignment.correlated();

  402.         EntityCapital entityCapitalIBSST = entityComponentCapitalAssignment.idiosyncratic();

  403.         EntityCapital entityCapitalNoStress = entityComponentCapitalAssignment.noStress();

  404.         System.out.println (
  405.             "\t|    " +
  406.             FormatUtil.FormatDouble (entityCapitalGSST.fractional(), 2, 2, 100.) + "% |" +
  407.             FormatUtil.FormatDouble (entityCapitalCBSST.fractional(), 2, 2, 100.) + "% |" +
  408.             FormatUtil.FormatDouble (entityCapitalIBSST.fractional(), 2, 2, 100.) + "% |" +
  409.             FormatUtil.FormatDouble (entityCapitalNoStress.fractional(), 2, 2, 100.) + "% |" +
  410.             FormatUtil.FormatDouble (1., 2, 2, 100.) + "% || " +
  411.             FormatUtil.FormatDouble (entityCapitalGSST.absolute(), 10, 2, 1.) + " | " +
  412.             FormatUtil.FormatDouble (entityCapitalCBSST.absolute(), 10, 2, 1.) + " | " +
  413.             FormatUtil.FormatDouble (entityCapitalIBSST.absolute(), 10, 2, 1.) + " | " +
  414.             FormatUtil.FormatDouble (entityCapitalNoStress.absolute(), 10, 2, 1.) + " | " +
  415.             FormatUtil.FormatDouble (entityComponentCapitalAssignment.allocatedTotalCapital(), 10, 2, 1.) +
  416.             " <= TOTAL"
  417.         );

  418.         System.out.println (
  419.             "\t|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------||"
  420.         );

  421.         System.out.println();

  422.         EntityElasticityAttribution elasticityAttribution =
  423.             entityComponentCapitalAssignment.elasticityAttribution();

  424.         double fixedEntityCapital = elasticityAttribution.fixed();

  425.         double floatingEntityCapital = elasticityAttribution.floating() * unitFloatBeta;

  426.         System.out.println (
  427.             "\t|-----------------------------------------------------------------------------||"
  428.         );

  429.         System.out.println (
  430.             "\t| FIXED    Entity Capital                =>  " +
  431.             FormatUtil.FormatDouble (fixedEntityCapital, 10, 2, 1.) + " | " +
  432.             FormatUtil.FormatDouble (fixedEntityCapital / allocatedBetaCapital, 2, 2, 100.) + "%"
  433.         );

  434.         System.out.println (
  435.             "\t| FLOATING Entity Capital                =>  " +
  436.             FormatUtil.FormatDouble (floatingEntityCapital, 10, 2, 1.) + " | " +
  437.             FormatUtil.FormatDouble (floatingEntityCapital / allocatedBetaCapital, 2, 2, 100.) + "%"
  438.         );

  439.         System.out.println (
  440.             "\t|-----------------------------------------------------------------------------||"
  441.         );

  442.         System.out.println (
  443.             "\t| Allocated Beta Capital                 =>  " +
  444.             FormatUtil.FormatDouble (allocatedBetaCapital, 10, 2, 1.)
  445.         );

  446.         System.out.println (
  447.             "\t| Unit Float Beta                        =>  " +
  448.             FormatUtil.FormatDouble (unitFloatBeta, 1, 4, 1.)
  449.         );

  450.         System.out.println (
  451.             "\t|-----------------------------------------------------------------------------||"
  452.         );

  453.         System.out.println();
  454.     }

  455.     public static final void main (
  456.         final String[] argumentArray)
  457.         throws Exception
  458.     {
  459.         EnvManager.InitEnv ("");

  460.         double capitalUnitNotional = 10000.;
  461.         String capitalSegmentFQN = "Project Finance";
  462.         String[] regionArray =
  463.         {
  464.             "NORTH AMERICA",
  465.             "NORTH AMERICA",
  466.         };
  467.         String[] riskTypeArray =
  468.         {
  469.             "AFS",
  470.             "Trading",
  471.         };

  472.         CorrelationCategoryBetaManager correlationCategoryBetaManager =
  473.             CorrelationCategoryBetaManager.TwoBetaFixedFloat (
  474.                 1.0
  475.             );

  476.         SimulationControl simulationControl = SimulationControl.Standard();

  477.         SimulationPnLControl simulationPnLControl = SimulationPnLControl.Standard();

  478.         Map<String, EntityCapitalAssignmentSetting> entityCapitalAssignmentSettingMap =
  479.             new CaseInsensitiveHashMap<EntityCapitalAssignmentSetting>();

  480.         CapitalUnit[] capitalUnitArray = new CapitalUnit[riskTypeArray.length];

  481.         for (int capitalUnitIndex = 0;
  482.             capitalUnitIndex < riskTypeArray.length;
  483.             ++capitalUnitIndex)
  484.         {
  485.             capitalUnitArray[capitalUnitIndex] = MakeCapitalUnit (
  486.                 capitalSegmentFQN,
  487.                 regionArray[capitalUnitIndex],
  488.                 riskTypeArray[capitalUnitIndex],
  489.                 capitalUnitNotional
  490.             );

  491.             entityCapitalAssignmentSettingMap.put (
  492.                 capitalUnitArray[capitalUnitIndex].coordinate().fullyQualifiedName(),
  493.                 HighLowUniformBeta()
  494.             );
  495.         }

  496.         System.out.println ("\t|------------------------------------------------------------------");

  497.         System.out.println ("\t|     3 Beta Fixed/Float/Float Segment Capital Unit Coordinates    ");

  498.         System.out.println ("\t|------------------------------------------------------------------");

  499.         System.out.println ("\t|    L -> R:");

  500.         System.out.println ("\t|           - Correlation Category (1=HIGH; 2=MEDIUM; 3=LOW)");

  501.         System.out.println ("\t|           - Beta Type (0=FIXED; 1=FLOAT)");

  502.         System.out.println ("\t|           - Beta Value");

  503.         System.out.println ("\t|------------------------------------------------------------------");

  504.         for (int capitalUnitIndex = 0;
  505.             capitalUnitIndex < riskTypeArray.length;
  506.             ++capitalUnitIndex)
  507.         {
  508.             String capitalUnitFQN = capitalUnitArray[capitalUnitIndex].coordinate().fullyQualifiedName();

  509.             int capitalEntityCorrelationCategory = entityCapitalAssignmentSettingMap.get (
  510.                 capitalUnitFQN
  511.             ).allocationCorrelationCategory();

  512.             CorrelationCategoryBeta correlationCategoryBeta =
  513.                 correlationCategoryBetaManager.correlationCategoryBeta (
  514.                     capitalEntityCorrelationCategory
  515.                 );

  516.             System.out.println (
  517.                 "\t|    " + capitalEntityCorrelationCategory + " | " +
  518.                 correlationCategoryBeta.elasticity() + " | " +
  519.                 FormatUtil.FormatDouble (correlationCategoryBeta.loading(), 1, 1, 1.) + " <= " +
  520.                 capitalUnitFQN
  521.             );
  522.         }

  523.         System.out.println ("\t|------------------------------------------------------------------");

  524.         System.out.println ("\t|    [CAPITAL SEGMENT] => " + capitalSegmentFQN);

  525.         System.out.println ("\t|------------------------------------------------------------------");

  526.         System.out.println();

  527.         CapitalSegmentStandaloneMarginal capitalSegmentStandaloneMarginal = new ManagedSegmentL1 (
  528.             new CapitalSegmentCoordinate (
  529.                 capitalSegmentFQN
  530.             ),
  531.             capitalUnitArray
  532.         ).pathEnsemble (
  533.             simulationControl,
  534.             simulationPnLControl
  535.         ).marginalStandalonePnLAttribution (
  536.             simulationPnLControl.stress().expectedShortfallConfidenceLevel()
  537.         );

  538.         EntityComponentCapitalAssignment entityComponentCapitalAssignment =
  539.             capitalSegmentStandaloneMarginal.betaAllocation (
  540.                 new CapitalAllocationControl (
  541.                     false,
  542.                     null,
  543.                     correlationCategoryBetaManager,
  544.                     entityCapitalAssignmentSettingMap
  545.                 )
  546.             );

  547.         Map<String, EntityComponentCapital> entityComponentCapitalMap =
  548.             entityComponentCapitalAssignment.entityComponentCapitalMap();

  549.         Map<String, PnLAttribution> standalonePnLAttributionMap =
  550.             capitalSegmentStandaloneMarginal.standalonePnLAttributionMap();

  551.         for (Map.Entry<String, PnLAttribution> standalonePnLAttributionEntry :
  552.             standalonePnLAttributionMap.entrySet())
  553.         {
  554.             String capitalUnitCoordinate = standalonePnLAttributionEntry.getKey();

  555.             DisplayPnLAttribution (
  556.                 capitalUnitCoordinate,
  557.                 new AllocatedPnLAttribution (
  558.                     standalonePnLAttributionEntry.getValue(),
  559.                     entityComponentCapitalMap.get (
  560.                         capitalUnitCoordinate
  561.                     )
  562.                 )
  563.             );
  564.         }

  565.         Allocate (
  566.             capitalUnitArray,
  567.             entityComponentCapitalAssignment
  568.         );

  569.         EnvManager.TerminateEnv();
  570.     }
  571. }