DerivedZeroRate.java

  1. package org.drip.state.curve;

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

  81. /**
  82.  * <i>DerivedZeroRate</i> implements the delegated ZeroCurve functionality. Beyond discount factor/zero rate
  83.  * computation at specific cash pay nodes, all other functions are delegated to the embedded discount curve.
  84.  *
  85.  *  <br><br>
  86.  *  <ul>
  87.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  88.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
  89.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/state/README.md">Latent State Inference and Creation Utilities</a></li>
  90.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/state/curve/README.md">Basis Spline Based Latent States</a></li>
  91.  *  </ul>
  92.  * <br><br>
  93.  *
  94.  * @author Lakshmi Krishnamurthy
  95.  */

  96. public class DerivedZeroRate extends org.drip.state.discount.ZeroCurve {
  97.     private static final int NUM_DF_QUADRATURES = 5;

  98.     private org.drip.state.discount.DiscountCurve _dc = null;
  99.     private org.drip.spline.stretch.MultiSegmentSequence _mssDF = null;
  100.     private org.drip.spline.stretch.MultiSegmentSequence _mssZeroRate = null;

  101.     private static final boolean EntryFromDiscountCurve (
  102.         final org.drip.state.discount.DiscountCurve dc,
  103.         final int iDate,
  104.         final int iFreq,
  105.         final double dblYearFraction,
  106.         final double dblShift,
  107.         final java.util.Map<java.lang.Integer, java.lang.Double> mapDF,
  108.         final java.util.Map<java.lang.Integer, java.lang.Double> mapZeroRate)
  109.     {
  110.         try {
  111.             double dblZeroRate = org.drip.analytics.support.Helper.DF2Yield (iFreq, dc.df (iDate),
  112.                 dblYearFraction) + dblShift;

  113.             mapDF.put (iDate, org.drip.analytics.support.Helper.Yield2DF (iFreq, dblZeroRate,
  114.                 dblYearFraction));

  115.             mapZeroRate.put (iDate, dblZeroRate);

  116.             return true;
  117.         } catch (java.lang.Exception e) {
  118.             e.printStackTrace();
  119.         }

  120.         return false;
  121.     }

  122.     private static final boolean EntryFromYield (
  123.         final int iDate,
  124.         final int iFreq,
  125.         final double dblYearFraction,
  126.         final double dblShiftedYield,
  127.         final java.util.Map<java.lang.Integer, java.lang.Double> mapDF,
  128.         final java.util.Map<java.lang.Integer, java.lang.Double> mapZeroRate)
  129.     {
  130.         try {
  131.             mapDF.put (iDate, org.drip.analytics.support.Helper.Yield2DF (iFreq, dblShiftedYield,
  132.                 dblYearFraction));

  133.             mapZeroRate.put (iDate, dblShiftedYield);

  134.             return true;
  135.         } catch (java.lang.Exception e) {
  136.             e.printStackTrace();
  137.         }

  138.         return false;
  139.     }

  140.     /**
  141.      * Construct an Instance from the Discount Curve and the related Parameters
  142.      *
  143.      * @param iFreqZC Zero Curve Frequency
  144.      * @param strDCZC Zero Curve Day Count
  145.      * @param strCalendarZC Zero Curve Calendar
  146.      * @param bApplyEOMAdjZC Zero Coupon EOM Adjustment Flag
  147.      * @param lsCouponPeriod List of Bond coupon periods
  148.      * @param iWorkoutDate Work-out Date
  149.      * @param iValueDate Value Date
  150.      * @param iCashPayDate Cash-Pay Date
  151.      * @param dc Underlying Discount Curve
  152.      * @param dblZCBump DC Bump
  153.      * @param vcp Valuation Customization Parameters
  154.      * @param scbc Segment Custom Builder Control Parameters
  155.      *
  156.      * @return The Derived Zero Rate Instance
  157.      */

  158.     public static final DerivedZeroRate FromDiscountCurve (
  159.         final int iFreqZC,
  160.         final java.lang.String strDCZC,
  161.         final java.lang.String strCalendarZC,
  162.         final boolean bApplyEOMAdjZC,
  163.         final java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsCouponPeriod,
  164.         final int iWorkoutDate,
  165.         final int iValueDate,
  166.         final int iCashPayDate,
  167.         final org.drip.state.discount.DiscountCurve dc,
  168.         final double dblZCBump,
  169.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  170.         final org.drip.spline.params.SegmentCustomBuilderControl scbc)
  171.     {
  172.         if (null == lsCouponPeriod || 2 > lsCouponPeriod.size() || null == dc ||
  173.             !org.drip.numerical.common.NumberUtil.IsValid (dblZCBump) || null == scbc)
  174.             return null;

  175.         int iFreq = 0 == iFreqZC ? 2 : iFreqZC;
  176.         java.lang.String strCalendar = strCalendarZC;

  177.         java.lang.String strDC = null == strDCZC || strDCZC.isEmpty() ? "30/360" : strDCZC;

  178.         if (null != vcp) {
  179.             strDC = vcp.yieldDayCount();

  180.             iFreq = vcp.yieldFreq();

  181.             strCalendar = vcp.yieldCalendar();
  182.         }

  183.         java.util.Map<java.lang.Integer, java.lang.Double> mapDF = new java.util.TreeMap<java.lang.Integer,
  184.             java.lang.Double>();

  185.         java.util.Map<java.lang.Integer, java.lang.Double> mapZeroRate = new
  186.             java.util.TreeMap<java.lang.Integer, java.lang.Double>();

  187.         mapDF.put (iValueDate, 1.);

  188.         mapZeroRate.put (iValueDate, 0.);

  189.         for (org.drip.analytics.cashflow.CompositePeriod period : lsCouponPeriod) {
  190.             int iPeriodPayDate = period.payDate();

  191.             if (iValueDate >= iPeriodPayDate) continue;

  192.             int iPeriodStartDate = period.startDate();

  193.             int iPeriodEndDate = period.endDate();

  194.             try {
  195.                 if (!EntryFromDiscountCurve (dc, iPeriodPayDate, iFreq,
  196.                     org.drip.analytics.daycount.Convention.YearFraction (iValueDate, iPeriodPayDate, strDC,
  197.                         true, new org.drip.analytics.daycount.ActActDCParams (iFreq, iPeriodEndDate -
  198.                             iPeriodStartDate), strCalendar), dblZCBump, mapDF, mapZeroRate))
  199.                     return null;
  200.             } catch (java.lang.Exception e) {
  201.                 e.printStackTrace();

  202.                 return null;
  203.             }
  204.         }

  205.         org.drip.analytics.daycount.ActActDCParams aap =
  206.             org.drip.analytics.daycount.ActActDCParams.FromFrequency (iFreq);

  207.         try {
  208.             if (!EntryFromDiscountCurve (dc, iWorkoutDate, iFreq,
  209.                 org.drip.analytics.daycount.Convention.YearFraction (iValueDate, iWorkoutDate, strDC, true,
  210.                     aap, strCalendar), dblZCBump, mapDF, mapZeroRate))
  211.                 return null;

  212.             if (iValueDate != iCashPayDate) {
  213.                 if (!EntryFromDiscountCurve (dc, iCashPayDate, iFreq,
  214.                     org.drip.analytics.daycount.Convention.YearFraction (iValueDate, iCashPayDate, strDC,
  215.                         true, aap, strCalendar), dblZCBump, mapDF, mapZeroRate))
  216.                     return null;
  217.             }
  218.         } catch (java.lang.Exception e) {
  219.             e.printStackTrace();

  220.             return null;
  221.         }

  222.         int iNumNode = mapDF.size();

  223.         int iNode = 0;
  224.         double[] adblDF = new double[iNumNode];
  225.         double[] aiDate = new double[iNumNode];
  226.         double[] adblZeroRate = new double[iNumNode];

  227.         for (java.util.Map.Entry<java.lang.Integer, java.lang.Double> me : mapDF.entrySet()) {
  228.             adblDF[iNode] = me.getValue();

  229.             aiDate[iNode] = me.getKey();

  230.             adblZeroRate[iNode++] = mapZeroRate.get (me.getKey());
  231.         }

  232.         org.drip.spline.params.SegmentCustomBuilderControl[] aSCBC = new
  233.             org.drip.spline.params.SegmentCustomBuilderControl[adblDF.length - 1];

  234.         for (int i = 0; i < adblDF.length - 1; ++i)
  235.             aSCBC[i] = scbc;

  236.         org.drip.spline.stretch.BoundarySettings bsNatural =
  237.             org.drip.spline.stretch.BoundarySettings.NaturalStandard();

  238.         try{
  239.             return new DerivedZeroRate (dc,
  240.                 org.drip.spline.stretch.MultiSegmentSequenceBuilder.CreateCalibratedStretchEstimator
  241.                     ("DF_STRETCH", aiDate, adblDF, aSCBC, null, bsNatural,
  242.                         org.drip.spline.stretch.MultiSegmentSequence.CALIBRATE),
  243.                             org.drip.spline.stretch.MultiSegmentSequenceBuilder.CreateCalibratedStretchEstimator
  244.                 ("ZERO_RATE_STRETCH", aiDate, adblZeroRate, aSCBC, null, bsNatural,
  245.                     org.drip.spline.stretch.MultiSegmentSequence.CALIBRATE));
  246.         } catch (java.lang.Exception e) {
  247.             e.printStackTrace();
  248.         }

  249.         return null;
  250.     }

  251.     /**
  252.      * Construct an Instance from the Govvie Curve and the related Parameters
  253.      *
  254.      * @param iFreqZC Zero Curve Frequency
  255.      * @param strDCZC Zero Curve Day Count
  256.      * @param strCalendarZC Zero Curve Calendar
  257.      * @param bApplyEOMAdjZC Zero Coupon EOM Adjustment Flag
  258.      * @param lsCouponPeriod List of bond coupon periods
  259.      * @param iWorkoutDate Work-out Date
  260.      * @param iValueDate Value Date
  261.      * @param iCashPayDate Cash-Pay Date
  262.      * @param gc Underlying Govvie Curve
  263.      * @param dblZCBump DC Bump
  264.      * @param vcp Valuation Customization Parameters
  265.      * @param scbc Segment Custom Builder Control Parameters
  266.      *
  267.      * @return The Derived Zero Rate Instance
  268.      */

  269.     public static final DerivedZeroRate FromGovvieCurve (
  270.         final int iFreqZC,
  271.         final java.lang.String strDCZC,
  272.         final java.lang.String strCalendarZC,
  273.         final boolean bApplyEOMAdjZC,
  274.         final java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsCouponPeriod,
  275.         final int iWorkoutDate,
  276.         final int iValueDate,
  277.         final int iCashPayDate,
  278.         final org.drip.state.govvie.GovvieCurve gc,
  279.         final double dblZCBump,
  280.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  281.         final org.drip.spline.params.SegmentCustomBuilderControl scbc)
  282.     {
  283.         if (null == lsCouponPeriod || 2 > lsCouponPeriod.size() || null == gc ||
  284.             !org.drip.numerical.common.NumberUtil.IsValid (dblZCBump) || null == scbc)
  285.             return null;

  286.         int iFreq = 0 == iFreqZC ? 2 : iFreqZC;
  287.         boolean bApplyCpnEOMAdj = bApplyEOMAdjZC;
  288.         java.lang.String strCalendar = strCalendarZC;
  289.         double dblShiftedYield = java.lang.Double.NaN;

  290.         try {
  291.             dblShiftedYield = gc.yield (iWorkoutDate) + dblZCBump;
  292.         } catch (java.lang.Exception e) {
  293.             e.printStackTrace();

  294.             return null;
  295.         }

  296.         java.lang.String strDC = null == strDCZC || strDCZC.isEmpty() ? "30/360" : strDCZC;

  297.         if (null != vcp) {
  298.             strDC = vcp.yieldDayCount();

  299.             iFreq = vcp.yieldFreq();

  300.             bApplyCpnEOMAdj = vcp.applyYieldEOMAdj();

  301.             strCalendar = vcp.yieldCalendar();
  302.         }

  303.         java.util.Map<java.lang.Integer, java.lang.Double> mapDF = new java.util.TreeMap<java.lang.Integer,
  304.             java.lang.Double>();

  305.         java.util.Map<java.lang.Integer, java.lang.Double> mapZeroRate = new
  306.             java.util.TreeMap<java.lang.Integer, java.lang.Double>();

  307.         mapDF.put (iValueDate, 1.);

  308.         mapZeroRate.put (iValueDate, 0.);

  309.         for (org.drip.analytics.cashflow.CompositePeriod period : lsCouponPeriod) {
  310.             int iPeriodPayDate = period.payDate();

  311.             if (iValueDate >= iPeriodPayDate) continue;

  312.             int iPeriodStartDate = period.startDate();

  313.             int iPeriodEndDate = period.endDate();

  314.             try {
  315.                 if (!EntryFromYield (iPeriodPayDate, iFreq,
  316.                     org.drip.analytics.daycount.Convention.YearFraction (iValueDate, iPeriodPayDate, strDC,
  317.                         bApplyCpnEOMAdj, new org.drip.analytics.daycount.ActActDCParams (iFreq,
  318.                             iPeriodEndDate - iPeriodStartDate), strCalendar), dblShiftedYield, mapDF,
  319.                                 mapZeroRate))
  320.                     return null;
  321.             } catch (java.lang.Exception e) {
  322.                 e.printStackTrace();

  323.                 return null;
  324.             }
  325.         }

  326.         org.drip.analytics.daycount.ActActDCParams aap =
  327.             org.drip.analytics.daycount.ActActDCParams.FromFrequency (iFreq);

  328.         try {
  329.             if (!EntryFromYield (iWorkoutDate, iFreq, org.drip.analytics.daycount.Convention.YearFraction
  330.                 (iValueDate, iWorkoutDate, strDC, bApplyCpnEOMAdj, aap, strCalendar), dblShiftedYield, mapDF,
  331.                     mapZeroRate))
  332.                 return null;

  333.             if (iCashPayDate != iValueDate) {
  334.                 if (!EntryFromYield (iCashPayDate, iFreq, org.drip.analytics.daycount.Convention.YearFraction
  335.                     (iValueDate, iCashPayDate, strDC, bApplyCpnEOMAdj, aap, strCalendar), dblShiftedYield,
  336.                         mapDF, mapZeroRate))
  337.                     return null;
  338.             }
  339.         } catch (java.lang.Exception e) {
  340.             e.printStackTrace();

  341.             return null;
  342.         }

  343.         int iNumNode = mapDF.size();

  344.         int iNode = 0;
  345.         double[] adblDF = new double[iNumNode];
  346.         double[] aiDate = new double[iNumNode];
  347.         double[] adblZeroRate = new double[iNumNode];

  348.         for (java.util.Map.Entry<java.lang.Integer, java.lang.Double> me : mapDF.entrySet()) {
  349.             adblDF[iNode] = me.getValue();

  350.             aiDate[iNode] = me.getKey();

  351.             adblZeroRate[iNode++] = mapZeroRate.get (me.getKey());
  352.         }

  353.         org.drip.spline.params.SegmentCustomBuilderControl[] aSCBC = new
  354.             org.drip.spline.params.SegmentCustomBuilderControl[adblDF.length - 1];

  355.         for (int i = 0; i < adblDF.length - 1; ++i)
  356.             aSCBC[i] = scbc;

  357.         org.drip.spline.stretch.BoundarySettings bsNatural =
  358.             org.drip.spline.stretch.BoundarySettings.NaturalStandard();

  359.         try {
  360.             return new DerivedZeroRate (gc,
  361.                 org.drip.spline.stretch.MultiSegmentSequenceBuilder.CreateCalibratedStretchEstimator
  362.                     ("DF_STRETCH", aiDate, adblDF, aSCBC, null, bsNatural,
  363.                         org.drip.spline.stretch.MultiSegmentSequence.CALIBRATE),
  364.                             org.drip.spline.stretch.MultiSegmentSequenceBuilder.CreateCalibratedStretchEstimator
  365.                 ("ZERO_RATE_STRETCH", aiDate, adblZeroRate, aSCBC, null, bsNatural,
  366.                     org.drip.spline.stretch.MultiSegmentSequence.CALIBRATE));
  367.         } catch (java.lang.Exception e) {
  368.             e.printStackTrace();
  369.         }

  370.         return null;
  371.     }

  372.     /**
  373.      * Construct an Instance from the Input Curve and the related Parameters
  374.      *
  375.      * @param iFreq Zero Curve Frequency
  376.      * @param strDayCount Zero Curve Day Count
  377.      * @param strCalendar Zero Curve Calendar
  378.      * @param bApplyEOMAdj Zero Coupon EOM Adjustment Flag
  379.      * @param lsCouponPeriod List of bond coupon periods
  380.      * @param iWorkoutDate Work-out Date
  381.      * @param iValueDate Value Date
  382.      * @param iCashPayDate Cash-Pay Date
  383.      * @param dc Underlying Discount Curve
  384.      * @param dblBump DC Bump
  385.      * @param vcp Valuation Customization Parameters
  386.      * @param scbc Segment Custom Builder Control Parameters
  387.      *
  388.      * @return The Derived Zero Rate Instance
  389.      */

  390.     public static final DerivedZeroRate FromBaseCurve (
  391.         final int iFreq,
  392.         final java.lang.String strDayCount,
  393.         final java.lang.String strCalendar,
  394.         final boolean bApplyEOMAdj,
  395.         final java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsCouponPeriod,
  396.         final int iWorkoutDate,
  397.         final int iValueDate,
  398.         final int iCashPayDate,
  399.         final org.drip.state.discount.DiscountCurve dc,
  400.         final double dblBump,
  401.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  402.         final org.drip.spline.params.SegmentCustomBuilderControl scbc)
  403.     {
  404.         if (null == dc) return null;

  405.         return dc instanceof org.drip.state.govvie.GovvieCurve ? FromGovvieCurve (iFreq, strDayCount,
  406.             strCalendar, bApplyEOMAdj, lsCouponPeriod, iWorkoutDate, iValueDate, iCashPayDate,
  407.                 (org.drip.state.govvie.GovvieCurve) dc, dblBump, vcp, scbc) : FromDiscountCurve (iFreq,
  408.                     strDayCount, strCalendar, bApplyEOMAdj, lsCouponPeriod, iWorkoutDate, iValueDate,
  409.                         iCashPayDate, dc, dblBump, vcp, scbc);
  410.     }

  411.     private DerivedZeroRate (
  412.         final org.drip.state.discount.DiscountCurve dc,
  413.         final org.drip.spline.stretch.MultiSegmentSequence mssDF,
  414.         final org.drip.spline.stretch.MultiSegmentSequence mssZeroRate)
  415.         throws java.lang.Exception
  416.     {
  417.         super (dc.epoch().julian(), dc.currency());

  418.         if (null == (_mssDF = mssDF) || null == (_mssZeroRate = mssZeroRate))
  419.             throw new java.lang.Exception ("DerivedZeroRate Constructor: Invalid Inputs");

  420.         _dc = dc;
  421.     }

  422.     @Override public double df (
  423.         final int iDate)
  424.         throws java.lang.Exception
  425.     {
  426.         if (iDate <= epoch().julian()) return 1.;

  427.         return _mssDF.responseValue (iDate);
  428.     }

  429.     @Override public double df (
  430.         final java.lang.String strTenor)
  431.         throws java.lang.Exception
  432.     {
  433.         return df (epoch().addTenor (strTenor));
  434.     }

  435.     @Override public double zeroRate (
  436.         final int iDate)
  437.         throws java.lang.Exception
  438.     {
  439.         if (iDate <= epoch().julian()) return 1.;

  440.         return _mssZeroRate.responseValue (iDate);
  441.     }

  442.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> manifestMeasure (
  443.         final java.lang.String strInstr)
  444.     {
  445.         return _dc.manifestMeasure (strInstr);
  446.     }

  447.     @Override public org.drip.product.definition.CalibratableComponent[] calibComp()
  448.     {
  449.         return _dc.calibComp();
  450.     }

  451.     @Override public org.drip.state.identifier.LatentStateLabel label()
  452.     {
  453.         return _dc.label();
  454.     }

  455.     @Override public org.drip.analytics.definition.Curve parallelShiftManifestMeasure (
  456.         final java.lang.String strManifestMeasure,
  457.         final double dblShift)
  458.     {
  459.         return null;
  460.     }

  461.     @Override public org.drip.analytics.definition.Curve shiftManifestMeasure (
  462.         final int iSpanIndex,
  463.         final java.lang.String strManifestMeasure,
  464.         final double dblShift)
  465.     {
  466.         return null;
  467.     }

  468.     @Override public org.drip.analytics.definition.Curve customTweakManifestMeasure (
  469.         final java.lang.String strManifestMeasure,
  470.         final org.drip.param.definition.ManifestMeasureTweak mmtp)
  471.     {
  472.         return null;
  473.     }

  474.     @Override public boolean setCCIS (
  475.         final org.drip.analytics.input.CurveConstructionInputSet ccis)
  476.     {
  477.          return _dc.setCCIS (ccis);
  478.     }

  479.     @Override public org.drip.state.representation.LatentState parallelShiftQuantificationMetric (
  480.         final double dblShift)
  481.     {
  482.         return _dc.parallelShiftQuantificationMetric (dblShift);
  483.     }

  484.     @Override public org.drip.state.representation.LatentState customTweakQuantificationMetric (
  485.         final org.drip.param.definition.ManifestMeasureTweak rvtp)
  486.     {
  487.         return _dc.customTweakQuantificationMetric (rvtp);
  488.     }

  489.     @Override public double df (
  490.         final org.drip.analytics.date.JulianDate dt)
  491.         throws java.lang.Exception
  492.     {
  493.         if (null == dt) throw new java.lang.Exception ("DerivedZeroRate::df => Invalid Inputs");

  494.         return df (dt.julian());
  495.     }

  496.     @Override public double effectiveDF (
  497.         final int iDate1,
  498.         final int iDate2)
  499.         throws java.lang.Exception
  500.     {
  501.         if (iDate1 == iDate2) return df (iDate1);

  502.         int iNumQuadratures = 0;
  503.         double dblEffectiveDF = 0.;
  504.         int iQuadratureWidth = (iDate2 - iDate1) / NUM_DF_QUADRATURES;

  505.         if (0 == iQuadratureWidth) iQuadratureWidth = 1;

  506.         for (int iDate = iDate1; iDate <= iDate2; iDate += iQuadratureWidth) {
  507.             ++iNumQuadratures;

  508.             dblEffectiveDF += (df (iDate) + df (iDate + iQuadratureWidth));
  509.         }

  510.         return dblEffectiveDF / (2. * iNumQuadratures);
  511.     }

  512.     @Override public double effectiveDF (
  513.         final org.drip.analytics.date.JulianDate dt1,
  514.         final org.drip.analytics.date.JulianDate dt2)
  515.         throws java.lang.Exception
  516.     {
  517.         if (null == dt1 || null == dt2)
  518.             throw new java.lang.Exception ("DerivedZeroRate::effectiveDF => Got null for date");

  519.         return effectiveDF (dt1.julian(), dt2.julian());
  520.     }

  521.     @Override public double effectiveDF (
  522.         final java.lang.String strTenor1,
  523.         final java.lang.String strTenor2)
  524.         throws java.lang.Exception
  525.     {
  526.         if (null == strTenor1 || strTenor1.isEmpty() || null == strTenor2 || strTenor2.isEmpty())
  527.             throw new java.lang.Exception ("DerivedZeroRate::effectiveDF => Got bad tenor");

  528.         org.drip.analytics.date.JulianDate dtStart = epoch();

  529.         return effectiveDF (dtStart.addTenor (strTenor1), dtStart.addTenor (strTenor2));
  530.     }
  531. }