KeyRateDuration.java

  1. package org.drip.sample.treasuryfuturesapi;

  2. import java.util.*;

  3. import org.drip.analytics.date.*;
  4. import org.drip.numerical.common.FormatUtil;
  5. import org.drip.service.env.EnvManager;
  6. import org.drip.service.product.TreasuryFuturesAPI;

  7. /*
  8.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  9.  */

  10. /*!
  11.  * Copyright (C) 2018 Lakshmi Krishnamurthy
  12.  * Copyright (C) 2017 Lakshmi Krishnamurthy
  13.  * Copyright (C) 2016 Lakshmi Krishnamurthy
  14.  *
  15.  *  This file is part of DRIP, a free-software/open-source library for buy/side financial/trading model
  16.  *      libraries targeting analysts and developers
  17.  *      https://lakshmidrip.github.io/DRIP/
  18.  *  
  19.  *  DRIP is composed of four main libraries:
  20.  *  
  21.  *  - DRIP Fixed Income - https://lakshmidrip.github.io/DRIP-Fixed-Income/
  22.  *  - DRIP Asset Allocation - https://lakshmidrip.github.io/DRIP-Asset-Allocation/
  23.  *  - DRIP Numerical Optimizer - https://lakshmidrip.github.io/DRIP-Numerical-Optimizer/
  24.  *  - DRIP Statistical Learning - https://lakshmidrip.github.io/DRIP-Statistical-Learning/
  25.  *
  26.  *  - DRIP Fixed Income: Library for Instrument/Trading Conventions, Treasury Futures/Options,
  27.  *      Funding/Forward/Overnight Curves, Multi-Curve Construction/Valuation, Collateral Valuation and XVA
  28.  *      Metric Generation, Calibration and Hedge Attributions, Statistical Curve Construction, Bond RV
  29.  *      Metrics, Stochastic Evolution and Option Pricing, Interest Rate Dynamics and Option Pricing, LMM
  30.  *      Extensions/Calibrations/Greeks, Algorithmic Differentiation, and Asset Backed Models and Analytics.
  31.  *
  32.  *  - DRIP Asset Allocation: Library for model libraries for MPT framework, Black Litterman Strategy
  33.  *      Incorporator, Holdings Constraint, and Transaction Costs.
  34.  *
  35.  *  - DRIP Numerical Optimizer: Library for Numerical Optimization and Spline Functionality.
  36.  *
  37.  *  - DRIP Statistical Learning: Library for Statistical Evaluation and Machine Learning.
  38.  *
  39.  *  Licensed under the Apache License, Version 2.0 (the "License");
  40.  *      you may not use this file except in compliance with the License.
  41.  *  
  42.  *  You may obtain a copy of the License at
  43.  *      http://www.apache.org/licenses/LICENSE-2.0
  44.  *  
  45.  *  Unless required by applicable law or agreed to in writing, software
  46.  *      distributed under the License is distributed on an "AS IS" BASIS,
  47.  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  48.  *  
  49.  *  See the License for the specific language governing permissions and
  50.  *      limitations under the License.
  51.  */

  52. /**
  53.  * KeyRateDuration demonstrates the Invocation and Examination of the Key Rate Duration Computation for the
  54.  *  specified Treasury Futures.
  55.  *
  56.  * @author Lakshmi Krishnamurthy
  57.  */

  58. public class KeyRateDuration {

  59.     private static void ComputeKeyRateDuration (
  60.         final String strFuturesCode,
  61.         final int[] aiFuturesComponentTreasuryEffectiveDate,
  62.         final int[] aiFuturesComponentTreasuryMaturityDate,
  63.         final double[] adblFuturesComponentTreasuryCoupon,
  64.         final double[] adblFuturesComponentConversionFactor,
  65.         final int iSpotDate,
  66.         final int[] aiGovvieCurveTreasuryEffectiveDate,
  67.         final int[] aiGovvieCurveTreasuryMaturityDate,
  68.         final double[] adblGovvieCurveTreasuryCoupon,
  69.         final double[] adblGovvieCurveTreasuryYield,
  70.         final String strGovvieCurveTreasuryMeasure,
  71.         final double[] adblFuturesComponentTreasuryPrice,
  72.         final boolean bHeader,
  73.         final boolean bTrailer)
  74.         throws Exception
  75.     {
  76.         Map<String, Double> mapKeyRateDuration = TreasuryFuturesAPI.KeyRateDuration (
  77.             strFuturesCode,
  78.             aiFuturesComponentTreasuryEffectiveDate,
  79.             aiFuturesComponentTreasuryMaturityDate,
  80.             adblFuturesComponentTreasuryCoupon,
  81.             adblFuturesComponentConversionFactor,
  82.             iSpotDate,
  83.             aiGovvieCurveTreasuryEffectiveDate,
  84.             aiGovvieCurveTreasuryMaturityDate,
  85.             adblGovvieCurveTreasuryCoupon,
  86.             adblGovvieCurveTreasuryYield,
  87.             strGovvieCurveTreasuryMeasure,
  88.             adblFuturesComponentTreasuryPrice
  89.         );

  90.         if (bHeader) {
  91.             System.out.println ("\n\t|------------------------------------------------------------------------------------------------------------------------------------||");

  92.             System.out.print ("\t| CODE |");

  93.             Set<String> setstrKey = mapKeyRateDuration.keySet();

  94.             for (String strKey : setstrKey)
  95.                 System.out.print (" " + strKey + " |");

  96.             System.out.println ("|");

  97.             System.out.println ("\t|------------------------------------------------------------------------------------------------------------------------------------||");
  98.         }

  99.         System.out.print ("\t|  " + strFuturesCode + " |");

  100.         for (Map.Entry<String, Double> me : mapKeyRateDuration.entrySet())
  101.             System.out.print ("     " + FormatUtil.FormatDouble (-1. * me.getValue(), 1, 5, 1.) + "    |");

  102.         System.out.println ("|");

  103.         if (bTrailer)
  104.             System.out.println ("\t|------------------------------------------------------------------------------------------------------------------------------------||\n");
  105.     }

  106.     public static final void main (
  107.         final String[] args)
  108.         throws Exception
  109.     {
  110.         EnvManager.InitEnv ("");

  111.         int[] aiFuturesComponentTreasuryEffectiveDate = new int[] {
  112.             DateUtil.CreateFromYMD (2014, DateUtil.FEBRUARY,  28).julian(), // 912828J5
  113.             DateUtil.CreateFromYMD (2014, DateUtil.MARCH,     31).julian(), // 912828J8
  114.             DateUtil.CreateFromYMD (2014, DateUtil.APRIL,     30).julian(), // 912828K5
  115.             DateUtil.CreateFromYMD (2014, DateUtil.MAY,       31).julian(), // 912828XE
  116.             DateUtil.CreateFromYMD (2014, DateUtil.JUNE,      30).julian(), // 912828XH
  117.             DateUtil.CreateFromYMD (2014, DateUtil.JULY,      31).julian(), // 912828XM
  118.             DateUtil.CreateFromYMD (2014, DateUtil.AUGUST,    31).julian(), // 912828L3
  119.             DateUtil.CreateFromYMD (2014, DateUtil.SEPTEMBER, 30).julian(), // 912828L6
  120.             DateUtil.CreateFromYMD (2014, DateUtil.OCTOBER,   31).julian()  // 912828L9
  121.         };

  122.         int[] aiFuturesComponentTreasuryMaturityDate = new int[] {
  123.             DateUtil.CreateFromYMD (2020, DateUtil.FEBRUARY,  28).julian(), // 912828J5
  124.             DateUtil.CreateFromYMD (2020, DateUtil.MARCH,     31).julian(), // 912828J8
  125.             DateUtil.CreateFromYMD (2020, DateUtil.APRIL,     30).julian(), // 912828K5
  126.             DateUtil.CreateFromYMD (2020, DateUtil.MAY,       31).julian(), // 912828XE
  127.             DateUtil.CreateFromYMD (2020, DateUtil.JUNE,      30).julian(), // 912828XH
  128.             DateUtil.CreateFromYMD (2020, DateUtil.JULY,      31).julian(), // 912828XM
  129.             DateUtil.CreateFromYMD (2020, DateUtil.AUGUST,    31).julian(), // 912828L3
  130.             DateUtil.CreateFromYMD (2020, DateUtil.SEPTEMBER, 30).julian(), // 912828L6
  131.             DateUtil.CreateFromYMD (2020, DateUtil.OCTOBER,   31).julian()  // 912828L9
  132.         };

  133.         double[] adblFuturesComponentTreasuryCoupon = new double[] {
  134.             0.01375, // 912828J5
  135.             0.01375, // 912828J8
  136.             0.01375, // 912828K5
  137.             0.01500, // 912828XE
  138.             0.01625, // 912828XH
  139.             0.01625, // 912828XM
  140.             0.01375, // 912828L3
  141.             0.01375, // 912828L6
  142.             0.01375  // 912828L9
  143.         };

  144.         double[] adblFuturesComponentConversionFactor = new double[] {
  145.             0.8317, // 912828J5
  146.             0.8287, // 912828J8
  147.             0.8258, // 912828K5
  148.             0.8276, // 912828XE
  149.             0.8297, // 912828XH
  150.             0.8269, // 912828XM
  151.             0.8141, // 912828L3
  152.             0.8113, // 912828L6
  153.             0.8084  // 912828L9
  154.         };

  155.         int iSpotDate = DateUtil.CreateFromYMD (
  156.             2015,
  157.             DateUtil.NOVEMBER,
  158.             18
  159.         ).julian();

  160.         int[] aiGovvieCurveTreasuryEffectiveDate = new int[] {
  161.             iSpotDate,
  162.             iSpotDate,
  163.             iSpotDate,
  164.             iSpotDate,
  165.             iSpotDate,
  166.             iSpotDate,
  167.             iSpotDate
  168.         };

  169.         int[] aiGovvieCurveTreasuryMaturityDate = new int[] {
  170.             new JulianDate (iSpotDate).addTenor ("1Y").julian(),
  171.             new JulianDate (iSpotDate).addTenor ("2Y").julian(),
  172.             new JulianDate (iSpotDate).addTenor ("3Y").julian(),
  173.             new JulianDate (iSpotDate).addTenor ("5Y").julian(),
  174.             new JulianDate (iSpotDate).addTenor ("7Y").julian(),
  175.             new JulianDate (iSpotDate).addTenor ("10Y").julian(),
  176.             new JulianDate (iSpotDate).addTenor ("30Y").julian()
  177.         };

  178.         double[] adblGovvieCurveTreasuryCoupon = new double[] {
  179.             0.0100,
  180.             0.0100,
  181.             0.0125,
  182.             0.0150,
  183.             0.0200,
  184.             0.0225,
  185.             0.0300
  186.         };

  187.         double[] adblGovvieCurveTreasuryYield = new double[] {
  188.             0.00692,
  189.             0.00945,
  190.             0.01257,
  191.             0.01678,
  192.             0.02025,
  193.             0.02235,
  194.             0.02972
  195.         };

  196.         String strGovvieCurveTreasuryMeasure = "Yield";

  197.         double[] adblFuturesComponentTreasuryPrice = new double[] {
  198.              0.99909375, // 912828J5
  199.              0.99900000, // 912828J8
  200.              0.99890625, // 912828K5
  201.              0.99943750, // 912828XE
  202.              0.99984375, // 912828XH
  203.              0.99978125, // 912828XM
  204.              0.99862500, // 912828L3
  205.              0.99850000, // 912828L6
  206.              0.99853125  // 912828L9
  207.         };

  208.         ComputeKeyRateDuration (
  209.             "CN1",
  210.             aiFuturesComponentTreasuryEffectiveDate,
  211.             aiFuturesComponentTreasuryMaturityDate,
  212.             adblFuturesComponentTreasuryCoupon,
  213.             adblFuturesComponentConversionFactor,
  214.             iSpotDate,
  215.             aiGovvieCurveTreasuryEffectiveDate,
  216.             aiGovvieCurveTreasuryMaturityDate,
  217.             adblGovvieCurveTreasuryCoupon,
  218.             adblGovvieCurveTreasuryYield,
  219.             strGovvieCurveTreasuryMeasure,
  220.             adblFuturesComponentTreasuryPrice,
  221.             true,
  222.             false
  223.         );

  224.         ComputeKeyRateDuration (
  225.             "DU1",
  226.             aiFuturesComponentTreasuryEffectiveDate,
  227.             aiFuturesComponentTreasuryMaturityDate,
  228.             adblFuturesComponentTreasuryCoupon,
  229.             adblFuturesComponentConversionFactor,
  230.             iSpotDate,
  231.             aiGovvieCurveTreasuryEffectiveDate,
  232.             aiGovvieCurveTreasuryMaturityDate,
  233.             adblGovvieCurveTreasuryCoupon,
  234.             adblGovvieCurveTreasuryYield,
  235.             strGovvieCurveTreasuryMeasure,
  236.             adblFuturesComponentTreasuryPrice,
  237.             false,
  238.             false
  239.         );

  240.         /* ComputeKeyRateDuration (
  241.             "FBB1",
  242.             aiFuturesComponentTreasuryEffectiveDate,
  243.             aiFuturesComponentTreasuryMaturityDate,
  244.             adblFuturesComponentTreasuryCoupon,
  245.             adblFuturesComponentConversionFactor,
  246.             iSpotDate,
  247.             aiGovvieCurveTreasuryEffectiveDate,
  248.             aiGovvieCurveTreasuryMaturityDate,
  249.             adblGovvieCurveTreasuryCoupon,
  250.             adblGovvieCurveTreasuryYield,
  251.             strGovvieCurveTreasuryMeasure,
  252.             adblFuturesComponentTreasuryPrice,
  253.             false,
  254.             false
  255.         ); */

  256.         ComputeKeyRateDuration (
  257.             "FV1",
  258.             aiFuturesComponentTreasuryEffectiveDate,
  259.             aiFuturesComponentTreasuryMaturityDate,
  260.             adblFuturesComponentTreasuryCoupon,
  261.             adblFuturesComponentConversionFactor,
  262.             iSpotDate,
  263.             aiGovvieCurveTreasuryEffectiveDate,
  264.             aiGovvieCurveTreasuryMaturityDate,
  265.             adblGovvieCurveTreasuryCoupon,
  266.             adblGovvieCurveTreasuryYield,
  267.             strGovvieCurveTreasuryMeasure,
  268.             adblFuturesComponentTreasuryPrice,
  269.             false,
  270.             false
  271.         );

  272.         ComputeKeyRateDuration (
  273.             "G1",
  274.             aiFuturesComponentTreasuryEffectiveDate,
  275.             aiFuturesComponentTreasuryMaturityDate,
  276.             adblFuturesComponentTreasuryCoupon,
  277.             adblFuturesComponentConversionFactor,
  278.             iSpotDate,
  279.             aiGovvieCurveTreasuryEffectiveDate,
  280.             aiGovvieCurveTreasuryMaturityDate,
  281.             adblGovvieCurveTreasuryCoupon,
  282.             adblGovvieCurveTreasuryYield,
  283.             strGovvieCurveTreasuryMeasure,
  284.             adblFuturesComponentTreasuryPrice,
  285.             false,
  286.             false
  287.         );

  288.         /* ComputeKeyRateDuration (
  289.             "IK1",
  290.             aiFuturesComponentTreasuryEffectiveDate,
  291.             aiFuturesComponentTreasuryMaturityDate,
  292.             adblFuturesComponentTreasuryCoupon,
  293.             adblFuturesComponentConversionFactor,
  294.             iSpotDate,
  295.             aiGovvieCurveTreasuryEffectiveDate,
  296.             aiGovvieCurveTreasuryMaturityDate,
  297.             adblGovvieCurveTreasuryCoupon,
  298.             adblGovvieCurveTreasuryYield,
  299.             strGovvieCurveTreasuryMeasure,
  300.             adblFuturesComponentTreasuryPrice,
  301.             false,
  302.             false
  303.         ); */

  304.         ComputeKeyRateDuration (
  305.             "JB1",
  306.             aiFuturesComponentTreasuryEffectiveDate,
  307.             aiFuturesComponentTreasuryMaturityDate,
  308.             adblFuturesComponentTreasuryCoupon,
  309.             adblFuturesComponentConversionFactor,
  310.             iSpotDate,
  311.             aiGovvieCurveTreasuryEffectiveDate,
  312.             aiGovvieCurveTreasuryMaturityDate,
  313.             adblGovvieCurveTreasuryCoupon,
  314.             adblGovvieCurveTreasuryYield,
  315.             strGovvieCurveTreasuryMeasure,
  316.             adblFuturesComponentTreasuryPrice,
  317.             false,
  318.             false
  319.         );

  320.         /* ComputeKeyRateDuration (
  321.             "OAT1",
  322.             aiFuturesComponentTreasuryEffectiveDate,
  323.             aiFuturesComponentTreasuryMaturityDate,
  324.             adblFuturesComponentTreasuryCoupon,
  325.             adblFuturesComponentConversionFactor,
  326.             iSpotDate,
  327.             aiGovvieCurveTreasuryEffectiveDate,
  328.             aiGovvieCurveTreasuryMaturityDate,
  329.             adblGovvieCurveTreasuryCoupon,
  330.             adblGovvieCurveTreasuryYield,
  331.             strGovvieCurveTreasuryMeasure,
  332.             adblFuturesComponentTreasuryPrice,
  333.             false,
  334.             false
  335.         ); */

  336.         ComputeKeyRateDuration (
  337.             "OE1",
  338.             aiFuturesComponentTreasuryEffectiveDate,
  339.             aiFuturesComponentTreasuryMaturityDate,
  340.             adblFuturesComponentTreasuryCoupon,
  341.             adblFuturesComponentConversionFactor,
  342.             iSpotDate,
  343.             aiGovvieCurveTreasuryEffectiveDate,
  344.             aiGovvieCurveTreasuryMaturityDate,
  345.             adblGovvieCurveTreasuryCoupon,
  346.             adblGovvieCurveTreasuryYield,
  347.             strGovvieCurveTreasuryMeasure,
  348.             adblFuturesComponentTreasuryPrice,
  349.             false,
  350.             false
  351.         );

  352.         ComputeKeyRateDuration (
  353.             "RX1",
  354.             aiFuturesComponentTreasuryEffectiveDate,
  355.             aiFuturesComponentTreasuryMaturityDate,
  356.             adblFuturesComponentTreasuryCoupon,
  357.             adblFuturesComponentConversionFactor,
  358.             iSpotDate,
  359.             aiGovvieCurveTreasuryEffectiveDate,
  360.             aiGovvieCurveTreasuryMaturityDate,
  361.             adblGovvieCurveTreasuryCoupon,
  362.             adblGovvieCurveTreasuryYield,
  363.             strGovvieCurveTreasuryMeasure,
  364.             adblFuturesComponentTreasuryPrice,
  365.             false,
  366.             false
  367.         );

  368.         ComputeKeyRateDuration (
  369.             "TU1",
  370.             aiFuturesComponentTreasuryEffectiveDate,
  371.             aiFuturesComponentTreasuryMaturityDate,
  372.             adblFuturesComponentTreasuryCoupon,
  373.             adblFuturesComponentConversionFactor,
  374.             iSpotDate,
  375.             aiGovvieCurveTreasuryEffectiveDate,
  376.             aiGovvieCurveTreasuryMaturityDate,
  377.             adblGovvieCurveTreasuryCoupon,
  378.             adblGovvieCurveTreasuryYield,
  379.             strGovvieCurveTreasuryMeasure,
  380.             adblFuturesComponentTreasuryPrice,
  381.             false,
  382.             false
  383.         );

  384.         ComputeKeyRateDuration (
  385.             "TY1",
  386.             aiFuturesComponentTreasuryEffectiveDate,
  387.             aiFuturesComponentTreasuryMaturityDate,
  388.             adblFuturesComponentTreasuryCoupon,
  389.             adblFuturesComponentConversionFactor,
  390.             iSpotDate,
  391.             aiGovvieCurveTreasuryEffectiveDate,
  392.             aiGovvieCurveTreasuryMaturityDate,
  393.             adblGovvieCurveTreasuryCoupon,
  394.             adblGovvieCurveTreasuryYield,
  395.             strGovvieCurveTreasuryMeasure,
  396.             adblFuturesComponentTreasuryPrice,
  397.             false,
  398.             false
  399.         );

  400.         ComputeKeyRateDuration (
  401.             "UB1",
  402.             aiFuturesComponentTreasuryEffectiveDate,
  403.             aiFuturesComponentTreasuryMaturityDate,
  404.             adblFuturesComponentTreasuryCoupon,
  405.             adblFuturesComponentConversionFactor,
  406.             iSpotDate,
  407.             aiGovvieCurveTreasuryEffectiveDate,
  408.             aiGovvieCurveTreasuryMaturityDate,
  409.             adblGovvieCurveTreasuryCoupon,
  410.             adblGovvieCurveTreasuryYield,
  411.             strGovvieCurveTreasuryMeasure,
  412.             adblFuturesComponentTreasuryPrice,
  413.             false,
  414.             false
  415.         );

  416.         ComputeKeyRateDuration (
  417.             "ULTRA",
  418.             aiFuturesComponentTreasuryEffectiveDate,
  419.             aiFuturesComponentTreasuryMaturityDate,
  420.             adblFuturesComponentTreasuryCoupon,
  421.             adblFuturesComponentConversionFactor,
  422.             iSpotDate,
  423.             aiGovvieCurveTreasuryEffectiveDate,
  424.             aiGovvieCurveTreasuryMaturityDate,
  425.             adblGovvieCurveTreasuryCoupon,
  426.             adblGovvieCurveTreasuryYield,
  427.             strGovvieCurveTreasuryMeasure,
  428.             adblFuturesComponentTreasuryPrice,
  429.             false,
  430.             false
  431.         );

  432.         ComputeKeyRateDuration (
  433.             "US1",
  434.             aiFuturesComponentTreasuryEffectiveDate,
  435.             aiFuturesComponentTreasuryMaturityDate,
  436.             adblFuturesComponentTreasuryCoupon,
  437.             adblFuturesComponentConversionFactor,
  438.             iSpotDate,
  439.             aiGovvieCurveTreasuryEffectiveDate,
  440.             aiGovvieCurveTreasuryMaturityDate,
  441.             adblGovvieCurveTreasuryCoupon,
  442.             adblGovvieCurveTreasuryYield,
  443.             strGovvieCurveTreasuryMeasure,
  444.             adblFuturesComponentTreasuryPrice,
  445.             false,
  446.             false
  447.         );

  448.         ComputeKeyRateDuration (
  449.             "YM1",
  450.             aiFuturesComponentTreasuryEffectiveDate,
  451.             aiFuturesComponentTreasuryMaturityDate,
  452.             adblFuturesComponentTreasuryCoupon,
  453.             adblFuturesComponentConversionFactor,
  454.             iSpotDate,
  455.             aiGovvieCurveTreasuryEffectiveDate,
  456.             aiGovvieCurveTreasuryMaturityDate,
  457.             adblGovvieCurveTreasuryCoupon,
  458.             adblGovvieCurveTreasuryYield,
  459.             strGovvieCurveTreasuryMeasure,
  460.             adblFuturesComponentTreasuryPrice,
  461.             false,
  462.             true
  463.         );
  464.     }
  465. }