EvolutionTrajectoryVertex.java

  1. package org.drip.xva.derivative;

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

  76. /**
  77.  * <i>EvolutionTrajectoryVertex</i> holds the Evolution Snapshot of the Trade-able Prices, the Cash Account,
  78.  * the Replication Portfolio, and the corresponding Derivative Value, as laid out in Burgard and Kjaer
  79.  * (2014). The References are:
  80.  *
  81.  *  <br><br>
  82.  *  <ul>
  83.  *      <li>
  84.  *          Burgard, C., and M. Kjaer (2014): PDE Representations of Derivatives with Bilateral Counter-party
  85.  *              Risk and Funding Costs <i>Journal of Credit Risk</i> <b>7 (3)</b> 1-19
  86.  *      </li>
  87.  *      <li>
  88.  *          Cesari, G., J. Aquilina, N. Charpillon, X. Filipovic, G. Lee, and L. Manda (2009): <i>Modeling,
  89.  *              Pricing, and Hedging Counter-party Credit Exposure - A Technical Guide</i> <b>Springer
  90.  *              Finance</b> New York
  91.  *      </li>
  92.  *      <li>
  93.  *          Gregory, J. (2009): Being Two-faced over Counter-party Credit Risk <i>Risk</i> <b>20 (2)</b>
  94.  *              86-90
  95.  *      </li>
  96.  *      <li>
  97.  *          Li, B., and Y. Tang (2007): <i>Quantitative Analysis, Derivatives Modeling, and Trading
  98.  *              Strategies in the Presence of Counter-party Credit Risk for the Fixed Income Market</i>
  99.  *              <b>World Scientific Publishing</b> Singapore
  100.  *      </li>
  101.  *      <li>
  102.  *          Piterbarg, V. (2010): Funding Beyond Discounting: Collateral Agreements and Derivatives Pricing
  103.  *              <i>Risk</i> <b>21 (2)</b> 97-102
  104.  *      </li>
  105.  *  </ul>
  106.  *
  107.  *  <br><br>
  108.  *  <ul>
  109.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
  110.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/XVAAnalyticsLibrary.md">XVA Analytics Library</a></li>
  111.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/xva/README.md">Valuation Adjustments that account for Collateral, CC Credit/Debt and Funding Overhead</a></li>
  112.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/xva/derivative/README.md">Burgard Kjaer Dynamic Portfolio Replication</a></li>
  113.  *  </ul>
  114.  * <br><br>
  115.  *
  116.  * @author Lakshmi Krishnamurthy
  117.  */

  118. public class EvolutionTrajectoryVertex
  119. {
  120.     private double _time = java.lang.Double.NaN;
  121.     private double _collateral = java.lang.Double.NaN;
  122.     private double _hedgeError = java.lang.Double.NaN;
  123.     private double _clientGainOnDealerDefault = java.lang.Double.NaN;
  124.     private double _dealerGainOnClientDefault = java.lang.Double.NaN;
  125.     private org.drip.xva.derivative.PositionGreekVertex _positionGreekVertex = null;
  126.     private org.drip.xva.derivative.ReplicationPortfolioVertex _replicationPortfolioVertex = null;

  127.     /**
  128.      * EvolutionTrajectoryVertex Constructor
  129.      *
  130.      * @param time The Evolution Trajectory Edge Time
  131.      * @param replicationPortfolioVertex The Replication Portfolio Vertex
  132.      * @param positionGreekVertex The Position Greek Vertex
  133.      * @param clientGainOnDealerDefault Client Gain On Dealer Default
  134.      * @param dealerGainOnClientDefault Dealer Gain On Default of Client
  135.      * @param collateral The Vertex Collateral
  136.      * @param hedgeError The Vertex Hedge Error
  137.      *
  138.      * @throws java.lang.Exception Thrown if the Inputs are Invalid
  139.      */

  140.     public EvolutionTrajectoryVertex (
  141.         final double time,
  142.         final org.drip.xva.derivative.ReplicationPortfolioVertex replicationPortfolioVertex,
  143.         final org.drip.xva.derivative.PositionGreekVertex positionGreekVertex,
  144.         final double clientGainOnDealerDefault,
  145.         final double dealerGainOnClientDefault,
  146.         final double collateral,
  147.         final double hedgeError)
  148.         throws java.lang.Exception
  149.     {
  150.         if (!org.drip.numerical.common.NumberUtil.IsValid (_time = time) ||
  151.             null == (_replicationPortfolioVertex = replicationPortfolioVertex) ||
  152.             null == (_positionGreekVertex = positionGreekVertex) ||
  153.             !org.drip.numerical.common.NumberUtil.IsValid (_clientGainOnDealerDefault =
  154.                 clientGainOnDealerDefault) ||
  155.             !org.drip.numerical.common.NumberUtil.IsValid (_dealerGainOnClientDefault =
  156.                 dealerGainOnClientDefault) ||
  157.             !org.drip.numerical.common.NumberUtil.IsValid (_collateral = collateral) ||
  158.             !org.drip.numerical.common.NumberUtil.IsValid (_hedgeError = hedgeError))
  159.         {
  160.             throw new java.lang.Exception ("EvolutionTrajectoryVertex Constructor => Invalid Inputs");
  161.         }
  162.     }

  163.     /**
  164.      * Retrieve the Time Instant
  165.      *
  166.      * @return The Time Instant
  167.      */

  168.     public double time()
  169.     {
  170.         return _time;
  171.     }

  172.     /**
  173.      * Retrieve the Collateral
  174.      *
  175.      * @return The Collateral
  176.      */

  177.     public double collateral()
  178.     {
  179.         return _collateral;
  180.     }

  181.     /**
  182.      * Retrieve the Hedge Error
  183.      *
  184.      * @return The Hedge Error
  185.      */

  186.     public double hedgeError()
  187.     {
  188.         return _hedgeError;
  189.     }

  190.     /**
  191.      * Retrieve the Replication Portfolio Vertex
  192.      *
  193.      * @return The Replication Portfolio Vertex
  194.      */

  195.     public org.drip.xva.derivative.ReplicationPortfolioVertex replicationPortfolioVertex()
  196.     {
  197.         return _replicationPortfolioVertex;
  198.     }

  199.     /**
  200.      * Retrieve the Position Greek Vertex
  201.      *
  202.      * @return The Position Greek Vertex
  203.      */

  204.     public org.drip.xva.derivative.PositionGreekVertex positionGreekVertex()
  205.     {
  206.         return _positionGreekVertex;
  207.     }

  208.     /**
  209.      * Retrieve the Client Gain On Dealer Default
  210.      *
  211.      * @return The Client Gain On Dealer Default
  212.      */

  213.     public double gainOnDealerDefault()
  214.     {
  215.         return _clientGainOnDealerDefault;
  216.     }

  217.     /**
  218.      * Retrieve the Dealer Gain On Individual Client Default
  219.      *
  220.      * @return The Dealer Gain On Individual Client Default
  221.      */

  222.     public double gainOnClientDefault()
  223.     {
  224.         return _dealerGainOnClientDefault;
  225.     }

  226.     /**
  227.      * Indicate whether Replication Portfolio satisfies the Funding Constraint implied by the Vertex
  228.      *  Numeraire
  229.      *
  230.      * @param marketVertex The Market Vertex
  231.      *
  232.      * @return The Funding Constraint Verification Mismatch
  233.      *
  234.      * @throws java.lang.Exception Thrown if the Inputs are Invalid
  235.      */

  236.     public double verifyFundingConstraint (
  237.         final org.drip.exposure.universe.MarketVertex marketVertex)
  238.         throws java.lang.Exception
  239.     {
  240.         if (null == marketVertex)
  241.         {
  242.             throw new java.lang.Exception
  243.                 ("EvolutionTrajectoryVertex::verifyFundingConstraint => Invalid Inputs");
  244.         }

  245.         org.drip.exposure.universe.MarketVertexEntity dealerMarketVertex = marketVertex.dealer();

  246.         double fundingConstraint = _positionGreekVertex.derivativeXVAValue() +
  247.             dealerMarketVertex.seniorFundingReplicator() *
  248.                 _replicationPortfolioVertex.dealerSeniorNumeraireHoldings();

  249.         double dealerSubordinateFundingMarketVertex = dealerMarketVertex.subordinateFundingReplicator();

  250.         if (org.drip.numerical.common.NumberUtil.IsValid (dealerSubordinateFundingMarketVertex))
  251.         {
  252.             fundingConstraint += dealerSubordinateFundingMarketVertex *
  253.                 _replicationPortfolioVertex.dealerSubordinateNumeraireHoldings();
  254.         }

  255.         return fundingConstraint;
  256.     }
  257. }