XVAReplicationPortfolio.java

  1. package org.drip.sample.burgard2011;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;

  5. import org.drip.analytics.date.*;
  6. import org.drip.analytics.support.VertexDateBuilder;
  7. import org.drip.exposure.evolver.*;
  8. import org.drip.exposure.universe.*;
  9. import org.drip.measure.crng.RandomNumberGenerator;
  10. import org.drip.measure.discrete.CorrelatedPathVertexDimension;
  11. import org.drip.measure.dynamics.*;
  12. import org.drip.measure.process.*;
  13. import org.drip.measure.realization.*;
  14. import org.drip.numerical.common.FormatUtil;
  15. import org.drip.numerical.linearalgebra.Matrix;
  16. import org.drip.service.env.EnvManager;
  17. import org.drip.state.identifier.*;
  18. import org.drip.xva.definition.*;
  19. import org.drip.xva.derivative.*;
  20. import org.drip.xva.pde.*;

  21. /*
  22.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  23.  */

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

  95. /**
  96.  * <i>XVAReplicationPortfolio</i> demonstrates the Bank and Counter-Party Default Based Derivative Evolution
  97.  * of the Dynamic XVA Replication Porfolio. The References are:
  98.  *  
  99.  * <br><br>
  100.  *  <ul>
  101.  *      <li>
  102.  *          Burgard, C., and M. Kjaer (2014): PDE Representations of Derivatives with Bilateral Counter-party
  103.  *              Risk and Funding Costs <i>Journal of Credit Risk</i> <b>7 (3)</b> 1-19
  104.  *      </li>
  105.  *      <li>
  106.  *          Cesari, G., J. Aquilina, N. Charpillon, X. Filipovic, G. Lee, and L. Manda (2009): <i>Modeling,
  107.  *              Pricing, and Hedging Counter-party Credit Exposure - A Technical Guide</i> <b>Springer
  108.  *              Finance</b> New York
  109.  *      </li>
  110.  *      <li>
  111.  *          Gregory, J. (2009): Being Two-faced over Counter-party Credit Risk <i>Risk</i> <b>20 (2)</b>
  112.  *              86-90
  113.  *      </li>
  114.  *      <li>
  115.  *          Li, B., and Y. Tang (2007): <i>Quantitative Analysis, Derivatives Modeling, and Trading
  116.  *              Strategies in the Presence of Counter-party Credit Risk for the Fixed Income Market</i>
  117.  *              <b>World Scientific Publishing</b> Singapore
  118.  *      </li>
  119.  *      <li>
  120.  *          Piterbarg, V. (2010): Funding Beyond Discounting: Collateral Agreements and Derivatives Pricing
  121.  *              <i>Risk</i> <b>21 (2)</b> 97-102
  122.  *      </li>
  123.  *  </ul>
  124.  *  
  125.  * <br><br>
  126.  *  <ul>
  127.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
  128.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/XVAAnalyticsLibrary.md">XVA Analytics Library</a></li>
  129.  *      <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>
  130.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/burgard2011/README.md">Burgard Kjaer (2011) PDE Evolver</a></li>
  131.  *  </ul>
  132.  * <br><br>
  133.  *
  134.  * @author Lakshmi Krishnamurthy
  135.  */

  136. public class XVAReplicationPortfolio {

  137.     private static final PrimarySecurity AssetValueReplicator (
  138.         final String currency)
  139.         throws Exception
  140.     {
  141.         double assetValueReplicatorDrift = 0.0025;
  142.         double assetValueReplicatorVolatility = 0.10;
  143.         double assetValueReplicatorRepo = 0.03;
  144.         double assetValueReplicatorDividend = 0.02;

  145.         EntityEquityLabel equityLabel = EntityEquityLabel.Standard (
  146.             "AAPL",
  147.             currency
  148.         );

  149.         return new PrimarySecurity (
  150.             "AAPL",
  151.             equityLabel,
  152.             new DiffusionEvolver (
  153.                 DiffusionEvaluatorLogarithmic.Standard (
  154.                     assetValueReplicatorDrift - assetValueReplicatorDividend,
  155.                     assetValueReplicatorVolatility
  156.                 )
  157.             ),
  158.             assetValueReplicatorRepo
  159.         );
  160.     }

  161.     private static final PrimarySecurity OvernightReplicator (
  162.         final String currency,
  163.         final List<LatentStateLabel> latentStateLabelList)
  164.         throws Exception
  165.     {
  166.         double overnightReplicatorDrift = 0.0025;
  167.         double overnightReplicatorVolatility = 0.001;
  168.         double overnightReplicatorRepo = 0.0;

  169.         LatentStateLabel overnightLabel = OvernightLabel.Create (currency);

  170.         latentStateLabelList.add (overnightLabel);

  171.         return new PrimarySecurity (
  172.             currency + "_OVERNIGHT",
  173.             overnightLabel,
  174.             new DiffusionEvolver (
  175.                 DiffusionEvaluatorLogarithmic.Standard (
  176.                     overnightReplicatorDrift,
  177.                     overnightReplicatorVolatility
  178.                 )
  179.             ),
  180.             overnightReplicatorRepo
  181.         );
  182.     }

  183.     private static final PrimarySecurity CSAReplicator (
  184.         final String currency,
  185.         final List<LatentStateLabel> latentStateLabelList)
  186.         throws Exception
  187.     {
  188.         double csaReplicatorDrift = 0.01;
  189.         double csaReplicatorVolatility = 0.002;
  190.         double csaReplicatorRepo = 0.005;

  191.         LatentStateLabel csaLabel = CSALabel.ISDA (currency);

  192.         latentStateLabelList.add (csaLabel);

  193.         return new PrimarySecurity (
  194.             currency + "_CSA",
  195.             csaLabel,
  196.             new DiffusionEvolver (
  197.                 DiffusionEvaluatorLogarithmic.Standard (
  198.                     csaReplicatorDrift,
  199.                     csaReplicatorVolatility
  200.                 )
  201.             ),
  202.             csaReplicatorRepo
  203.         );
  204.     }

  205.     private static final PrimarySecurity DealerSeniorFundingReplicator (
  206.         final String currency,
  207.         final String dealer,
  208.         final List<LatentStateLabel> latentStateLabelList)
  209.         throws Exception
  210.     {
  211.         double dealerSeniorFundingReplicatorDrift = 0.03;
  212.         double dealerSeniorFundingReplicatorVolatility = 0.002;
  213.         double dealerSeniorFundingReplicatorRepo = 0.028;

  214.         LatentStateLabel dealerSeniorFundingLabel = EntityFundingLabel.Senior (
  215.             dealer,
  216.             currency
  217.         );

  218.         latentStateLabelList.add (dealerSeniorFundingLabel);

  219.         return new PrimarySecurity (
  220.             dealer + "_" + currency + "_SENIOR_ZERO",
  221.             dealerSeniorFundingLabel,
  222.             new JumpDiffusionEvolver (
  223.                 DiffusionEvaluatorLogarithmic.Standard (
  224.                     dealerSeniorFundingReplicatorDrift,
  225.                     dealerSeniorFundingReplicatorVolatility
  226.                 ),
  227.                 HazardJumpEvaluator.Standard (
  228.                     0.3,
  229.                     0.45
  230.                 )
  231.             ),
  232.             dealerSeniorFundingReplicatorRepo
  233.         );
  234.     }

  235.     private static final PrimarySecurity DealerSubordinateFundingReplicator (
  236.         final String currency,
  237.         final String dealer,
  238.         final List<LatentStateLabel> latentStateLabelList)
  239.         throws Exception
  240.     {
  241.         double dealerSubordinateFundingReplicatorDrift = 0.045;
  242.         double dealerSubordinateFundingReplicatorVolatility = 0.002;
  243.         double dealerSubordinateFundingReplicatorRepo = 0.028;

  244.         LatentStateLabel dealerSubordinateFundingLabel = EntityFundingLabel.Subordinate (
  245.             dealer,
  246.             currency
  247.         );

  248.         latentStateLabelList.add (dealerSubordinateFundingLabel);

  249.         return new PrimarySecurity (
  250.             dealer + "_" + currency + "_SUBORDINATE_ZERO",
  251.             dealerSubordinateFundingLabel,
  252.             new JumpDiffusionEvolver (
  253.                 DiffusionEvaluatorLogarithmic.Standard (
  254.                     dealerSubordinateFundingReplicatorDrift,
  255.                     dealerSubordinateFundingReplicatorVolatility
  256.                 ),
  257.                 HazardJumpEvaluator.Standard (
  258.                     0.3,
  259.                     0.25
  260.                 )
  261.             ),
  262.             dealerSubordinateFundingReplicatorRepo
  263.         );
  264.     }

  265.     private static final PrimarySecurity ClientFundingReplicator (
  266.         final String currency,
  267.         final String client,
  268.         final List<LatentStateLabel> latentStateLabelList)
  269.         throws Exception
  270.     {
  271.         double clientFundingReplicatorDrift = 0.03;
  272.         double clientFundingReplicatorVolatility = 0.003;
  273.         double clientFundingReplicatorRepo = 0.028;

  274.         LatentStateLabel clientFundingLabel = EntityFundingLabel.Senior (
  275.             client,
  276.             currency
  277.         );

  278.         latentStateLabelList.add (clientFundingLabel);

  279.         return new PrimarySecurity (
  280.             client + "_" + currency + "_SENIOR_ZERO",
  281.             clientFundingLabel,
  282.             new JumpDiffusionEvolver (
  283.                 DiffusionEvaluatorLogarithmic.Standard (
  284.                     clientFundingReplicatorDrift,
  285.                     clientFundingReplicatorVolatility
  286.                 ),
  287.                 HazardJumpEvaluator.Standard (
  288.                     0.5,
  289.                     0.30
  290.                 )
  291.             ),
  292.             clientFundingReplicatorRepo
  293.         );
  294.     }

  295.     private static final PrimarySecurityDynamicsContainer PrimarySecurityEvolver (
  296.         final String currency,
  297.         final String dealer,
  298.         final String client,
  299.         final List<LatentStateLabel> latentStateLabelList)
  300.         throws Exception
  301.     {
  302.         List<PrimarySecurity> assetList = new ArrayList<PrimarySecurity>();

  303.         assetList.add (AssetValueReplicator (currency));

  304.         return new PrimarySecurityDynamicsContainer (
  305.             assetList,
  306.             OvernightReplicator (
  307.                 currency,
  308.                 latentStateLabelList
  309.             ),
  310.             CSAReplicator (
  311.                 currency,
  312.                 latentStateLabelList
  313.             ),
  314.             DealerSeniorFundingReplicator (
  315.                 currency,
  316.                 dealer,
  317.                 latentStateLabelList
  318.             ),
  319.             DealerSubordinateFundingReplicator (
  320.                 currency,
  321.                 dealer,
  322.                 latentStateLabelList
  323.             ),
  324.             ClientFundingReplicator (
  325.                 currency,
  326.                 client,
  327.                 latentStateLabelList
  328.             )
  329.         );
  330.     }

  331.     private static final TerminalLatentState DealerHazard (
  332.         final String currency,
  333.         final String dealer,
  334.         final List<LatentStateLabel> latentStateLabelList)
  335.         throws Exception
  336.     {
  337.         double dealerHazardDrift = 0.0002;
  338.         double dealerHazardVolatility = 0.02;

  339.         LatentStateLabel dealerHazardLabel = EntityHazardLabel.Standard (
  340.             dealer,
  341.             currency
  342.         );

  343.         latentStateLabelList.add (dealerHazardLabel);

  344.         return new TerminalLatentState (
  345.             dealerHazardLabel,
  346.             new DiffusionEvolver (
  347.                 DiffusionEvaluatorLogarithmic.Standard (
  348.                     dealerHazardDrift,
  349.                     dealerHazardVolatility
  350.                 )
  351.             )
  352.         );
  353.     }

  354.     private static final TerminalLatentState DealerRecovery (
  355.         final String currency,
  356.         final String dealer,
  357.         final List<LatentStateLabel> latentStateLabelList)
  358.         throws Exception
  359.     {
  360.         double dealerRecoveryDrift = 0.0002;
  361.         double dealerRecoveryVolatility = 0.02;

  362.         LatentStateLabel dealerRecoveryLabel = EntityRecoveryLabel.Senior (
  363.             dealer,
  364.             currency
  365.         );

  366.         latentStateLabelList.add (dealerRecoveryLabel);

  367.         return new TerminalLatentState (
  368.             dealerRecoveryLabel,
  369.             new DiffusionEvolver (
  370.                 DiffusionEvaluatorLogarithmic.Standard (
  371.                     dealerRecoveryDrift,
  372.                     dealerRecoveryVolatility
  373.                 )
  374.             )
  375.         );
  376.     }

  377.     private static final TerminalLatentState ClientHazard (
  378.         final String currency,
  379.         final String client,
  380.         final List<LatentStateLabel> latentStateLabelList)
  381.         throws Exception
  382.     {
  383.         double clientHazardDrift = 0.0002;
  384.         double clientHazardVolatility = 0.02;

  385.         LatentStateLabel clientHazardLabel = EntityHazardLabel.Standard (
  386.             client,
  387.             currency
  388.         );

  389.         latentStateLabelList.add (clientHazardLabel);

  390.         return new TerminalLatentState (
  391.             clientHazardLabel,
  392.             new DiffusionEvolver (
  393.                 DiffusionEvaluatorLogarithmic.Standard (
  394.                     clientHazardDrift,
  395.                     clientHazardVolatility
  396.                 )
  397.             )
  398.         );
  399.     }

  400.     private static final TerminalLatentState ClientRecovery (
  401.         final String currency,
  402.         final String client,
  403.         final List<LatentStateLabel> latentStateLabelList)
  404.         throws Exception
  405.     {
  406.         double clientRecoveryDrift = 0.0002;
  407.         double clientRecoveryVolatility = 0.02;

  408.         LatentStateLabel clientRecoveryLabel = EntityRecoveryLabel.Senior (
  409.             client,
  410.             currency
  411.         );

  412.         latentStateLabelList.add (clientRecoveryLabel);

  413.         return new TerminalLatentState (
  414.             clientRecoveryLabel,
  415.             new DiffusionEvolver (
  416.                 DiffusionEvaluatorLogarithmic.Standard (
  417.                     clientRecoveryDrift,
  418.                     clientRecoveryVolatility
  419.                 )
  420.             )
  421.         );
  422.     }

  423.     private static final EntityDynamicsContainer EntityEvolver (
  424.         final String currency,
  425.         final String dealer,
  426.         final String client,
  427.         final List<LatentStateLabel> latentStateLabelList)
  428.         throws Exception
  429.     {
  430.         return new EntityDynamicsContainer (
  431.             DealerHazard (
  432.                 currency,
  433.                 dealer,
  434.                 latentStateLabelList
  435.             ),
  436.             DealerRecovery (
  437.                 currency,
  438.                 dealer,
  439.                 latentStateLabelList
  440.             ),
  441.             null,
  442.             ClientHazard (
  443.                 currency,
  444.                 client,
  445.                 latentStateLabelList
  446.             ),
  447.             ClientRecovery (
  448.                 currency,
  449.                 client,
  450.                 latentStateLabelList
  451.             )
  452.         );
  453.     }

  454.     private static final LatentStateDynamicsContainer LatentStateEvolver (
  455.         final EntityEquityLabel equityLabel,
  456.         final List<LatentStateLabel> latentStateLabelList)
  457.         throws Exception
  458.     {
  459.         double assetValueReplicatorDrift = 0.0025;
  460.         double assetValueReplicatorVolatility = 0.10;

  461.         latentStateLabelList.add (equityLabel);

  462.         LatentStateDynamicsContainer latentStateDynamicsContainer = new LatentStateDynamicsContainer();

  463.         latentStateDynamicsContainer.addEntityEquity (
  464.             new TerminalLatentState (
  465.                 equityLabel,
  466.                 new DiffusionEvolver (
  467.                     DiffusionEvaluatorLinear.Standard (
  468.                         assetValueReplicatorDrift,
  469.                         assetValueReplicatorVolatility
  470.                     )
  471.                 )
  472.             )
  473.         );

  474.         return latentStateDynamicsContainer;
  475.     }

  476.     private static final MarketVertexGenerator ConstructMarketVertexGenerator (
  477.         final JulianDate spotDate,
  478.         final int[] eventVertexArray,
  479.         final String currency,
  480.         final String dealer,
  481.         final String client,
  482.         final EntityEquityLabel equityLabel,
  483.         final List<LatentStateLabel> latentStateLabelList)
  484.         throws Exception
  485.     {
  486.         return new MarketVertexGenerator (
  487.             spotDate.julian(),
  488.             eventVertexArray,
  489.             EntityEvolver (
  490.                 currency,
  491.                 dealer,
  492.                 client,
  493.                 latentStateLabelList
  494.             ),
  495.             PrimarySecurityEvolver (
  496.                 currency,
  497.                 dealer,
  498.                 client,
  499.                 latentStateLabelList
  500.             ),
  501.             LatentStateEvolver (
  502.                 equityLabel,
  503.                 latentStateLabelList
  504.             )
  505.         );
  506.     }

  507.     private static final MarketVertex[] MarketVertexArray (
  508.         final Map<Integer, MarketVertex> marketVertexMap)
  509.         throws Exception
  510.     {
  511.         int marketVertexCount = marketVertexMap.size();

  512.         int marketVertexIndex = 0;
  513.         MarketVertex[] marketVertexArray = new MarketVertex[marketVertexCount];

  514.         for (Map.Entry<Integer, MarketVertex> marketVertexMapEntry : marketVertexMap.entrySet())
  515.         {
  516.             marketVertexArray[marketVertexIndex++] = marketVertexMapEntry.getValue();
  517.         }

  518.         return marketVertexArray;
  519.     }

  520.     private static final EvolutionTrajectoryVertex RunStep (
  521.         final TrajectoryEvolutionScheme tes,
  522.         final BurgardKjaerOperator bko,
  523.         final EvolutionTrajectoryVertex etvStart,
  524.         final MarketVertex mvStart,
  525.         final MarketVertex mvFinish,
  526.         final LatentStateLabel equityLabel)
  527.         throws Exception
  528.     {
  529.         PositionGreekVertex agvStart = etvStart.positionGreekVertex();

  530.         ReplicationPortfolioVertex rpvStart = etvStart.replicationPortfolioVertex();

  531.         double dblDerivativeXVAValueStart = agvStart.derivativeXVAValue();

  532.         double dblTimeWidth = (mvFinish.anchorDate().julian() - mvStart.anchorDate().julian()) / 365.;

  533.         double dblTimeStart = etvStart.time();

  534.         double dblTime = dblTimeStart + dblTimeWidth;

  535.         double dblCollateralSchemeNumeraire = mvStart.csaReplicator();

  536.         PrimarySecurityDynamicsContainer tc = tes.tradeablesContainer();

  537.         BurgardKjaerEdgeRun bker = bko.edgeRun (
  538.             new MarketEdge (
  539.                 mvStart,
  540.                 mvFinish
  541.             ),
  542.             etvStart,
  543.             0.
  544.         );

  545.         double dblTheta = bker.theta();

  546.         double dblAssetNumeraireBump = bker.positionValueBump();

  547.         double dblThetaAssetNumeraireUp = bker.thetaPositionValueUp();

  548.         double dblThetaAssetNumeraireDown = bker.thetaPositionValueDown();

  549.         double dblDerivativeXVAValueDeltaFinish = agvStart.derivativeXVAValueDelta() -
  550.             0.5 * (dblThetaAssetNumeraireUp - dblThetaAssetNumeraireDown) * dblTimeWidth / dblAssetNumeraireBump;

  551.         double dblDerivativeXVAValueGammaFinish = agvStart.derivativeXVAValueGamma() -
  552.             (dblThetaAssetNumeraireUp + dblThetaAssetNumeraireDown - 2. * dblTheta) * dblTimeWidth /
  553.                 (dblAssetNumeraireBump * dblAssetNumeraireBump);

  554.         double dblDerivativeXVAValueFinish = dblDerivativeXVAValueStart + dblTheta * dblTimeWidth;

  555.         CloseOut cog = new CloseOutBilateral (
  556.             mvStart.dealer().seniorRecoveryRate(),
  557.             mvStart.client().seniorRecoveryRate()
  558.         );

  559.         double dblGainOnBankDefaultFinish = -1. * (dblDerivativeXVAValueFinish - cog.dealerDefault
  560.             (dblDerivativeXVAValueFinish));

  561.         double dblGainOnCounterPartyDefaultFinish = -1. * (dblDerivativeXVAValueFinish - cog.clientDefault
  562.             (dblDerivativeXVAValueFinish));

  563.         CashAccountEdge cae = tes.rebalanceCash (
  564.             etvStart,
  565.             new MarketEdge (
  566.                 mvStart,
  567.                 mvFinish
  568.             )
  569.         ).cashAccountEdge();

  570.         double dblCashAccountAccumulationFinish = cae.accumulation();

  571.         double dblAssetNumeraireFinish = mvFinish.latentStateValue (equityLabel);

  572.         double dblBankSeniorFundingNumeraireFinish = mvFinish.dealer().seniorFundingReplicator();

  573.         double dblCounterPartyFundingNumeraireFinish = mvFinish.client().seniorFundingReplicator();

  574.         ReplicationPortfolioVertex rpvFinish = ReplicationPortfolioVertex.Standard (
  575.             -1. * dblDerivativeXVAValueDeltaFinish,
  576.             dblGainOnBankDefaultFinish / dblBankSeniorFundingNumeraireFinish,
  577.             dblGainOnCounterPartyDefaultFinish / dblCounterPartyFundingNumeraireFinish,
  578.             rpvStart.cashAccount() + dblCashAccountAccumulationFinish
  579.         );

  580.         System.out.println ("\t||" +
  581.             FormatUtil.FormatDouble (dblTime, 1, 6, 1.) + " | " +
  582.             FormatUtil.FormatDouble (dblDerivativeXVAValueFinish, 1, 6, 1.) + " | " +
  583.             FormatUtil.FormatDouble (dblAssetNumeraireFinish, 1, 6, 1.) + " | " +
  584.             FormatUtil.FormatDouble (dblBankSeniorFundingNumeraireFinish, 1, 6, 1.) + " | " +
  585.             FormatUtil.FormatDouble (dblCounterPartyFundingNumeraireFinish, 1, 6, 1.) + " | " +
  586.             FormatUtil.FormatDouble (dblCollateralSchemeNumeraire, 1, 6, 1.) + " | " +
  587.             FormatUtil.FormatDouble (rpvFinish.positionHoldings(), 1, 6, 1.) + " | " +
  588.             FormatUtil.FormatDouble (rpvFinish.dealerSeniorNumeraireHoldings(), 1, 6, 1.) + " | " +
  589.             FormatUtil.FormatDouble (rpvFinish.clientNumeraireHoldings(), 1, 6, 1.) + " | " +
  590.             FormatUtil.FormatDouble (rpvFinish.cashAccount(), 1, 6, 1.) + " | " +
  591.             FormatUtil.FormatDouble (dblCashAccountAccumulationFinish, 1, 6, 1.) + " | " +
  592.             FormatUtil.FormatDouble (cae.assetAccumulation(), 1, 6, 1.) + " | " +
  593.             FormatUtil.FormatDouble (cae.dealerAccumulation(), 1, 6, 1.) + " | " +
  594.             FormatUtil.FormatDouble (cae.clientAccumulation(), 1, 6, 1.) + " ||"
  595.         );

  596.         return new EvolutionTrajectoryVertex (
  597.             dblTimeStart + dblTimeWidth,
  598.             rpvFinish,
  599.             new PositionGreekVertex (
  600.                 dblDerivativeXVAValueFinish,
  601.                 dblDerivativeXVAValueDeltaFinish,
  602.                 dblDerivativeXVAValueGammaFinish,
  603.                 agvStart.derivativeFairValue() * Math.exp (
  604.                     -1. * dblTimeWidth * tc.csa().evolver().evaluator().drift().value (
  605.                         new JumpDiffusionVertex (
  606.                             dblTime,
  607.                             dblCollateralSchemeNumeraire,
  608.                             0.,
  609.                             false
  610.                         )
  611.                     )
  612.                 )
  613.             ),
  614.             dblGainOnBankDefaultFinish,
  615.             dblGainOnCounterPartyDefaultFinish,
  616.             0.,
  617.             0.
  618.         );
  619.     }

  620.     public static void main (
  621.         final String[] astrArgs)
  622.         throws Exception
  623.     {
  624.         /* EnvManager.InitEnv ("");

  625.         String bank = "WFC";
  626.         int iNumVertex = 24;
  627.         String currency = "USD";
  628.         String counterParty = "BAC";
  629.         int iSimulationDuration = 365;

  630.         double[][] aadblCorrelationMatrix = new double[][] {
  631.             {1.00, 0.00, 0.20, 0.15, 0.05, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #0 ASSET NUMERAIRE
  632.             {0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #1 OVERNIGHT POLICY INDEX NUMERAIRE
  633.             {0.20, 0.00, 1.00, 0.13, 0.25, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #2 COLLATERAL SCHEME NUMERAIRE
  634.             {0.15, 0.00, 0.13, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #3 BANK HAZARD RATE
  635.             {0.05, 0.00, 0.25, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #4 BANK SENIOR FUNDING NUMERAIRE
  636.             {0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #5 BANK SENIOR RECOVERY RATE
  637.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00}, // #6 BANK SUBORDINATE FUNDING NUMERAIRE
  638.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00}, // #7 BANK SUBORDINATE RECOVERY RATE
  639.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00}, // #8 COUNTER PARTY HAZARD RATE
  640.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00}, // #9 COUNTER PARTY FUNDING NUMERAIRE
  641.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00}  // #10 COUNTER PARTY RECOVERY RATE
  642.         };

  643.         double dblAssetNumeraireDrift = 0.06;
  644.         double dblAssetNumeraireVolatility = 0.01;
  645.         double dblAssetNumeraireRepo = 0.03;
  646.         double dblAssetNumeraireDividend = 0.02;
  647.         double dblAssetNumeraireInitial = 1.;

  648.         double dblOvernightIndexNumeraireDrift = 0.0025;
  649.         double dblOvernightIndexNumeraireVolatility = 0.001;
  650.         double dblOvernightIndexNumeraireRepo = 0.0;

  651.         double dblCollateralSchemeNumeraireDrift = 0.01;
  652.         double dblCollateralSchemeNumeraireVolatility = 0.002;
  653.         double dblCollateralSchemeNumeraireRepo = 0.005;

  654.         double dblBankSeniorFundingNumeraireDrift = 0.03;
  655.         double dblBankSeniorFundingNumeraireVolatility = 0.002;
  656.         double dblBankSeniorFundingNumeraireRepo = 0.028;

  657.         double dblBankSubordinateFundingNumeraireDrift = 0.045;
  658.         double dblBankSubordinateFundingNumeraireVolatility = 0.002;
  659.         double dblBankSubordinateFundingNumeraireRepo = 0.028;

  660.         double dblCounterPartyFundingNumeraireDrift = 0.03;
  661.         double dblCounterPartyFundingNumeraireVolatility = 0.003;
  662.         double dblCounterPartyFundingNumeraireRepo = 0.028;

  663.         double dblBankHazardRateDrift = 0.00;
  664.         double dblBankHazardRateVolatility = 0.005;
  665.         double dblBankHazardRateInitial = 0.03;

  666.         double dblBankSeniorRecoveryRateDrift = 0.0;
  667.         double dblBankSeniorRecoveryRateVolatility = 0.0;
  668.         double dblBankSeniorRecoveryRateInitial = 0.45;

  669.         double dblBankSubordinateRecoveryRateDrift = 0.0;
  670.         double dblBankSubordinateRecoveryRateVolatility = 0.0;
  671.         double dblBankSubordinateRecoveryRateInitial = 0.25;

  672.         double dblCounterPartyHazardRateDrift = 0.00;
  673.         double dblCounterPartyHazardRateVolatility = 0.005;
  674.         double dblCounterPartyHazardRateInitial = 0.05;

  675.         double dblCounterPartyRecoveryRateDrift = 0.0;
  676.         double dblCounterPartyRecoveryRateVolatility = 0.0;
  677.         double dblCounterPartyRecoveryRateInitial = 0.30;

  678.         double dblTerminalXVADerivativeValue = 1.;

  679.         double dblSensitivityShiftFactor = 0.001;

  680.         EntityEquityLabel equityLabel = EntityEquityLabel.Standard (
  681.             "AAPL",
  682.             currency
  683.         );

  684.         PrimarySecurity tAsset = new PrimarySecurity (
  685.             "AAPL",
  686.             equityLabel,
  687.             new DiffusionEvolver (
  688.                 DiffusionEvaluatorLogarithmic.Standard (
  689.                     dblAssetNumeraireDrift - dblAssetNumeraireDividend,
  690.                     dblAssetNumeraireVolatility
  691.                 )
  692.             ),
  693.             dblAssetNumeraireRepo
  694.         );

  695.         PrimarySecurity tOvernightIndex = new PrimarySecurity (
  696.             currency + "_OVERNIGHT_ZERO",
  697.             OvernightLabel.Create (currency),
  698.             new DiffusionEvolver (
  699.                 DiffusionEvaluatorLogarithmic.Standard (
  700.                     dblOvernightIndexNumeraireDrift,
  701.                     dblOvernightIndexNumeraireVolatility
  702.                 )
  703.             ),
  704.             dblOvernightIndexNumeraireRepo
  705.         );

  706.         PrimarySecurity tCollateralScheme = new PrimarySecurity (
  707.             currency + "_CSA_ZERO",
  708.             CSALabel.ISDA (currency),
  709.             new DiffusionEvolver (
  710.                 DiffusionEvaluatorLogarithmic.Standard (
  711.                     dblCollateralSchemeNumeraireDrift,
  712.                     dblCollateralSchemeNumeraireVolatility
  713.                 )
  714.             ),
  715.             dblCollateralSchemeNumeraireRepo
  716.         );

  717.         PrimarySecurity tBankSeniorFunding = new PrimarySecurity (
  718.             bank + "_" + currency + "_SENIOR_ZERO",
  719.             EntityFundingLabel.Senior (
  720.                 bank,
  721.                 currency
  722.             ),
  723.             new JumpDiffusionEvolver (
  724.                 DiffusionEvaluatorLogarithmic.Standard (
  725.                     dblBankSeniorFundingNumeraireDrift,
  726.                     dblBankSeniorFundingNumeraireVolatility
  727.                 ),
  728.                 HazardJumpEvaluator.Standard (
  729.                     dblBankHazardRateInitial,
  730.                     dblBankSeniorRecoveryRateInitial
  731.                 )
  732.             ),
  733.             dblBankSeniorFundingNumeraireRepo
  734.         );

  735.         PrimarySecurity tBankSubordinateFunding = new PrimarySecurity (
  736.             bank + "_" + currency + "_SUBORDINATE_ZERO",
  737.             EntityFundingLabel.Subordinate (
  738.                 bank,
  739.                 currency
  740.             ),
  741.             new JumpDiffusionEvolver (
  742.                 DiffusionEvaluatorLogarithmic.Standard (
  743.                     dblBankSubordinateFundingNumeraireDrift,
  744.                     dblBankSubordinateFundingNumeraireVolatility
  745.                 ),
  746.                 HazardJumpEvaluator.Standard (
  747.                     dblBankHazardRateInitial,
  748.                     dblBankSubordinateRecoveryRateInitial
  749.                 )
  750.             ),
  751.             dblBankSubordinateFundingNumeraireRepo
  752.         );

  753.         PrimarySecurity tCounterPartyFunding = new PrimarySecurity (
  754.             counterParty + "_" + currency + "_SENIOR_ZERO",
  755.             EntityFundingLabel.Senior (
  756.                 counterParty,
  757.                 currency
  758.             ),
  759.             new JumpDiffusionEvolver (
  760.                 DiffusionEvaluatorLogarithmic.Standard (
  761.                     dblCounterPartyFundingNumeraireDrift,
  762.                     dblCounterPartyFundingNumeraireVolatility
  763.                 ),
  764.                 HazardJumpEvaluator.Standard (
  765.                     dblCounterPartyHazardRateInitial,
  766.                     dblCounterPartyRecoveryRateInitial
  767.                 )
  768.             ),
  769.             dblCounterPartyFundingNumeraireRepo
  770.         );

  771.         JulianDate dtSpot = DateUtil.Today();

  772.         int iSpotDate = dtSpot.julian();

  773.         int aiVertexDate[] = VertexDateBuilder.EqualWidth (
  774.             iSpotDate,
  775.             iSpotDate + iSimulationDuration,
  776.             iNumVertex
  777.         );

  778.         List<PrimarySecurity> assetList = new ArrayList<PrimarySecurity>();

  779.         assetList.add (tAsset);

  780.         PrimarySecurityDynamicsContainer tc = new PrimarySecurityDynamicsContainer (
  781.             assetList,
  782.             tOvernightIndex,
  783.             tCollateralScheme,
  784.             tBankSeniorFunding,
  785.             tBankSubordinateFunding,
  786.             tCounterPartyFunding
  787.         );

  788.         MarketVertexGeneratorDeprecatione mvg = new MarketVertexGeneratorDeprecatione (
  789.             iSpotDate,
  790.             aiVertexDate,
  791.             tc,
  792.             new EntityDynamicsContainer (
  793.                 new TerminalLatentState (
  794.                     EntityHazardLabel.Standard (
  795.                         bank,
  796.                         currency
  797.                     ),
  798.                     new DiffusionEvolver (
  799.                         DiffusionEvaluatorLogarithmic.Standard (
  800.                             dblBankHazardRateDrift,
  801.                             dblBankHazardRateVolatility
  802.                         )
  803.                     )
  804.                 ),
  805.                 new TerminalLatentState (
  806.                     EntityRecoveryLabel.Senior (
  807.                         bank,
  808.                         currency
  809.                     ),
  810.                     new DiffusionEvolver (
  811.                         DiffusionEvaluatorLogarithmic.Standard (
  812.                             dblBankSeniorRecoveryRateDrift,
  813.                             dblBankSeniorRecoveryRateVolatility
  814.                         )
  815.                     )
  816.                 ),
  817.                 new TerminalLatentState (
  818.                     EntityRecoveryLabel.Subordinate (
  819.                         bank,
  820.                         currency
  821.                     ),
  822.                     new DiffusionEvolver (
  823.                         DiffusionEvaluatorLogarithmic.Standard (
  824.                             dblBankSubordinateRecoveryRateDrift,
  825.                             dblBankSubordinateRecoveryRateVolatility
  826.                         )
  827.                     )
  828.                 ),
  829.                 new TerminalLatentState (
  830.                     EntityHazardLabel.Standard (
  831.                         counterParty,
  832.                         currency
  833.                     ),
  834.                     new DiffusionEvolver (
  835.                         DiffusionEvaluatorLogarithmic.Standard (
  836.                             dblCounterPartyHazardRateDrift,
  837.                             dblCounterPartyHazardRateVolatility
  838.                         )
  839.                     )
  840.                 ),
  841.                 new TerminalLatentState (
  842.                     EntityRecoveryLabel.Senior (
  843.                         counterParty,
  844.                         currency
  845.                     ),
  846.                     new DiffusionEvolver (
  847.                         DiffusionEvaluatorLogarithmic.Standard (
  848.                             dblCounterPartyRecoveryRateDrift,
  849.                             dblCounterPartyRecoveryRateVolatility
  850.                         )
  851.                     )
  852.                 )
  853.             )
  854.         );

  855.         LatentStateVertexContainer latentStateVertexContainer = new LatentStateVertexContainer();

  856.         latentStateVertexContainer.add (
  857.             EntityEquityLabel.Standard (
  858.                 "AAPL",
  859.                 currency
  860.             ),
  861.             dblAssetNumeraireInitial
  862.         );

  863.         MarketVertex mvInitial = MarketVertex.Nodal (
  864.             dtSpot,
  865.             dblOvernightIndexNumeraireDrift,
  866.             1.,
  867.             dblCollateralSchemeNumeraireDrift,
  868.             1.,
  869.             new MarketVertexEntity (
  870.                 1.,
  871.                 dblBankHazardRateInitial,
  872.                 dblBankSeniorRecoveryRateInitial,
  873.                 dblBankSeniorFundingNumeraireDrift,
  874.                 1.,
  875.                 dblBankSubordinateRecoveryRateInitial,
  876.                 dblBankSubordinateFundingNumeraireDrift,
  877.                 1.
  878.             ),
  879.             new MarketVertexEntity (
  880.                 1.,
  881.                 dblCounterPartyHazardRateInitial,
  882.                 dblCounterPartyRecoveryRateInitial,
  883.                 dblCounterPartyFundingNumeraireDrift,
  884.                 1.,
  885.                 Double.NaN,
  886.                 Double.NaN,
  887.                 Double.NaN
  888.             ),
  889.             latentStateVertexContainer
  890.         );

  891.         MarketVertex[] aMV = MarketVertexArray (
  892.             mvg.marketVertex (
  893.                 mvInitial,
  894.                 Matrix.Transpose (
  895.                     SequenceGenerator.GaussianJoint (
  896.                         iNumVertex,
  897.                         aadblCorrelationMatrix
  898.                     )
  899.                 )
  900.             )
  901.         );

  902.         double dblDerivativeValue = dblTerminalXVADerivativeValue;
  903.         double dblDerivativeXVAValue = dblTerminalXVADerivativeValue;

  904.         PDEEvolutionControl pdeec = new PDEEvolutionControl (
  905.             PDEEvolutionControl.CLOSEOUT_GREGORY_LI_TANG,
  906.             dblSensitivityShiftFactor
  907.         );

  908.         CloseOutBilateral cob = new CloseOutBilateral (
  909.             dblBankSeniorRecoveryRateInitial,
  910.             dblCounterPartyRecoveryRateInitial
  911.         );

  912.         TrajectoryEvolutionScheme tes = new TrajectoryEvolutionScheme (
  913.             tc,
  914.             pdeec
  915.         );

  916.         BurgardKjaerOperator bko = new BurgardKjaerOperator (
  917.             tc,
  918.             pdeec
  919.         );

  920.         PositionGreekVertex agvInitial = new PositionGreekVertex (
  921.             dblDerivativeXVAValue,
  922.             -1.,
  923.             0.,
  924.             dblDerivativeValue
  925.         );

  926.         double dblGainOnBankDefaultInitial = -1. * (dblDerivativeXVAValue - cob.dealerDefault
  927.             (dblDerivativeXVAValue));

  928.         double dblGainOnCounterPartyDefaultInitial = -1. * (dblDerivativeXVAValue - cob.clientDefault
  929.             (dblDerivativeXVAValue));

  930.         ReplicationPortfolioVertex rpvInitial = ReplicationPortfolioVertex.Standard (
  931.             1.,
  932.             dblGainOnBankDefaultInitial,
  933.             dblGainOnCounterPartyDefaultInitial,
  934.             0.
  935.         ); */

  936.         EnvManager.InitEnv ("");

  937.         String dealer = "WFC";
  938.         String client = "BAC";
  939.         int vertexCount = 24;
  940.         String currency = "USD";
  941.         int simulationDuration = 365;

  942.         double dealerHazardRateInitial = 0.03;
  943.         double clientHazardRateInitial = 0.05;
  944.         double dealerSeniorRecoveryRateInitial = 0.40;
  945.         double clientRecoveryRateInitial = 0.40;

  946.         double[][] latentStateCorrelationMatrix = new double[][]
  947.         {
  948.             {1.00, 0.00, 0.20, 0.15, 0.05, 0.00, 0.00, 0.00, 0.00, 0.00}, // #0  DEALER HAZARD
  949.             {0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #1  DEALER SENIOR RECOVERY
  950.             {0.20, 0.00, 1.00, 0.13, 0.25, 0.00, 0.00, 0.00, 0.00, 0.00}, // #2  CLIENT HAZARD
  951.             {0.15, 0.00, 0.13, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #3  CLIENT RECOVERY
  952.             {0.05, 0.00, 0.25, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00}, // #4  OVERNIGHT REPLICATOR
  953.             {0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00}, // #5  CSA REPLICATOR
  954.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00}, // #6  DEALER SENIOR FUNDING REPLICATOR
  955.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00}, // #7  DEALER SUBORDINATE FUNDING REPLICATOR
  956.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00}, // #8  CLIENT FUNDING REPLICATOR
  957.             {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00}, // #9  EQUITY REPLICATOR
  958.         };

  959.         double dblTerminalXVADerivativeValue = 1.;

  960.         double dblSensitivityShiftFactor = 0.001;

  961.         JulianDate spotDateJulian = DateUtil.Today();

  962.         int spotDate = spotDateJulian.julian();

  963.         int[] eventVertexArray = VertexDateBuilder.EqualWidth (
  964.             spotDate,
  965.             spotDate + simulationDuration,
  966.             vertexCount
  967.         );

  968.         List<LatentStateLabel> latentStateLabelList = new ArrayList<LatentStateLabel>();

  969.         EntityEquityLabel equityLabel = EntityEquityLabel.Standard (
  970.             "AAPL",
  971.             currency
  972.         );

  973.         MarketVertexGenerator marketVertexGenerator = ConstructMarketVertexGenerator (
  974.             spotDateJulian,
  975.             eventVertexArray,
  976.             currency,
  977.             dealer,
  978.             client,
  979.             equityLabel,
  980.             latentStateLabelList
  981.         );

  982.         System.out.println ("marketVertexGenerator = " + marketVertexGenerator);

  983.         LatentStateVertexContainer latentStateVertexContainer = new LatentStateVertexContainer();

  984.         latentStateVertexContainer.add (
  985.             equityLabel,
  986.             1.
  987.         );

  988.         MarketVertex initialMarketVertex = MarketVertex.Epochal (
  989.             spotDateJulian,
  990.             1.000,
  991.             1.000,
  992.             dealerHazardRateInitial,
  993.             dealerSeniorRecoveryRateInitial,
  994.             dealerHazardRateInitial / (1 - dealerSeniorRecoveryRateInitial),
  995.             clientHazardRateInitial,
  996.             clientRecoveryRateInitial,
  997.             clientHazardRateInitial / (1 - clientRecoveryRateInitial),
  998.             latentStateVertexContainer
  999.         );

  1000.         CorrelatedPathVertexDimension correlatedPathVertexDimension = new CorrelatedPathVertexDimension (
  1001.             new RandomNumberGenerator(),
  1002.             latentStateCorrelationMatrix,
  1003.             vertexCount,
  1004.             1,
  1005.             true,
  1006.             null
  1007.         );

  1008.         MarketVertex[] aMV = MarketVertexArray (
  1009.             marketVertexGenerator.marketVertex (
  1010.                 initialMarketVertex,
  1011.                 LatentStateWeiner.FromUnitRandom (
  1012.                     latentStateLabelList,
  1013.                     Matrix.Transpose (correlatedPathVertexDimension.straightPathVertexRd().flatform())
  1014.                 )
  1015.             )
  1016.         );

  1017.         System.out.println ("aMV = " + aMV);

  1018.         double dblDerivativeValue = dblTerminalXVADerivativeValue;
  1019.         double dblDerivativeXVAValue = dblTerminalXVADerivativeValue;

  1020.         PDEEvolutionControl pdeec = new PDEEvolutionControl (
  1021.             PDEEvolutionControl.CLOSEOUT_GREGORY_LI_TANG,
  1022.             dblSensitivityShiftFactor
  1023.         );

  1024.         CloseOutBilateral cob = new CloseOutBilateral (
  1025.             dealerSeniorRecoveryRateInitial,
  1026.             clientRecoveryRateInitial
  1027.         );

  1028.         TrajectoryEvolutionScheme tes = new TrajectoryEvolutionScheme (
  1029.             marketVertexGenerator.primarySecurityDynamicsContainer(),
  1030.             pdeec
  1031.         );

  1032.         BurgardKjaerOperator bko = new BurgardKjaerOperator (
  1033.             marketVertexGenerator.primarySecurityDynamicsContainer(),
  1034.             pdeec
  1035.         );

  1036.         PositionGreekVertex agvInitial = new PositionGreekVertex (
  1037.             dblDerivativeXVAValue,
  1038.             -1.,
  1039.             0.,
  1040.             dblDerivativeValue
  1041.         );

  1042.         double dblGainOnBankDefaultInitial = -1. * (dblDerivativeXVAValue - cob.dealerDefault
  1043.             (dblDerivativeXVAValue));

  1044.         double dblGainOnCounterPartyDefaultInitial = -1. * (dblDerivativeXVAValue - cob.clientDefault
  1045.             (dblDerivativeXVAValue));

  1046.         ReplicationPortfolioVertex rpvInitial = ReplicationPortfolioVertex.Standard (
  1047.             1.,
  1048.             dblGainOnBankDefaultInitial,
  1049.             dblGainOnCounterPartyDefaultInitial,
  1050.             0.
  1051.         );

  1052.         System.out.println();

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

  1054.         System.out.println ("\t||                                            BILATERAL XVA EVOLVER - BURGARD & KJAER (2011) REPLICATION PORTFOLIO EVOLUTION                                             ||");

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

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

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

  1058.         System.out.println ("\t||            - Derivative XVA Value                                                                                                                                     ||");

  1059.         System.out.println ("\t||            - Asset Price Realization                                                                                                                                  ||");

  1060.         System.out.println ("\t||            - Realization of the Zero Coupon Bank Bond Price                                                                                                           ||");

  1061.         System.out.println ("\t||            - Realization of the Zero Coupon Counter Party Bond Price                                                                                                  ||");

  1062.         System.out.println ("\t||            - Realization of the Zero Coupon Collateral Bond Price                                                                                                     ||");

  1063.         System.out.println ("\t||            - Derivative XVA Asset Replication Units                                                                                                                   ||");

  1064.         System.out.println ("\t||            - Derivative XVA Value Bank Bond Replication Units                                                                                                         ||");

  1065.         System.out.println ("\t||            - Derivative XVA Value Counter Party Bond Replication Units                                                                                                ||");

  1066.         System.out.println ("\t||            - Derivative XVA Value Cash Account Replication Units                                                                                                      ||");

  1067.         System.out.println ("\t||            - Derivative Cash Account Accumulation Component                                                                                                           ||");

  1068.         System.out.println ("\t||            - Asset Cash Account Accumulation Component                                                                                                                ||");

  1069.         System.out.println ("\t||            - Bank Cash Account Accumulation Component                                                                                                                 ||");

  1070.         System.out.println ("\t||            - Counter Party Cash Account Accumulation Component                                                                                                        ||");

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

  1072.         System.out.println ("\t||" +
  1073.             FormatUtil.FormatDouble (1., 1, 6, 1.) + " | " +
  1074.             FormatUtil.FormatDouble (agvInitial.derivativeXVAValue(), 1, 6, 1.) + " | " +
  1075.             FormatUtil.FormatDouble (aMV[aMV.length - 1].latentStateValue (equityLabel), 1, 6, 1.) + " | " +
  1076.             FormatUtil.FormatDouble (1., 1, 6, 1.) + " | " +
  1077.             FormatUtil.FormatDouble (1., 1, 6, 1.) + " | " +
  1078.             FormatUtil.FormatDouble (1., 1, 6, 1.) + " | " +
  1079.             FormatUtil.FormatDouble (rpvInitial.positionHoldings(), 1, 6, 1.) + " | " +
  1080.             FormatUtil.FormatDouble (rpvInitial.dealerSeniorNumeraireHoldings(), 1, 6, 1.) + " | " +
  1081.             FormatUtil.FormatDouble (rpvInitial.clientNumeraireHoldings(), 1, 6, 1.) + " | " +
  1082.             FormatUtil.FormatDouble (rpvInitial.cashAccount(), 1, 6, 1.) + " | " +
  1083.             FormatUtil.FormatDouble (0., 1, 6, 1.) + " | " +
  1084.             FormatUtil.FormatDouble (0., 1, 6, 1.) + " | " +
  1085.             FormatUtil.FormatDouble (0., 1, 6, 1.) + " | " +
  1086.             FormatUtil.FormatDouble (0., 1, 6, 1.) + " ||"
  1087.         );

  1088.         EvolutionTrajectoryVertex etv = new EvolutionTrajectoryVertex (
  1089.             1.,
  1090.             rpvInitial,
  1091.             agvInitial,
  1092.             dblGainOnBankDefaultInitial,
  1093.             dblGainOnCounterPartyDefaultInitial,
  1094.             0.,
  1095.             0.
  1096.         );

  1097.         for (int i = vertexCount - 1; i >= 0; --i)
  1098.             etv = RunStep (
  1099.                 tes,
  1100.                 bko,
  1101.                 etv,
  1102.                 aMV[i + 1],
  1103.                 aMV[i],
  1104.                 equityLabel
  1105.             );

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

  1107.         System.out.println();

  1108.         EnvManager.TerminateEnv();
  1109.     }
  1110. }