/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.impl.credit.isda; import static org.testng.AssertJUnit.assertEquals; import java.time.LocalDate; import java.time.Month; import java.time.Period; import org.testng.annotations.Test; import com.opengamma.strata.collect.ArgChecker; import com.opengamma.strata.pricer.impl.credit.isda.IsdaCompliantCreditCurveBuilder.ArbitrageHandling; /** * Test. */ @Test public class ExtendedCreditCurveCalibrationTest extends com.opengamma.strata.pricer.impl.credit.isda.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); @Test public void test() { testCalibrationAgainstISDA(BUILDER_ISDA, 1e-14); //TODO adjust the logic to match the incorrect Markit `fix' } @SuppressWarnings("unused") @Test public void speedTest() { final LocalDate tradeDate = LocalDate.of(2013, Month.SEPTEMBER, 5); final LocalDate spotDate = DEFAULT_CALENDAR.shift(tradeDate.minusDays(1), 1); 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 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}; ArgChecker.isTrue(n == spreads.length, "spreads wrong length"); 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++) { 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 IsdaCompliantCreditCurve cc1a = calibrator1.calibrate(spreads); } long t1 = System.nanoTime(); t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { final IsdaCompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } t1 = System.nanoTime(); } } @SuppressWarnings("unused") @Test public void test2() { final LocalDate tradeDate = LocalDate.of(2013, Month.SEPTEMBER, 5); final LocalDate spotDate = DEFAULT_CALENDAR.shift(tradeDate.minusDays(1), 1); 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 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}; ArgChecker.isTrue(n == spreads.length, "spreads wrong length"); 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++) { 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(); t0 = System.nanoTime(); for (int i = 0; i < hotspots; i++) { final IsdaCompliantCreditCurve cc2a = calibrator2.calibrateCreditCurve(cds, spreads, yieldCurve); } t1 = System.nanoTime(); } } }