/**
* 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.assertTrue;
import java.time.LocalDate;
import java.time.Month;
import org.testng.annotations.Test;
import com.opengamma.strata.pricer.impl.credit.isda.IsdaCompliantCreditCurveBuilder.ArbitrageHandling;
/**
* Test.
*/
@Test
public class CreditBootstrapFailTest extends IsdaBaseTest {
protected static final double NOTIONAL = 1e6;
private static final LocalDate TRADE_DATE = LocalDate.of(2013, Month.MARCH, 13); //Today
private static final LocalDate EFFECTIVE_DATE = TRADE_DATE.plusDays(1); // AKA stepin date
private static final LocalDate CASH_SETTLE_DATE = DEFAULT_CALENDAR.shift(TRADE_DATE, 3); // AKA valuation date
private static final LocalDate STARTDATE = LocalDate.of(2012, Month.DECEMBER, 20);//last IMM date before TRADE_DATE;
//yield curve
private static final LocalDate SPOT_DATE = LocalDate.of(2013, Month.APRIL, 12);
private static final String[] YIELD_CURVE_POINTS = new String[] {"1M", "2M", "3M", "6M", "9M", "1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "12Y", "15Y", "20Y", "30Y" };
private static final String[] YIELD_CURVE_INSTRUMENTS = new String[] {"M", "M", "M", "M", "M", "M", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S" };
private static final double[] YIELD_CURVE_RATES = new double[] {0.00117, 0.00163, 0.00201, 0.00326, 0.00436, 0.00542, 0.00453, 0.00593, 0.00762, 0.00952, 0.01141, 0.0132, 0.01486, 0.01635, 0.01768,
0.01992, 0.02221, 0.02376, 0.02443 };
private static final IsdaCompliantYieldCurve YIELD_CURVE = makeYieldCurve(TRADE_DATE, SPOT_DATE, YIELD_CURVE_POINTS, YIELD_CURVE_INSTRUMENTS, YIELD_CURVE_RATES);
private static final LocalDate[] PILLAR_DATES = new LocalDate[] {LocalDate.of(2013, Month.DECEMBER, 20), LocalDate.of(2014, Month.JUNE, 20), LocalDate.of(2016, Month.JUNE, 20),
LocalDate.of(2018, Month.JUNE, 20), LocalDate.of(2020, Month.JUNE, 20), LocalDate.of(2023, Month.JUNE, 20) };
private static final double[] PAR_SPREADS = new double[] {0.0181398, 0.0181398, 0.027096, 0.0279819, 0.0357239, 0.0273206 };
@Test(expectedExceptions = IllegalArgumentException.class)
public void failTest() {
final IsdaCompliantCreditCurveBuilder creditCurveBuilder = new FastCreditCurveBuilder(MARKIT_FIX, ArbitrageHandling.Fail);
final int m = PILLAR_DATES.length;
final CdsAnalytic[] curveCDSs = new CdsAnalytic[m];
for (int i = 0; i < m; i++) {
curveCDSs[i] = new CdsAnalytic(TRADE_DATE, EFFECTIVE_DATE, CASH_SETTLE_DATE, STARTDATE, PILLAR_DATES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
}
@SuppressWarnings("unused")
final IsdaCompliantCreditCurve creditCurve = creditCurveBuilder.calibrateCreditCurve(curveCDSs, PAR_SPREADS, YIELD_CURVE);
}
@Test
//(enabled = false)
public void test() {
final IsdaCompliantCreditCurveBuilder creditCurveBuilder = new FastCreditCurveBuilder(MARKIT_FIX, ArbitrageHandling.ZeroHazardRate);
final int m = PILLAR_DATES.length;
final CdsAnalytic[] curveCDSs = new CdsAnalytic[m];
for (int i = 0; i < m; i++) {
curveCDSs[i] = new CdsAnalytic(TRADE_DATE, EFFECTIVE_DATE, CASH_SETTLE_DATE, STARTDATE, PILLAR_DATES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
}
final IsdaCompliantCreditCurve creditCurve = creditCurveBuilder.calibrateCreditCurve(curveCDSs, PAR_SPREADS, YIELD_CURVE);
for (int i = 0; i < 200; i++) {
final double t = 12.0 * i / 200.;
final double lambda = creditCurve.getForwardRate(t);
assertTrue(lambda >= 0);
}
}
}