Korba.java

package org.drip.sample.securitysuite;

import org.drip.analytics.cashflow.CompositePeriod;
import org.drip.analytics.date.*;
import org.drip.numerical.common.FormatUtil;
import org.drip.numerical.linearalgebra.Matrix;
import org.drip.product.creator.BondBuilder;
import org.drip.product.credit.BondComponent;
import org.drip.service.env.EnvManager;
import org.drip.service.scenario.*;

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

/*!
 * Copyright (C) 2018 Lakshmi Krishnamurthy
 * Copyright (C) 2017 Lakshmi Krishnamurthy
 * 
 *  This file is part of DRIP, a free-software/open-source library for buy/side financial/trading model
 *  	libraries targeting analysts and developers
 *  	https://lakshmidrip.github.io/DRIP/
 *  
 *  DRIP is composed of four main libraries:
 *  
 *  - DRIP Fixed Income - https://lakshmidrip.github.io/DRIP-Fixed-Income/
 *  - DRIP Asset Allocation - https://lakshmidrip.github.io/DRIP-Asset-Allocation/
 *  - DRIP Numerical Optimizer - https://lakshmidrip.github.io/DRIP-Numerical-Optimizer/
 *  - DRIP Statistical Learning - https://lakshmidrip.github.io/DRIP-Statistical-Learning/
 * 
 *  - DRIP Fixed Income: Library for Instrument/Trading Conventions, Treasury Futures/Options,
 *  	Funding/Forward/Overnight Curves, Multi-Curve Construction/Valuation, Collateral Valuation and XVA
 *  	Metric Generation, Calibration and Hedge Attributions, Statistical Curve Construction, Bond RV
 *  	Metrics, Stochastic Evolution and Option Pricing, Interest Rate Dynamics and Option Pricing, LMM
 *  	Extensions/Calibrations/Greeks, Algorithmic Differentiation, and Asset Backed Models and Analytics.
 * 
 *  - DRIP Asset Allocation: Library for model libraries for MPT framework, Black Litterman Strategy
 *  	Incorporator, Holdings Constraint, and Transaction Costs.
 * 
 *  - DRIP Numerical Optimizer: Library for Numerical Optimization and Spline Functionality.
 * 
 *  - DRIP Statistical Learning: Library for Statistical Evaluation and Machine Learning.
 * 
 *  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.
 */

/**
 * Korba generates the Full Suite of Replication Metrics for Bond Korba.
 * 
 * @author Lakshmi Krishnamurthy
 */

public class Korba {

	public static final void main (
		final String[] astArgs)
		throws Exception
	{
		EnvManager.InitEnv ("");

		JulianDate dtSpot = DateUtil.CreateFromYMD (
			2017,
			DateUtil.OCTOBER,
			5
		);

		String[] astrDepositTenor = new String[] {
			"2D"
		};

		double[] adblDepositQuote = new double[] {
			0.0130411 // 2D
		};

		double[] adblFuturesQuote = new double[] {
			0.01345,	// 98.655
			0.01470,	// 98.530
			0.01575,	// 98.425
			0.01660,	// 98.340
			0.01745,    // 98.255
			0.01845     // 98.155
		};

		String[] astrFixFloatTenor = new String[] {
			"02Y",
			"03Y",
			"04Y",
			"05Y",
			"06Y",
			"07Y",
			"08Y",
			"09Y",
			"10Y",
			"11Y",
			"12Y",
			"15Y",
			"20Y",
			"25Y",
			"30Y",
			"40Y",
			"50Y"
		};

		String[] astrGovvieTenor = new String[] {
			"1Y",
			"2Y",
			"3Y",
			"5Y",
			"7Y",
			"10Y",
			"20Y",
			"30Y"
		};

		double[] adblFixFloatQuote = new double[] {
			0.016410, //  2Y
			0.017863, //  3Y
			0.019030, //  4Y
			0.020035, //  5Y
			0.020902, //  6Y
			0.021660, //  7Y
			0.022307, //  8Y
			0.022879, //  9Y
			0.023363, // 10Y
			0.023820, // 11Y
			0.024172, // 12Y
			0.024934, // 15Y
			0.025581, // 20Y
			0.025906, // 25Y
			0.025973, // 30Y
			0.025838, // 40Y
			0.025560  // 50Y
		};

		double[] adblGovvieYield = new double[] {
			0.01219, //  1Y
			0.01391, //  2Y
			0.01590, //  3Y
			0.01937, //  5Y
			0.02200, //  7Y
			0.02378, // 10Y
			0.02677, // 20Y
			0.02927  // 30Y
		};

		String[] astrCreditTenor = new String[] {
			"06M",
			"01Y",
			"02Y",
			"03Y",
			"04Y",
			"05Y",
			"07Y",
			"10Y"
		};

		double[] adblCreditQuote = new double[] {
			 60.,	//  6M
			 68.,	//  1Y
			 88.,	//  2Y
			102.,	//  3Y
			121.,	//  4Y
			138.,	//  5Y
			168.,	//  7Y
			188.	// 10Y
		};

		double dblFX = 1.;
		int iSettleLag = 3;
		int iCouponFreq = 12;
		String strName = "Korba";
		double dblCleanPrice = 0.95;
		double dblIssuePrice = 1.;
		String strCurrency = "USD";
		double dblSpreadBump = 20.;
		double dblCouponRate = 0.03; 
		String strTreasuryCode = "UST";
		String strCouponDayCount = "30/360";
		double dblSpreadDurationMultiplier = 5.;

		org.drip.analytics.date.JulianDate[] adtPeriodEnd = new org.drip.analytics.date.JulianDate[] {
			DateUtil.CreateFromYMD (2017, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2017, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2017, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2018, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2018, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2019, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2019, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2020, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2020, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2021, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2021, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2022, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2022, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2023, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2023, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2024, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2024, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2025, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2025, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2026, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2026, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2027, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2027, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2028, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2028, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2029, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2029, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2030, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2030, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2031, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2031, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2032, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2032, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2033, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2033, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2034, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2034, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2035, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2035, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2036, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2036, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2037, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2037, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2038, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2038, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2039, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2039, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2040, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2040, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2041, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2041, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2042, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2042, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2043, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2043, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2044, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2044, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.MARCH    , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.APRIL    , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.MAY      , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.JUNE     , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.JULY     , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.AUGUST   , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.SEPTEMBER, 25),
			DateUtil.CreateFromYMD (2045, DateUtil.OCTOBER  , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.NOVEMBER , 25),
			DateUtil.CreateFromYMD (2045, DateUtil.DECEMBER , 25),
			DateUtil.CreateFromYMD (2046, DateUtil.JANUARY  , 25),
			DateUtil.CreateFromYMD (2046, DateUtil.FEBRUARY , 25),
			DateUtil.CreateFromYMD (2046, DateUtil.MARCH    , 25),
		};

		double[] adblPrincipalPayDown = new double[] {
			1042394.66,
			1022818.86,
			1004129.80,
			974934.20,
			957106.77,
			939707.76,
			922657.37,
			905884.73,
			889512.35,
			873677.83,
			864616.71,
			852795.67,
			837416.16,
			822345.44,
			807557.01,
			799363.65,
			784999.88,
			774438.91,
			760500.39,
			752641.94,
			742504.50,
			735131.64,
			721791.58,
			712205.44,
			704773.66,
			691885.60,
			684742.14,
			675528.64,
			668439.66,
			656462.04,
			652990.02,
			641304.10,
			634968.44,
			626832.46,
			620742.65,
			609695.73,
			607009.38,
			603903.35,
			596371.82,
			590476.70,
			584804.48,
			577509.36,
			571914.96,
			566346.07,
			559485.28,
			554040.80,
			548540.33,
			541657.01,
			536289.73,
			526630.27,
			521543.31,
			514933.57,
			509907.40,
			500859.44,
			495978.98,
			489841.69,
			485067.24,
			476454.32,
			471946.62,
			466072.58,
			461583.26,
			457226.26,
			452652.44,
			444720.08,
			442818.85,
			438397.53,
			434244.44,
			430065.06,
			422460.79,
			420612.69,
			416624.87,
			412543.43,
			405378.76,
			401446.60,
			397674.86,
			395916.46,
			392024.18,
			385216.45,
			381466.80,
			377887.02,
			374205.01,
			370631.36,
			366112.63,
			362673.96,
			359240.29,
			355743.84,
			352271.29,
			349018.01,
			343041.74,
			339733.29,
			336374.82,
			334939.82,
			331774.08,
			326190.16,
			323032.82,
			319911.89,
			316975.61,
			313909.57,
			308609.51,
			305713.96,
			304456.23,
			301443.00,
			298508.57,
			295551.65,
			290682.72,
			287833.49,
			285004.82,
			282264.53,
			279579.72,
			274938.37,
			272263.40,
			269673.48,
			268358.55,
			265809.43,
			263245.44,
			258858.82,
			256390.42,
			253980.67,
			251557.77,
			249111.72,
			246734.26,
			242754.14,
			240465.03,
			238152.45,
			235856.77,
			234804.12,
			232515.16,
			228776.49,
			226572.49,
			224514.41,
			222351.38,
			220261.58,
			218139.74,
			214724.59,
			212682.98,
			210713.08,
			208759.18,
			206853.37,
			204868.46,
			201531.66,
			199648.70,
			198731.52,
			196886.73,
			195019.08,
			193209.88,
			191438.82,
			188474.69,
			186712.44,
			185007.04,
			183379.35,
			181663.35,
			179977.88,
			178296.02,
			175694.27,
			174077.00,
			172521.03,
			170944.71,
			169432.01,
			167919.65,
			166384.87,
			164027.33,
			163210.74,
			161724.10,
			160296.41,
			158890.55,
			157461.36,
			156076.90,
			153846.28,
			152567.54,
			151188.13,
			149893.10,
			148615.29,
			147311.47,
			146032.75,
			144033.04,
			142843.78,
			141635.64,
			140439.62,
			139295.40,
			138168.91,
			136987.58,
			135895.20,
			134192.98,
			133090.15,
			132495.67,
			131478.32,
			130410.42,
			129434.94,
			128479.55,
			127482.61,
			126054.79,
			125216.37,
			124375.18,
			122850.27,
			121741.16,
			120855.76,
			120109.93,
			119397.88,
			118653.33,
			118020.88,
			117433.26,
			116833.62,
			116369.87,
			115991.65,
			115665.77,
			115486.44,
			113205.69,
			112388.04,
			112004.47,
			112201.48,
			112127.90,
			111539.05,
			113317.94,
			384849.62,
			288750.90,
			375798.57,
			320704.31,
			13849.71,
			13727.36,
			13606.05,
			13485.77,
			13366.52,
			13248.30,
			13131.08,
			13014.86,
			12899.64,
			12785.41,
			12672.16,
			12559.88,
			12448.56,
			12338.21,
			12228.80,
			12120.34,
			12012.81,
			11906.21,
			11800.54,
			11695.78,
			11591.93,
			11488.98,
			11386.92,
			11285.76,
			11185.48,
			11086.07,
			10987.53,
			10889.86,
			10793.04,
			10697.07,
			10601.95,
			10507.67,
			10414.22,
			10321.60,
			10229.80,
			10138.82,
			10048.65,
			9959.29,
			9870.73,
			9782.97,
			9695.99,
			9609.81,
			9524.40,
			9439.78,
			9355.93,
			9272.85,
			9190.53,
			9108.98,
			9028.19,
			8948.16,
			8868.88,
			8790.35,
			8712.58,
			8635.55,
			8559.27,
			8483.74,
			8408.97,
			8334.94,
			8261.66,
			8189.15,
			8117.40,
			8046.43,
			7976.24,
			7906.86,
			7838.30,
			7770.60,
			7703.79,
			7637.95,
			7573.17,
			7509.58,
			7447.43,
			15430.41,
			7217.42,
			7166.87,
			7064.29,
			6848.45,
			6788.98,
			6730.17,
			6672.01,
			6614.51,
			6557.67,
			6501.51,
			6446.02,
			6391.21,
			6337.10,
			6283.69,
			6230.99,
			6179.02,
			6127.79,
			6077.32,
			6027.64,
			5978.77,
			5930.74,
			5883.58,
			5837.33,
			5792.05,
			5747.80,
			5704.65,
			5662.69,
			5622.02,
			5582.81,
			5545.23,
			5509.53,
			5476.05,
			5445.31,
			5418.10,
			5395.78,
			5381.19,
			5382.69,
			5239.13,
			4921.48,
			4829.27,
			4735.30,
			4758.91,
			4467.33,
			4054.87,
			4039.73,
			3869.92,
			3753.53,
			13947.59,
			108760.73,
			0.00,
			0.00,
			0.00,
			18935930.73,
		};

		double[] adblCouponAmount = new double[] {
			214911.15,
			209801.35,
			208645.97,
			203949.72,
			198769.55,
			197754.66,
			192680.89,
			189056.23,
			184844.05,
			181872.94,
			176537.96,
			175565.07,
			171591.89,
			167172.78,
			165151.15,
			162047.63,
			158385.85,
			157056.72,
			152268.92,
			148763.77,
			149060.46,
			145612.12,
			139315.98,
			138099.47,
			135867.81,
			133187.13,
			131133.35,
			128714.53,
			127954.47,
			125933.77,
			123021.72,
			122133.79,
			119857.23,
			117716.89,
			116814.32,
			114413.23,
			112804.70,
			111352.48,
			109700.47,
			108911.53,
			106641.22,
			105758.51,
			103690.11,
			102402.43,
			100781.19,
			99373.12,
			98011.07,
			96666.90,
			95525.76,
			93935.33,
			92648.76,
			91350.19,
			90124.21,
			88857.19,
			87640.50,
			86412.38,
			85225.30,
			84054.91,
			82904.02,
			81742.19,
			80671.03,
			79536.51,
			78438.89,
			77331.19,
			76293.11,
			75212.00,
			74166.08,
			73156.98,
			72134.91,
			71111.01,
			70113.89,
			69107.90,
			68200.89,
			67224.69,
			66280.08,
			65327.04,
			64398.85,
			63502.14,
			62601.87,
			61693.82,
			60814.96,
			59965.50,
			59106.93,
			58241.71,
			57459.96,
			56614.50,
			55796.16,
			55004.46,
			54205.11,
			53404.76,
			52630.00,
			51880.13,
			51118.61,
			50381.25,
			49642.59,
			48898.09,
			48205.92,
			47478.83,
			46774.80,
			46097.30,
			45414.32,
			44721.83,
			44077.12,
			43401.05,
			42771.33,
			42115.56,
			41480.46,
			40864.45,
			40244.31,
			39642.59,
			39041.01,
			38457.17,
			37855.18,
			37260.28,
			36704.95,
			36124.23,
			35585.47,
			35022.14,
			34495.84,
			33945.86,
			33431.80,
			32894.94,
			32396.10,
			31875.20,
			31370.34,
			30867.35,
			30371.77,
			29889.85,
			29409.08,
			28941.41,
			28472.03,
			28015.31,
			27557.09,
			27100.33,
			26655.89,
			26223.22,
			25803.39,
			25366.63,
			24956.51,
			24530.22,
			24122.62,
			23709.23,
			23318.54,
			22912.85,
			22531.29,
			22135.35,
			21753.88,
			21369.77,
			21008.13,
			20644.17,
			20279.85,
			19916.26,
			19560.78,
			19213.88,
			18868.70,
			18531.73,
			18196.74,
			17858.17,
			17538.39,
			17207.85,
			16895.45,
			16576.14,
			16262.48,
			15955.98,
			15649.79,
			15344.07,
			15053.01,
			14753.00,
			14470.07,
			14172.60,
			13896.26,
			13618.69,
			13341.67,
			13065.02,
			12794.59,
			12531.03,
			12269.03,
			12005.29,
			11754.32,
			11502.50,
			11246.58,
			11000.57,
			10760.62,
			10511.15,
			10277.63,
			10042.41,
			9803.74,
			9573.79,
			9349.22,
			9115.61,
			8895.89,
			8676.39,
			8453.94,
			8238.91,
			8029.57,
			7813.00,
			7608.49,
			7403.70,
			7196.49,
			6995.67,
			6798.91,
			6595.69,
			6402.70,
			6209.62,
			6014.35,
			5824.16,
			5634.41,
			5445.40,
			5262.51,
			5076.74,
			4895.50,
			4708.98,
			4529.63,
			4347.02,
			3658.90,
			3092.03,
			2415.05,
			2128.00,
			2101.10,
			2074.44,
			2048.03,
			2021.87,
			1995.94,
			1970.26,
			1944.81,
			1919.60,
			1894.62,
			1869.88,
			1845.36,
			1821.07,
			1797.01,
			1773.17,
			1749.55,
			1726.15,
			1702.96,
			1680.00,
			1657.24,
			1634.70,
			1612.37,
			1590.24,
			1568.32,
			1546.60,
			1525.09,
			1503.77,
			1482.66,
			1461.74,
			1441.01,
			1420.47,
			1400.13,
			1379.97,
			1360.00,
			1340.22,
			1320.66,
			1301.32,
			1282.15,
			1263.16,
			1244.35,
			1225.71,
			1207.24,
			1188.94,
			1170.88,
			1152.99,
			1135.27,
			1117.72,
			1100.32,
			1083.09,
			1066.02,
			1049.11,
			1032.35,
			1015.75,
			999.31,
			983.01,
			966.87,
			950.87,
			935.03,
			919.32,
			903.76,
			888.35,
			873.08,
			857.95,
			842.96,
			828.10,
			813.38,
			798.78,
			784.31,
			769.98,
			755.83,
			741.83,
			727.97,
			718.25,
			704.58,
			691.02,
			677.59,
			664.49,
			651.52,
			638.68,
			625.96,
			613.34,
			600.86,
			588.51,
			576.26,
			564.11,
			552.06,
			540.14,
			528.35,
			516.65,
			505.03,
			493.63,
			482.33,
			471.13,
			460.01,
			448.98,
			438.03,
			427.17,
			416.38,
			405.68,
			395.04,
			384.47,
			373.97,
			363.53,
			353.15,
			342.82,
			332.52,
			322.28,
			312.07,
			301.50,
			291.57,
			281.91,
			272.74,
			263.63,
			254.66,
			245.65,
			236.98,
			228.83,
			220.65,
			207.80,
			183.35,
			175.62,
			0.00,
			0.00,
			0.00,
			0.00,
		};

		double dblIssueAmount = Matrix.Sum (adblPrincipalPayDown);

		JulianDate dtEffective = DateUtil.CreateFromYMD (
			2017,
			DateUtil.SEPTEMBER,
			25
		);

		BondComponent bond = BondBuilder.CreateBondFromCF (
			strName,
			dtEffective,
			strCurrency,
			strName,
			strCouponDayCount,
			dblIssueAmount,
			dblCouponRate,
			iCouponFreq,
			adtPeriodEnd,
			adblCouponAmount,
			adblPrincipalPayDown,
			true
		);

		BondReplicator abr = BondReplicator.CorporateSenior (
			dblCleanPrice,
			dblIssuePrice,
			dblIssueAmount,
			dtSpot,
			astrDepositTenor,
			adblDepositQuote,
			adblFuturesQuote,
			astrFixFloatTenor,
			adblFixFloatQuote,
			dblSpreadBump,
			dblSpreadDurationMultiplier,
			strTreasuryCode,
			astrGovvieTenor,
			adblGovvieYield,
			astrCreditTenor,
			adblCreditQuote,
			dblFX,
			Double.NaN,
			iSettleLag,
			bond
		);

		BondReplicationRun abrr = abr.generateRun();

		System.out.println (abrr.display());

		double dblBalance = 1.;

		for (CompositePeriod p : bond.couponPeriods()) {
			int iEndDate = p.endDate();

			int iStartDate = p.startDate();

			double dblPrincipalPayDown = bond.notional (iStartDate) - bond.notional (iEndDate);

			double dblInterest = dblCouponRate * p.couponDCF() * bond.notional (iStartDate) * bond.couponFactor (iEndDate);

			dblBalance -= dblPrincipalPayDown;

			System.out.println (
				"\t" + new JulianDate (iEndDate) + " => " +
				FormatUtil.FormatDouble (dblPrincipalPayDown, 8, 2, dblIssueAmount) + " | " +
				FormatUtil.FormatDouble (dblInterest, 6, 2, dblIssueAmount) + " | " +
				FormatUtil.FormatDouble (dblPrincipalPayDown + dblInterest, 8, 2, dblIssueAmount) + " | " +
				FormatUtil.FormatDouble (dblBalance, 8, 2, dblIssueAmount) + " ||"
			);
		}
	}
}