/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.credit.isdastandardmodel.fastcalibration; import static com.opengamma.financial.convention.businessday.BusinessDayDateUtils.addWorkDays; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.Month; import org.threeten.bp.Period; import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalytic; import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalyticFactory; import com.opengamma.analytics.financial.credit.isdastandardmodel.FastCreditCurveBuilder; import com.opengamma.analytics.financial.credit.isdastandardmodel.ISDACompliantCreditCurve; import com.opengamma.analytics.financial.credit.isdastandardmodel.ISDACompliantCreditCurveBuilder.ArbitrageHandling; import com.opengamma.analytics.financial.credit.isdastandardmodel.ISDACompliantYieldCurve; import com.opengamma.analytics.financial.credit.isdastandardmodel.MultiCDSAnalytic; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class CreditCurveCalibrationTest extends com.opengamma.analytics.financial.credit.isdastandardmodel.CreditCurveCalibrationTest { private static final CDSAnalyticFactory CDS_FACTORY = new CDSAnalyticFactory(); private static final Period[] PILLARS = new Period[] {Period.ofMonths(6), Period.ofYears(1), Period.ofYears(2), Period.ofYears(3), Period.ofYears(4), Period.ofYears(5), Period.ofYears(7), Period.ofYears(10) }; private static final SuperFastCreditCurveBuilder BUILDER_ISDA = new SuperFastCreditCurveBuilder(ORIGINAL_ISDA); private static final SuperFastCreditCurveBuilder BUILDER_MARKIT = new SuperFastCreditCurveBuilder(MARKIT_FIX); @Test public void test() { testCalibrationAgainstISDA(BUILDER_ISDA, 1e-14); //TODO adjust the logic to match the incorrect Markit `fix' // testCalibrationAgainstISDA(BUILDER_MARKIT, 1e-14); } @SuppressWarnings("unused") @Test public void speedTest() { final LocalDate tradeDate = LocalDate.of(2013, Month.SEPTEMBER, 5); final LocalDate spotDate = addWorkDays(tradeDate.minusDays(1), 1, DEFAULT_CALENDAR); final String[] yieldCurvePoints = new String[] {"1M", "2M", "3M", "6M", "1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "12Y", "15Y", "20Y", "25Y", "30Y" }; final String[] yieldCurveInstruments = new String[] {"M", "M", "M", "M", "M", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S" }; //final String[] yieldCurveInstruments = new String[] {"M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M" }; final double[] rates = new double[] {0.004919, 0.005006, 0.00515, 0.005906, 0.008813, 0.0088, 0.01195, 0.01534, 0.01836, 0.02096, 0.02322, 0.02514, 0.02673, 0.02802, 0.02997, 0.0318, 0.03331, 0.03383, 0.034 }; final ISDACompliantYieldCurve yieldCurve = makeYieldCurve(tradeDate, spotDate, yieldCurvePoints, yieldCurveInstruments, rates, ACT_ACT_ISDA, ACT_ACT_ISDA, Period.ofMonths(6)); final CDSAnalytic[] cds = CDS_FACTORY.makeIMMCDS(tradeDate, PILLARS); final int n = PILLARS.length; final double[] spreads = new double[] {0.01, 0.012, 0.015, 0.02, 0.023, 0.021, 0.02, 0.019 }; ArgumentChecker.isTrue(n == spreads.length, "spreads wrong length"); // final AnalyticCDSPricer pricer = new AnalyticCDSPricer(MARKIT_FIX); final CreditCurveCalibrator calibrator1 = new CreditCurveCalibrator(cds, yieldCurve); final ISDACompliantCreditCurve cc1 = calibrator1.calibrate(spreads); final FastCreditCurveBuilder calibrator2 = new FastCreditCurveBuilder(); final ISDACompliantCreditCurve cc2 = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); for (int i = 0; i < n; i++) { //System.out.println(cc1.getZeroRateAtIndex(i) + "\t" + cc2.getZeroRateAtIndex(i)); assertEquals(cc2.getZeroRateAtIndex(i), cc1.getZeroRateAtIndex(i), 1e-15); } final MultiCDSAnalytic multiCDS = CDS_FACTORY.makeMultiIMMCDS(tradeDate, PILLARS); final CreditCurveCalibrator calibrator3 = new CreditCurveCalibrator(multiCDS, yieldCurve); final ISDACompliantCreditCurve cc3 = calibrator3.calibrate(spreads); for (int i = 0; i < n; i++) { assertEquals(cc1.getZeroRateAtIndex(i), cc3.getZeroRateAtIndex(i), 1e-15); } final int warmups = 200; final int hotspots = 1000; for (int i = 0; i < warmups; i++) { final ISDACompliantCreditCurve cc1a = calibrator1.calibrate(spreads); final ISDACompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } if (hotspots > 0) { long t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { // final CreditCurveCalibrator calibrator1a = new CreditCurveCalibrator(cds, yieldCurve); final ISDACompliantCreditCurve cc1a = calibrator1.calibrate(spreads); } long t1 = System.nanoTime(); // System.out.println("time of new calibration: " + (t1 - t0) / hotspots / 1e6 + "ms"); t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { final ISDACompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } t1 = System.nanoTime(); // System.out.println("time of old calibration: " + (t1 - t0) / hotspots / 1e6 + "ms"); } } @SuppressWarnings("unused") @Test public void test2() { final LocalDate tradeDate = LocalDate.of(2013, Month.SEPTEMBER, 5); final LocalDate spotDate = addWorkDays(tradeDate.minusDays(1), 1, DEFAULT_CALENDAR); final String[] yieldCurvePoints = new String[] {"1M", "2M", "3M", "6M", "1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "12Y", "15Y", "20Y", "25Y", "30Y" }; final String[] yieldCurveInstruments = new String[] {"M", "M", "M", "M", "M", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S" }; //final String[] yieldCurveInstruments = new String[] {"M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M" }; final double[] rates = new double[] {0.004919, 0.005006, 0.00515, 0.005906, 0.008813, 0.0088, 0.01195, 0.01534, 0.01836, 0.02096, 0.02322, 0.02514, 0.02673, 0.02802, 0.02997, 0.0318, 0.03331, 0.03383, 0.034 }; final ISDACompliantYieldCurve yieldCurve = makeYieldCurve(tradeDate, spotDate, yieldCurvePoints, yieldCurveInstruments, rates, ACT_ACT_ISDA, ACT_ACT_ISDA, Period.ofMonths(6)); final LocalDate[] maturities = new LocalDate[] {LocalDate.of(2013, Month.OCTOBER, 30), LocalDate.of(2014, Month.SEPTEMBER, 20), LocalDate.of(2015, Month.JUNE, 10), LocalDate.of(2016, Month.SEPTEMBER, 5), LocalDate.of(2017, Month.OCTOBER, 1), LocalDate.of(2018, Month.DECEMBER, 30), LocalDate.of(2020, Month.JANUARY, 12), LocalDate.of(2023, Month.OCTOBER, 30) }; final LocalDate effective = LocalDate.of(2013, Month.AUGUST, 1); final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(tradeDate, effective, maturities); final int n = cds.length; final double[] spreads = new double[] {0.01, 0.012, 0.015, 0.02, 0.023, 0.021, 0.02, 0.019 }; ArgumentChecker.isTrue(n == spreads.length, "spreads wrong length"); // final AnalyticCDSPricer pricer = new AnalyticCDSPricer(true); final CreditCurveCalibrator calibrator1 = new CreditCurveCalibrator(cds, yieldCurve, MARKIT_FIX, ArbitrageHandling.Ignore); final ISDACompliantCreditCurve cc1 = calibrator1.calibrate(spreads); final FastCreditCurveBuilder calibrator2 = new FastCreditCurveBuilder(MARKIT_FIX); final ISDACompliantCreditCurve cc2 = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); for (int i = 0; i < n; i++) { // System.out.println(cc1.getZeroRateAtIndex(i) + "\t" + cc2.getZeroRateAtIndex(i)); assertEquals(cc2.getZeroRateAtIndex(i), cc1.getZeroRateAtIndex(i), 1e-13); } final int warmups = 200; final int hotspots = 1000; for (int i = 0; i < warmups; i++) { final ISDACompliantCreditCurve cc1a = calibrator1.calibrate(spreads); final ISDACompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } if (hotspots > 0) { long t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { final ISDACompliantCreditCurve cc1a = calibrator1.calibrate(spreads); } long t1 = System.nanoTime(); // System.out.println("time of new calibration: " + (t1 - t0) / hotspots / 1e6 + "ms"); t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { // final FastCreditCurveBuilder calibrator2a = new FastCreditCurveBuilder(true); final ISDACompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } t1 = System.nanoTime(); // System.out.println("time of old calibration: " + (t1 - t0) / hotspots / 1e6 + "ms"); } } }