BucketSensitivityIR.java

  1. package org.drip.simm.product;

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

  75. /**
  76.  * <i>BucketSensitivityIR</i> holds the ISDA SIMM Risk Factor Tenor Bucket Sensitivities across IR Factor Sub
  77.  * Curves. USD Exposures enhanced with the USD specific Sub-Curve Factors - PRIME and MUNICIPAL. The
  78.  * References are:
  79.  *
  80.  * <br><br>
  81.  *  <ul>
  82.  *      <li>
  83.  *          Andersen, L. B. G., M. Pykhtin, and A. Sokol (2017): Credit Exposure in the Presence of Initial
  84.  *              Margin https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2806156 <b>eSSRN</b>
  85.  *      </li>
  86.  *      <li>
  87.  *          Albanese, C., S. Caenazzo, and O. Frankel (2017): Regression Sensitivities for Initial Margin
  88.  *              Calculations https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2763488 <b>eSSRN</b>
  89.  *      </li>
  90.  *      <li>
  91.  *          Anfuso, F., D. Aziz, P. Giltinan, and K. Loukopoulus (2017): A Sound Modeling and Back-testing
  92.  *              Framework for Forecasting Initial Margin Requirements
  93.  *                  https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2716279 <b>eSSRN</b>
  94.  *      </li>
  95.  *      <li>
  96.  *          Caspers, P., P. Giltinan, R. Lichters, and N. Nowaczyk (2017): Forecasting Initial Margin
  97.  *              Requirements - A Model Evaluation https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2911167
  98.  *                  <b>eSSRN</b>
  99.  *      </li>
  100.  *      <li>
  101.  *          International Swaps and Derivatives Association (2017): SIMM v2.0 Methodology
  102.  *              https://www.isda.org/a/oFiDE/isda-simm-v2.pdf
  103.  *      </li>
  104.  *  </ul>
  105.  *
  106.  * <br><br>
  107.  *  <ul>
  108.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
  109.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/MarginAnalyticsLibrary.md">Initial and Variation Margin Analytics</a></li>
  110.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/simm/README.md">Initial Margin Analytics based on ISDA SIMM and its Variants</a></li>
  111.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/simm/product/README.md">ISDA SIMM Risk Factor Sensitivities</a></li>
  112.  *  </ul>
  113.  * <br><br>
  114.  *
  115.  * @author Lakshmi Krishnamurthy
  116.  */

  117. public class BucketSensitivityIR
  118. {
  119.     private org.drip.simm.product.RiskFactorTenorSensitivity _oisTenorSensitivity = null;
  120.     private org.drip.simm.product.RiskFactorTenorSensitivity _primeTenorSensitivity = null;
  121.     private org.drip.simm.product.RiskFactorTenorSensitivity _libor1MTenorSensitivity = null;
  122.     private org.drip.simm.product.RiskFactorTenorSensitivity _libor3MTenorSensitivity = null;
  123.     private org.drip.simm.product.RiskFactorTenorSensitivity _libor6MTenorSensitivity = null;
  124.     private org.drip.simm.product.RiskFactorTenorSensitivity _libor12MTenorSensitivity = null;
  125.     private org.drip.simm.product.RiskFactorTenorSensitivity _municipalTenorSensitivity = null;

  126.     private org.drip.simm.margin.BucketAggregateIR linearAggregate (
  127.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  128.     {
  129.         org.drip.simm.margin.RiskFactorAggregateIR riskFactorAggregate = curveAggregate
  130.             (bucketSensitivitySettings);

  131.         if (null == riskFactorAggregate)
  132.         {
  133.             return null;
  134.         }

  135.         org.drip.simm.margin.SensitivityAggregateIR sensitivityAggregate = riskFactorAggregate.linearMargin
  136.             (bucketSensitivitySettings);

  137.         if (null == sensitivityAggregate)
  138.         {
  139.             return null;
  140.         }

  141.         try
  142.         {
  143.             return new org.drip.simm.margin.BucketAggregateIR (
  144.                 riskFactorAggregate,
  145.                 sensitivityAggregate,
  146.                 sensitivityAggregate.cumulativeMarginCovariance(),
  147.                 riskFactorAggregate.cumulativeSensitivityMargin()
  148.             );
  149.         }
  150.         catch (java.lang.Exception e)
  151.         {
  152.             e.printStackTrace();
  153.         }

  154.         return null;
  155.     }

  156.     private org.drip.simm.margin.BucketAggregateIR curvatureAggregate (
  157.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  158.     {
  159.         org.drip.simm.margin.RiskFactorAggregateIR riskFactorAggregate = curveAggregate
  160.             (bucketSensitivitySettings);

  161.         if (null == riskFactorAggregate)
  162.         {
  163.             return null;
  164.         }

  165.         org.drip.simm.margin.SensitivityAggregateIR sensitivityAggregate =
  166.             riskFactorAggregate.curvatureMargin (bucketSensitivitySettings);

  167.         if (null == sensitivityAggregate)
  168.         {
  169.             return null;
  170.         }

  171.         try
  172.         {
  173.             return new org.drip.simm.margin.BucketAggregateIR (
  174.                 riskFactorAggregate,
  175.                 sensitivityAggregate,
  176.                 sensitivityAggregate.cumulativeMarginCovariance(),
  177.                 riskFactorAggregate.cumulativeSensitivityMargin()
  178.             );
  179.         }
  180.         catch (java.lang.Exception e)
  181.         {
  182.             e.printStackTrace();
  183.         }

  184.         return null;
  185.     }

  186.     /**
  187.      * Generate a Standard Instance of BucketSensitivityIR from the Tenor Sensitivity Maps
  188.      *
  189.      * @param oisTenorSensitivity OIS Tenor Sensitivity Map
  190.      * @param libor1MTenorSensitivity LIBOR1M Tenor Sensitivity Map
  191.      * @param libor3MTenorSensitivity LIBOR3M Tenor Sensitivity Map
  192.      * @param libor6MTenorSensitivity LIBOR6M Tenor Sensitivity Map
  193.      * @param libor12MTenorSensitivity LIBOR 12M Tenor Sensitivity Map
  194.      * @param primeTenorSensitivity Prime Tenor Sensitivity Map
  195.      * @param municipalTenorSensitivity Municipal Tenor Sensitivity Map
  196.      *
  197.      * @return Standard Instance of BucketSensitivityIR from the Tenor Sensitivity Maps
  198.      */

  199.     public static final BucketSensitivityIR Standard (
  200.         final java.util.Map<java.lang.String, java.lang.Double> oisTenorSensitivity,
  201.         final java.util.Map<java.lang.String, java.lang.Double> libor1MTenorSensitivity,
  202.         final java.util.Map<java.lang.String, java.lang.Double> libor3MTenorSensitivity,
  203.         final java.util.Map<java.lang.String, java.lang.Double> libor6MTenorSensitivity,
  204.         final java.util.Map<java.lang.String, java.lang.Double> libor12MTenorSensitivity,
  205.         final java.util.Map<java.lang.String, java.lang.Double> primeTenorSensitivity,
  206.         final java.util.Map<java.lang.String, java.lang.Double> municipalTenorSensitivity)
  207.     {
  208.         try
  209.         {
  210.             return new BucketSensitivityIR (
  211.                 new org.drip.simm.product.RiskFactorTenorSensitivity (oisTenorSensitivity),
  212.                 new org.drip.simm.product.RiskFactorTenorSensitivity (libor1MTenorSensitivity),
  213.                 new org.drip.simm.product.RiskFactorTenorSensitivity (libor3MTenorSensitivity),
  214.                 new org.drip.simm.product.RiskFactorTenorSensitivity (libor6MTenorSensitivity),
  215.                 new org.drip.simm.product.RiskFactorTenorSensitivity (libor12MTenorSensitivity),
  216.                 new org.drip.simm.product.RiskFactorTenorSensitivity (primeTenorSensitivity),
  217.                 new org.drip.simm.product.RiskFactorTenorSensitivity (municipalTenorSensitivity)
  218.             );
  219.         }
  220.         catch (java.lang.Exception e)
  221.         {
  222.             e.printStackTrace();
  223.         }

  224.         return null;
  225.     }

  226.     /**
  227.      * BucketSensitivityIR Constructor
  228.      *
  229.      * @param oisTenorSensitivity The OIS Risk Factor Tenor Sensitivity
  230.      * @param libor1MTenorSensitivity The LIBOR1M Risk Factor Tenor Sensitivity
  231.      * @param libor3MTenorSensitivity The LIBOR3M Risk Factor Tenor Sensitivity
  232.      * @param libor6MTenorSensitivity The LIBOR6M Risk Factor Tenor Delta Sensitivity
  233.      * @param libor12MTenorSensitivity The LIBOR12M Risk Factor Tenor Sensitivity
  234.      * @param primeTenorSensitivity The PRIME Risk Factor Tenor Sensitivity
  235.      * @param municipalTenorSensitivity The MUNICIPAL Risk Factor Tenor Sensitivity
  236.      *
  237.      * @throws java.lang.Exception Thrown if the Inputs are Invalid
  238.      */

  239.     public BucketSensitivityIR (
  240.         final org.drip.simm.product.RiskFactorTenorSensitivity oisTenorSensitivity,
  241.         final org.drip.simm.product.RiskFactorTenorSensitivity libor1MTenorSensitivity,
  242.         final org.drip.simm.product.RiskFactorTenorSensitivity libor3MTenorSensitivity,
  243.         final org.drip.simm.product.RiskFactorTenorSensitivity libor6MTenorSensitivity,
  244.         final org.drip.simm.product.RiskFactorTenorSensitivity libor12MTenorSensitivity,
  245.         final org.drip.simm.product.RiskFactorTenorSensitivity primeTenorSensitivity,
  246.         final org.drip.simm.product.RiskFactorTenorSensitivity municipalTenorSensitivity)
  247.         throws java.lang.Exception
  248.     {
  249.         if (null == (_oisTenorSensitivity = oisTenorSensitivity) ||
  250.             null == (_libor1MTenorSensitivity = libor1MTenorSensitivity) ||
  251.             null == (_libor3MTenorSensitivity = libor3MTenorSensitivity) ||
  252.             null == (_libor6MTenorSensitivity = libor6MTenorSensitivity) ||
  253.             null == (_libor12MTenorSensitivity = libor12MTenorSensitivity) ||
  254.             null == (_primeTenorSensitivity = primeTenorSensitivity) ||
  255.             null == (_municipalTenorSensitivity = municipalTenorSensitivity))
  256.         {
  257.             throw new java.lang.Exception ("BucketSensitivityIR Constructor => Invalid Inputs");
  258.         }
  259.     }

  260.     /**
  261.      * Retrieve the OIS Risk Factor Tenor Sensitivity
  262.      *
  263.      * @return The OIS Risk Factor Tenor Sensitivity
  264.      */

  265.     public org.drip.simm.product.RiskFactorTenorSensitivity oisTenorSensitivity()
  266.     {
  267.         return _oisTenorSensitivity;
  268.     }

  269.     /**
  270.      * Retrieve the LIBOR1M Risk Factor Tenor Sensitivity
  271.      *
  272.      * @return The LIBOR1M Risk Factor Tenor Sensitivity
  273.      */

  274.     public org.drip.simm.product.RiskFactorTenorSensitivity libor1MTenorSensitivity()
  275.     {
  276.         return _libor1MTenorSensitivity;
  277.     }

  278.     /**
  279.      * Retrieve the LIBOR3M Risk Factor Tenor Sensitivity
  280.      *
  281.      * @return The LIBOR3M Risk Factor Tenor Sensitivity
  282.      */

  283.     public org.drip.simm.product.RiskFactorTenorSensitivity libor3MTenorSensitivity()
  284.     {
  285.         return _libor3MTenorSensitivity;
  286.     }

  287.     /**
  288.      * Retrieve the LIBOR6M Risk Factor Tenor Sensitivity
  289.      *
  290.      * @return The LIBOR6M Risk Factor Tenor Sensitivity
  291.      */

  292.     public org.drip.simm.product.RiskFactorTenorSensitivity libor6MTenorSensitivity()
  293.     {
  294.         return _libor6MTenorSensitivity;
  295.     }

  296.     /**
  297.      * Retrieve the LIBOR12M Risk Factor Tenor Sensitivity
  298.      *
  299.      * @return The LIBOR12M Risk Factor Tenor Sensitivity
  300.      */

  301.     public org.drip.simm.product.RiskFactorTenorSensitivity libor12MTenorSensitivity()
  302.     {
  303.         return _libor12MTenorSensitivity;
  304.     }

  305.     /**
  306.      * Retrieve the PRIME Risk Factor Tenor Sensitivity
  307.      *
  308.      * @return The PRIME Risk Factor Tenor Sensitivity
  309.      */

  310.     public org.drip.simm.product.RiskFactorTenorSensitivity primeTenorSensitivity()
  311.     {
  312.         return _primeTenorSensitivity;
  313.     }

  314.     /**
  315.      * Retrieve the MUNICIPAL Risk Factor Tenor Sensitivity
  316.      *
  317.      * @return The MUNICIPAL Risk Factor Tenor Sensitivity
  318.      */

  319.     public org.drip.simm.product.RiskFactorTenorSensitivity municipalTenorSensitivity()
  320.     {
  321.         return _municipalTenorSensitivity;
  322.     }

  323.     /**
  324.      * Generate the Cumulative Tenor Sensitivity
  325.      *
  326.      * @return The Cumulative Tenor Sensitivity
  327.      */

  328.     public double cumulativeTenorSensitivity()
  329.     {
  330.         return _oisTenorSensitivity.cumulative() +
  331.             _libor1MTenorSensitivity.cumulative() +
  332.             _libor3MTenorSensitivity.cumulative() +
  333.             _libor6MTenorSensitivity.cumulative() +
  334.             _libor12MTenorSensitivity.cumulative() +
  335.             _primeTenorSensitivity.cumulative() +
  336.             _municipalTenorSensitivity.cumulative();
  337.     }

  338.     /**
  339.      * Compute the Sensitivity Concentration Risk Factor
  340.      *
  341.      * @param sensitivityConcentrationThreshold The Sensitivity Concentration Threshold
  342.      *
  343.      * @return The Sensitivity Concentration Risk Factor
  344.      *
  345.      * @throws java.lang.Exception Thrown if the Inputs are Invalid
  346.      */

  347.     public double sensitivityConcentrationRiskFactor (
  348.         final double sensitivityConcentrationThreshold)
  349.         throws java.lang.Exception
  350.     {
  351.         if (!org.drip.numerical.common.NumberUtil.IsValid (sensitivityConcentrationThreshold))
  352.         {
  353.             throw new java.lang.Exception
  354.                 ("BucketSensitivityIR::sensitivityConcentrationRiskFactor => Invalid Inputs");
  355.         }

  356.         return java.lang.Math.max (
  357.             java.lang.Math.sqrt (
  358.                 java.lang.Math.max (
  359.                     cumulativeTenorSensitivity(),
  360.                     0.
  361.                 ) / sensitivityConcentrationThreshold
  362.             ),
  363.             1.
  364.         );
  365.     }

  366.     /**
  367.      * Generate the OIS Tenor Sensitivity Margin Map
  368.      *
  369.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  370.      *
  371.      * @return The OIS Tenor Sensitivity Margin Map
  372.      */

  373.     public java.util.Map<java.lang.String, java.lang.Double> oisTenorMargin (
  374.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  375.     {
  376.         if (null == bucketSensitivitySettings)
  377.         {
  378.             return null;
  379.         }

  380.         java.util.Map<java.lang.String, java.lang.Double> oisTenorMargin =
  381.             _oisTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.oisTenorRiskWeight());

  382.         if (null == oisTenorMargin)
  383.         {
  384.             return oisTenorMargin;
  385.         }

  386.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  387.         try
  388.         {
  389.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  390.                 (bucketSensitivitySettings.concentrationThreshold());
  391.         }
  392.         catch (java.lang.Exception e)
  393.         {
  394.             e.printStackTrace();

  395.             return null;
  396.         }

  397.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> oisTenorMarginEntry :
  398.             oisTenorMargin.entrySet())
  399.         {
  400.             java.lang.String tenor = oisTenorMarginEntry.getKey();

  401.             oisTenorMargin.put (
  402.                 tenor,
  403.                 oisTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  404.             );
  405.         }

  406.         return oisTenorMargin;
  407.     }

  408.     /**
  409.      * Generate the LIBOR1M Tenor Sensitivity Margin Map
  410.      *
  411.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  412.      *
  413.      * @return The LIBOR1M Tenor Sensitivity Margin Map
  414.      */

  415.     public java.util.Map<java.lang.String, java.lang.Double> libor1MTenorMargin (
  416.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  417.     {
  418.         if (null == bucketSensitivitySettings)
  419.         {
  420.             return null;
  421.         }

  422.         java.util.Map<java.lang.String, java.lang.Double> libor1MTenorMargin =
  423.             _libor1MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor1MTenorRiskWeight());

  424.         if (null == libor1MTenorMargin)
  425.         {
  426.             return libor1MTenorMargin;
  427.         }

  428.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  429.         try
  430.         {
  431.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  432.                 (bucketSensitivitySettings.concentrationThreshold());
  433.         }
  434.         catch (java.lang.Exception e)
  435.         {
  436.             e.printStackTrace();

  437.             return null;
  438.         }

  439.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> libor1MTenorMarginEntry :
  440.             libor1MTenorMargin.entrySet())
  441.         {
  442.             java.lang.String tenor = libor1MTenorMarginEntry.getKey();

  443.             libor1MTenorMargin.put (
  444.                 tenor,
  445.                 libor1MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  446.             );
  447.         }

  448.         return libor1MTenorMargin;
  449.     }

  450.     /**
  451.      * Generate the LIBOR3M Tenor Sensitivity Margin Map
  452.      *
  453.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  454.      *
  455.      * @return The LIBOR3M Tenor Sensitivity Margin Map
  456.      */

  457.     public java.util.Map<java.lang.String, java.lang.Double> libor3MTenorMargin (
  458.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  459.     {
  460.         if (null == bucketSensitivitySettings)
  461.         {
  462.             return null;
  463.         }

  464.         java.util.Map<java.lang.String, java.lang.Double> libor3MTenorMargin =
  465.             _libor3MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor3MTenorRiskWeight());

  466.         if (null == libor3MTenorMargin)
  467.         {
  468.             return libor3MTenorMargin;
  469.         }

  470.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  471.         try
  472.         {
  473.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  474.                 (bucketSensitivitySettings.concentrationThreshold());
  475.         }
  476.         catch (java.lang.Exception e)
  477.         {
  478.             e.printStackTrace();

  479.             return null;
  480.         }

  481.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> libor3MTenorMarginEntry :
  482.             libor3MTenorMargin.entrySet())
  483.         {
  484.             java.lang.String tenor = libor3MTenorMarginEntry.getKey();

  485.             libor3MTenorMargin.put (
  486.                 tenor,
  487.                 libor3MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  488.             );
  489.         }

  490.         return libor3MTenorMargin;
  491.     }

  492.     /**
  493.      * Generate the LIBOR6M Tenor Sensitivity Margin Map
  494.      *
  495.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  496.      *
  497.      * @return The LIBOR6M Tenor Sensitivity Margin Map
  498.      */

  499.     public java.util.Map<java.lang.String, java.lang.Double> libor6MTenorMargin (
  500.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  501.     {
  502.         if (null == bucketSensitivitySettings)
  503.         {
  504.             return null;
  505.         }

  506.         java.util.Map<java.lang.String, java.lang.Double> libor6MTenorMargin =
  507.             _libor6MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor6MTenorRiskWeight());

  508.         if (null == libor6MTenorMargin)
  509.         {
  510.             return libor6MTenorMargin;
  511.         }

  512.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  513.         try
  514.         {
  515.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  516.                 (bucketSensitivitySettings.concentrationThreshold());
  517.         }
  518.         catch (java.lang.Exception e)
  519.         {
  520.             e.printStackTrace();

  521.             return null;
  522.         }

  523.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> libor6MTenorMarginEntry :
  524.             libor6MTenorMargin.entrySet())
  525.         {
  526.             java.lang.String tenor = libor6MTenorMarginEntry.getKey();

  527.             libor6MTenorMargin.put (
  528.                 tenor,
  529.                 libor6MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  530.             );
  531.         }

  532.         return libor6MTenorMargin;
  533.     }

  534.     /**
  535.      * Generate the LIBOR12M Tenor Sensitivity Margin Map
  536.      *
  537.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  538.      *
  539.      * @return The LIBOR12M Tenor Sensitivity Margin Map
  540.      */

  541.     public java.util.Map<java.lang.String, java.lang.Double> libor12MTenorMargin (
  542.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  543.     {
  544.         if (null == bucketSensitivitySettings)
  545.         {
  546.             return null;
  547.         }

  548.         java.util.Map<java.lang.String, java.lang.Double> libor12MTenorMargin =
  549.             _libor12MTenorSensitivity.sensitivityMargin
  550.                 (bucketSensitivitySettings.libor12MTenorRiskWeight());

  551.         if (null == libor12MTenorMargin)
  552.         {
  553.             return libor12MTenorMargin;
  554.         }

  555.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  556.         try
  557.         {
  558.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  559.                 (bucketSensitivitySettings.concentrationThreshold());
  560.         }
  561.         catch (java.lang.Exception e)
  562.         {
  563.             e.printStackTrace();

  564.             return null;
  565.         }

  566.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> libor12MTenorMarginEntry :
  567.             libor12MTenorMargin.entrySet())
  568.         {
  569.             java.lang.String tenor = libor12MTenorMarginEntry.getKey();

  570.             libor12MTenorMargin.put (
  571.                 tenor,
  572.                 libor12MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  573.             );
  574.         }

  575.         return libor12MTenorMargin;
  576.     }

  577.     /**
  578.      * Generate the PRIME Tenor Sensitivity Margin Map
  579.      *
  580.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  581.      *
  582.      * @return The PRIME Tenor Sensitivity Margin Map
  583.      */

  584.     public java.util.Map<java.lang.String, java.lang.Double> primeTenorMargin (
  585.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  586.     {
  587.         if (null == bucketSensitivitySettings)
  588.         {
  589.             return null;
  590.         }

  591.         java.util.Map<java.lang.String, java.lang.Double> primeTenorMargin =
  592.             _primeTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.primeTenorRiskWeight());

  593.         if (null == primeTenorMargin)
  594.         {
  595.             return primeTenorMargin;
  596.         }

  597.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  598.         try
  599.         {
  600.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  601.                 (bucketSensitivitySettings.concentrationThreshold());
  602.         }
  603.         catch (java.lang.Exception e)
  604.         {
  605.             e.printStackTrace();

  606.             return null;
  607.         }

  608.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> primeTenorMarginEntry :
  609.             primeTenorMargin.entrySet())
  610.         {
  611.             java.lang.String tenor = primeTenorMarginEntry.getKey();

  612.             primeTenorMargin.put (
  613.                 tenor,
  614.                 primeTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  615.             );
  616.         }

  617.         return primeTenorMargin;
  618.     }

  619.     /**
  620.      * Generate the MUNICIPAL Tenor Sensitivity Margin Map
  621.      *
  622.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  623.      *
  624.      * @return The MUNICIPAL Tenor Sensitivity Margin Map
  625.      */

  626.     public java.util.Map<java.lang.String, java.lang.Double> municipalTenorMargin (
  627.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  628.     {
  629.         if (null == bucketSensitivitySettings)
  630.         {
  631.             return null;
  632.         }

  633.         java.util.Map<java.lang.String, java.lang.Double> municipalTenorMargin =
  634.             _municipalTenorSensitivity.sensitivityMargin
  635.                 (bucketSensitivitySettings.municipalTenorRiskWeight());

  636.         if (null == municipalTenorMargin)
  637.         {
  638.             return municipalTenorMargin;
  639.         }

  640.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  641.         try
  642.         {
  643.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  644.                 (bucketSensitivitySettings.concentrationThreshold());
  645.         }
  646.         catch (java.lang.Exception e)
  647.         {
  648.             e.printStackTrace();

  649.             return null;
  650.         }

  651.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> municipalTenorMarginEntry :
  652.             municipalTenorMargin.entrySet())
  653.         {
  654.             java.lang.String tenor = municipalTenorMarginEntry.getKey();

  655.             municipalTenorMargin.put (
  656.                 tenor,
  657.                 municipalTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  658.             );
  659.         }

  660.         return municipalTenorMargin;
  661.     }

  662.     /**
  663.      * Generate the IR Margin Factor Curve Tenor Aggregate
  664.      *
  665.      * @param bucketSensitivitySettings The Bucket Tenor Sensitivity Settings
  666.      *
  667.      * @return The IR Margin Factor Curve Tenor Aggregate
  668.      */

  669.     public org.drip.simm.margin.RiskFactorAggregateIR curveAggregate (
  670.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettings)
  671.     {
  672.         if (null == bucketSensitivitySettings)
  673.         {
  674.             return null;
  675.         }

  676.         java.util.Map<java.lang.String, java.lang.Double> oisTenorMargin =
  677.             _oisTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.oisTenorRiskWeight());

  678.         java.util.Map<java.lang.String, java.lang.Double> libor1MTenorMargin =
  679.             _libor1MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor1MTenorRiskWeight());

  680.         java.util.Map<java.lang.String, java.lang.Double> libor3MTenorMargin =
  681.             _libor3MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor3MTenorRiskWeight());

  682.         java.util.Map<java.lang.String, java.lang.Double> libor6MTenorMargin =
  683.             _libor6MTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.libor6MTenorRiskWeight());

  684.         java.util.Map<java.lang.String, java.lang.Double> libor12MTenorMargin =
  685.             _libor12MTenorSensitivity.sensitivityMargin
  686.                 (bucketSensitivitySettings.libor12MTenorRiskWeight());

  687.         java.util.Map<java.lang.String, java.lang.Double> primeTenorMargin =
  688.             _primeTenorSensitivity.sensitivityMargin (bucketSensitivitySettings.primeTenorRiskWeight());

  689.         java.util.Map<java.lang.String, java.lang.Double> municipalTenorMargin =
  690.             _municipalTenorSensitivity.sensitivityMargin
  691.                 (bucketSensitivitySettings.municipalTenorRiskWeight());

  692.         if (null == oisTenorMargin ||
  693.             null == libor1MTenorMargin ||
  694.             null == libor3MTenorMargin ||
  695.             null == libor6MTenorMargin ||
  696.             null == libor12MTenorMargin ||
  697.             null == primeTenorMargin ||
  698.             null == municipalTenorMargin)
  699.         {
  700.             return null;
  701.         }

  702.         double sensitivityConcentrationRiskFactor = java.lang.Double.NaN;

  703.         try
  704.         {
  705.             sensitivityConcentrationRiskFactor = sensitivityConcentrationRiskFactor
  706.                 (bucketSensitivitySettings.concentrationThreshold());
  707.         }
  708.         catch (java.lang.Exception e)
  709.         {
  710.             e.printStackTrace();

  711.             return null;
  712.         }

  713.         for (java.util.Map.Entry<java.lang.String, java.lang.Double> municipalTenorMarginEntry :
  714.             municipalTenorMargin.entrySet())
  715.         {
  716.             java.lang.String tenor = municipalTenorMarginEntry.getKey();

  717.             oisTenorMargin.put (
  718.                 tenor,
  719.                 oisTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  720.             );

  721.             libor1MTenorMargin.put (
  722.                 tenor,
  723.                 libor1MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  724.             );

  725.             libor3MTenorMargin.put (
  726.                 tenor,
  727.                 libor3MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  728.             );

  729.             libor6MTenorMargin.put (
  730.                 tenor,
  731.                 libor6MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  732.             );

  733.             libor12MTenorMargin.put (
  734.                 tenor,
  735.                 libor12MTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  736.             );

  737.             primeTenorMargin.put (
  738.                 tenor,
  739.                 primeTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  740.             );

  741.             municipalTenorMargin.put (
  742.                 tenor,
  743.                 municipalTenorMargin.get (tenor) * sensitivityConcentrationRiskFactor
  744.             );
  745.         }

  746.         try
  747.         {
  748.             return new org.drip.simm.margin.RiskFactorAggregateIR (
  749.                 oisTenorMargin,
  750.                 libor1MTenorMargin,
  751.                 libor3MTenorMargin,
  752.                 libor6MTenorMargin,
  753.                 libor12MTenorMargin,
  754.                 primeTenorMargin,
  755.                 municipalTenorMargin,
  756.                 sensitivityConcentrationRiskFactor
  757.             );
  758.         }
  759.         catch (java.lang.Exception e)
  760.         {
  761.             e.printStackTrace();
  762.         }

  763.         return null;
  764.     }

  765.     /**
  766.      * Generate the Bucket IR Sensitivity Margin Aggregate
  767.      *
  768.      * @param bucketSensitivitySettingsIR The IR Bucket Sensitivity Settings
  769.      *
  770.      * @return The Bucket IR Sensitivity Margin Aggregate
  771.      */

  772.     public org.drip.simm.margin.BucketAggregateIR aggregate (
  773.         final org.drip.simm.parameters.BucketSensitivitySettingsIR bucketSensitivitySettingsIR)
  774.     {
  775.         if (null == bucketSensitivitySettingsIR)
  776.         {
  777.             return null;
  778.         }

  779.         return bucketSensitivitySettingsIR instanceof org.drip.simm.parameters.BucketCurvatureSettingsIR ?
  780.             curvatureAggregate (bucketSensitivitySettingsIR) : linearAggregate (bucketSensitivitySettingsIR);
  781.     }
  782. }