NonlinearCurveMeasures.java
- package org.drip.sample.funding;
- /*
- * Credit Product imports
- */
- import org.drip.analytics.date.JulianDate;
- import org.drip.analytics.support.*;
- import org.drip.market.otc.*;
- import org.drip.numerical.common.FormatUtil;
- import org.drip.numerical.differentiation.WengertJacobian;
- import org.drip.param.period.*;
- import org.drip.param.valuation.*;
- import org.drip.product.creator.*;
- import org.drip.product.definition.*;
- import org.drip.product.rates.*;
- import org.drip.param.creator.*;
- import org.drip.service.env.EnvManager;
- import org.drip.state.creator.ScenarioDiscountCurveBuilder;
- import org.drip.state.discount.MergedDiscountForwardCurve;
- import org.drip.state.identifier.ForwardLabel;
- /*
- * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- */
- /*!
- * Copyright (C) 2019 Lakshmi Krishnamurthy
- * Copyright (C) 2018 Lakshmi Krishnamurthy
- * Copyright (C) 2017 Lakshmi Krishnamurthy
- * Copyright (C) 2016 Lakshmi Krishnamurthy
- * Copyright (C) 2015 Lakshmi Krishnamurthy
- * Copyright (C) 2014 Lakshmi Krishnamurthy
- * Copyright (C) 2013 Lakshmi Krishnamurthy
- * Copyright (C) 2012 Lakshmi Krishnamurthy
- *
- * This file is part of DROP, an open-source library targeting risk, transaction costs, exposure, margin
- * calculations, valuation adjustment, and portfolio construction within and across fixed income,
- * credit, commodity, equity, FX, and structured products.
- *
- * https://lakshmidrip.github.io/DROP/
- *
- * DROP is composed of three modules:
- *
- * - DROP Analytics Core - https://lakshmidrip.github.io/DROP-Analytics-Core/
- * - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
- * - DROP Numerical Core - https://lakshmidrip.github.io/DROP-Numerical-Core/
- *
- * DROP Analytics Core implements libraries for the following:
- * - Fixed Income Analytics
- * - Asset Backed Analytics
- * - XVA Analytics
- * - Exposure and Margin Analytics
- *
- * DROP Portfolio Core implements libraries for the following:
- * - Asset Allocation Analytics
- * - Transaction Cost Analytics
- *
- * DROP Numerical Core implements libraries for the following:
- * - Statistical Learning
- * - Numerical Optimizer
- * - Spline Builder
- * - Algorithm Support
- *
- * Documentation for DROP is Spread Over:
- *
- * - Main => https://lakshmidrip.github.io/DROP/
- * - Wiki => https://github.com/lakshmiDRIP/DROP/wiki
- * - GitHub => https://github.com/lakshmiDRIP/DROP
- * - Repo Layout Taxonomy => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
- * - Javadoc => https://lakshmidrip.github.io/DROP/Javadoc/index.html
- * - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
- * - Release Versions => https://lakshmidrip.github.io/DROP/version.html
- * - Community Credits => https://lakshmidrip.github.io/DROP/credits.html
- * - Issues Catalog => https://github.com/lakshmiDRIP/DROP/issues
- * - JUnit => https://lakshmidrip.github.io/DROP/junit/index.html
- * - Jacoco => https://lakshmidrip.github.io/DROP/jacoco/index.html
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- *
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /**
- * <i>NonlinearCurveMeasures</i> contains a demo of the Non-linear Rates Analytics API Usage. It shows the
- * following:
- *
- * <br><br>
- * <ul>
- * <li>
- * Build a discount curve using: cash instruments only, EDF instruments only, IRS instruments only,
- * or all of them strung together.
- * </li>
- * <li>
- * Re-calculate the component input measure quotes from the calibrated discount curve object.
- * </li>
- * <li>
- * Compute the PVDF Wengert Jacobian across all the instruments used in the curve construction.
- * </li>
- * </ul>
- *
- * <br><br>
- * <ul>
- * <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/AnalyticsCore.md">Analytics Core Module</a></li>
- * <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics Library</a></li>
- * <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/README.md">Sample</a></li>
- * <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/funding/README.md">Funding Curve Builder</a></li>
- * </ul>
- * <br><br>
- *
- * @author Lakshmi Krishnamurthy
- */
- public class NonlinearCurveMeasures {
- private static final FixFloatComponent OTCIRS (
- final JulianDate dtSpot,
- final String strCurrency,
- final String strMaturityTenor,
- final double dblCoupon)
- {
- FixedFloatSwapConvention ffConv = IBORFixedFloatContainer.ConventionFromJurisdiction (
- strCurrency,
- "ALL",
- strMaturityTenor,
- "MAIN"
- );
- return ffConv.createFixFloatComponent (
- dtSpot,
- strMaturityTenor,
- dblCoupon,
- 0.,
- 1.
- );
- }
- /*
- * Sample API demonstrating the creation of the discount curve from the rates input instruments
- *
- * USE WITH CARE: This sample ignores errors and does not handle exceptions.
- */
- public static void DiscountCurveFromRatesInstruments()
- throws Exception
- {
- int NUM_DC_INSTR = 30;
- double adblRate[] = new double[NUM_DC_INSTR];
- int aiMaturityDate[] = new int[NUM_DC_INSTR];
- String astrCalibMeasure[] = new String[NUM_DC_INSTR];
- double adblCompCalibValue[] = new double[NUM_DC_INSTR];
- CalibratableComponent aCompCalib[] = new CalibratableComponent[NUM_DC_INSTR];
- JulianDate dtStart = org.drip.analytics.date.DateUtil.CreateFromYMD (
- 2011,
- 4,
- 6
- );
- // First 7 instruments - cash calibration
- JulianDate dtCashEffective = dtStart.addBusDays (1, "USD");
- aiMaturityDate[0] = dtCashEffective.addBusDays (1, "USD").julian(); // ON
- aiMaturityDate[1] = dtCashEffective.addBusDays (2, "USD").julian(); // 1D (TN)
- aiMaturityDate[2] = dtCashEffective.addBusDays (7, "USD").julian(); // 1W
- aiMaturityDate[3] = dtCashEffective.addBusDays (14, "USD").julian(); // 2W
- aiMaturityDate[4] = dtCashEffective.addBusDays (30, "USD").julian(); // 1M
- aiMaturityDate[5] = dtCashEffective.addBusDays (60, "USD").julian(); // 2M
- aiMaturityDate[6] = dtCashEffective.addBusDays (90, "USD").julian(); // 3M
- /*
- * Cash Rate Quotes
- */
- adblCompCalibValue[0] = .0013;
- adblCompCalibValue[1] = .0017;
- adblCompCalibValue[2] = .0017;
- adblCompCalibValue[3] = .0018;
- adblCompCalibValue[4] = .0020;
- adblCompCalibValue[5] = .0023;
- adblCompCalibValue[6] = .0026;
- ComposableFloatingUnitSetting cfus = new ComposableFloatingUnitSetting (
- "3M",
- CompositePeriodBuilder.EDGE_DATE_SEQUENCE_SINGLE,
- null,
- ForwardLabel.Create (
- "USD",
- "3M"
- ),
- CompositePeriodBuilder.REFERENCE_PERIOD_IN_ADVANCE,
- 0.
- );
- CompositePeriodSetting cps = new CompositePeriodSetting (
- 4,
- "3M",
- "USD",
- null,
- 1.,
- null,
- null,
- null,
- null
- );
- CashSettleParams csp = new CashSettleParams (
- 0,
- "USD",
- 0
- );
- for (int i = 0; i < 7; ++i) {
- adblRate[i] = 0.01;
- astrCalibMeasure[i] = "Rate";
- aCompCalib[i] = SingleStreamComponentBuilder.Deposit (
- dtCashEffective, // Effective
- new JulianDate (aiMaturityDate[i]).addBusDays (
- 2,
- "USD"
- ), // Maturity
- ForwardLabel.Create (
- "USD",
- "3M"
- )
- );
- aCompCalib[i] = new SingleStreamComponent (
- "DEPOSIT_" + aiMaturityDate[i],
- new Stream (
- CompositePeriodBuilder.FloatingCompositeUnit (
- CompositePeriodBuilder.EdgePair (
- dtStart,
- new JulianDate (aiMaturityDate[i]).addBusDays (
- 2,
- "USD"
- )
- ),
- cps,
- cfus
- )
- ),
- csp
- );
- aCompCalib[i].setPrimaryCode (aCompCalib[i].name());
- }
- // Next 8 instruments - EDF calibration
- adblCompCalibValue[7] = .0027;
- adblCompCalibValue[8] = .0032;
- adblCompCalibValue[9] = .0041;
- adblCompCalibValue[10] = .0054;
- adblCompCalibValue[11] = .0077;
- adblCompCalibValue[12] = .0104;
- adblCompCalibValue[13] = .0134;
- adblCompCalibValue[14] = .0160;
- CalibratableComponent[] aEDF = SingleStreamComponentBuilder.ForwardRateFuturesPack (
- dtStart,
- 8,
- "USD"
- );
- for (int i = 0; i < 8; ++i) {
- adblRate[i + 7] = 0.01;
- aCompCalib[i + 7] = aEDF[i];
- astrCalibMeasure[i + 7] = "Rate";
- aiMaturityDate[i + 7] = aEDF[i].maturityDate().julian();
- }
- // Final 15 instruments - IRS calibration
- JulianDate dtIRSEffective = dtStart.addBusDays (
- 2,
- "USD"
- );
- String[] astrIRSTenor = new String[] {
- "4Y",
- "5Y",
- "6Y",
- "7Y",
- "8Y",
- "9Y",
- "10Y",
- "11Y",
- "12Y",
- "15Y",
- "20Y",
- "25Y",
- "30Y",
- "40Y",
- "50Y",
- };
- aiMaturityDate[15] = dtIRSEffective.addTenor (astrIRSTenor[0]).julian();
- aiMaturityDate[16] = dtIRSEffective.addTenor (astrIRSTenor[1]).julian();
- aiMaturityDate[17] = dtIRSEffective.addTenor (astrIRSTenor[2]).julian();
- aiMaturityDate[18] = dtIRSEffective.addTenor (astrIRSTenor[3]).julian();
- aiMaturityDate[19] = dtIRSEffective.addTenor (astrIRSTenor[4]).julian();
- aiMaturityDate[20] = dtIRSEffective.addTenor (astrIRSTenor[5]).julian();
- aiMaturityDate[21] = dtIRSEffective.addTenor (astrIRSTenor[6]).julian();
- aiMaturityDate[22] = dtIRSEffective.addTenor (astrIRSTenor[7]).julian();
- aiMaturityDate[23] = dtIRSEffective.addTenor (astrIRSTenor[8]).julian();
- aiMaturityDate[24] = dtIRSEffective.addTenor (astrIRSTenor[9]).julian();
- aiMaturityDate[25] = dtIRSEffective.addTenor (astrIRSTenor[10]).julian();
- aiMaturityDate[26] = dtIRSEffective.addTenor (astrIRSTenor[11]).julian();
- aiMaturityDate[27] = dtIRSEffective.addTenor (astrIRSTenor[12]).julian();
- aiMaturityDate[28] = dtIRSEffective.addTenor (astrIRSTenor[13]).julian();
- aiMaturityDate[29] = dtIRSEffective.addTenor (astrIRSTenor[14]).julian();
- adblCompCalibValue[15] = .0166;
- adblCompCalibValue[16] = .0206;
- adblCompCalibValue[17] = .0241;
- adblCompCalibValue[18] = .0269;
- adblCompCalibValue[19] = .0292;
- adblCompCalibValue[20] = .0311;
- adblCompCalibValue[21] = .0326;
- adblCompCalibValue[22] = .0340;
- adblCompCalibValue[23] = .0351;
- adblCompCalibValue[24] = .0375;
- adblCompCalibValue[25] = .0393;
- adblCompCalibValue[26] = .0402;
- adblCompCalibValue[27] = .0407;
- adblCompCalibValue[28] = .0409;
- adblCompCalibValue[29] = .0409;
- for (int i = 0; i < 15; ++i) {
- astrCalibMeasure[i + 15] = "Rate";
- adblRate[i + 15] = 0.01;
- aCompCalib[i + 15] = OTCIRS (
- dtIRSEffective,
- "USD",
- astrIRSTenor[i],
- 0.
- );
- }
- /*
- * Build the IR curve from the components, their calibration measures, and their calibration quotes.
- */
- MergedDiscountForwardCurve dc = ScenarioDiscountCurveBuilder.NonlinearBuild (
- dtStart,
- "USD",
- aCompCalib,
- adblCompCalibValue,
- astrCalibMeasure,
- null
- );
- /*
- * Re-calculate the component input measure quotes from the calibrated discount curve object
- */
- for (int i = 0; i < aCompCalib.length; ++i)
- System.out.println (astrCalibMeasure[i] + "[" + i + "] = " +
- FormatUtil.FormatDouble (aCompCalib[i].measureValue (new ValuationParams (dtStart, dtStart, "USD"), null,
- MarketParamsBuilder.Create (dc, null, null, null, null, null, null),
- null, astrCalibMeasure[i]), 1, 5, 1.) + " | " + FormatUtil.FormatDouble (adblCompCalibValue[i], 1, 5, 1.));
- for (int i = 0; i < aCompCalib.length; ++i) {
- WengertJacobian wjComp = aCompCalib[i].jackDDirtyPVDManifestMeasure (
- new ValuationParams (
- dtStart,
- dtStart,
- "USD"
- ),
- null,
- MarketParamsBuilder.Create (
- dc,
- null,
- null,
- null,
- null,
- null,
- null
- ),
- null
- );
- System.out.println ("PV/DF Micro Jack[" + aCompCalib[i].name() + "]=" +
- (null == wjComp ? null : wjComp.displayString()));
- }
- }
- public static final void main (
- final String astrArgs[])
- throws Exception
- {
- String strConfig = "";
- EnvManager.InitEnv (strConfig);
- long lStart = System.nanoTime();
- DiscountCurveFromRatesInstruments();
- System.out.println ("Time Taken: " + ((int)(1.e-09 * (System.nanoTime() - lStart))) + " sec");
- EnvManager.TerminateEnv();
- }
- }