/**
* 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 java.time.LocalDate;
import java.time.Period;
import com.opengamma.strata.basics.date.BusinessDayConvention;
import com.opengamma.strata.basics.date.BusinessDayConventions;
import com.opengamma.strata.basics.date.DayCount;
import com.opengamma.strata.basics.date.DayCounts;
import com.opengamma.strata.basics.date.HolidayCalendar;
import com.opengamma.strata.basics.date.HolidayCalendars;
import com.opengamma.strata.basics.schedule.StubConvention;
import com.opengamma.strata.collect.ArgChecker;
/**
* Test.
*/
public class IsdaBaseTest {
protected static final AccrualOnDefaultFormulae ORIGINAL_ISDA = AccrualOnDefaultFormulae.ORIGINAL_ISDA;
protected static final AccrualOnDefaultFormulae MARKIT_FIX = AccrualOnDefaultFormulae.MARKIT_FIX;
protected static final AccrualOnDefaultFormulae OG_FIX = AccrualOnDefaultFormulae.CORRECT;
protected static final AnalyticCdsPricer PRICER = new AnalyticCdsPricer();
protected static final AnalyticCdsPricer PRICER_MARKIT_FIX = new AnalyticCdsPricer(MARKIT_FIX);
protected static final AnalyticCdsPricer PRICER_OG_FIX = new AnalyticCdsPricer(OG_FIX);
protected static final IsdaCompliantCreditCurveBuilder CREDIT_CURVE_BUILDER = new FastCreditCurveBuilder();
protected static final FiniteDifferenceSpreadSensitivityCalculator CS01_CAL = new FiniteDifferenceSpreadSensitivityCalculator();
protected static final double ONE_PC = 1e-2;
protected static final double ONE_BP = 1e-4;
protected static final double ONE_HUNDRED = 100.;
protected static final double TEN_THOUSAND = 10000.;
protected static final HolidayCalendar DEFAULT_CALENDAR = HolidayCalendars.SAT_SUN;
protected static final HolidayCalendar NO_HOLIDAY_CALENDAR = HolidayCalendars.NO_HOLIDAYS;
protected static final DayCount ACT365F = DayCounts.ACT_365F;
protected static final DayCount ACT360 = DayCounts.ACT_360;
protected static final DayCount D30360 = DayCounts.THIRTY_360_ISDA; // THIRTY_U_360 minus the EOM rule
protected static final DayCount ACT_ACT_ISDA = DayCounts.ACT_ACT_ISDA;
protected static final BusinessDayConvention FOLLOWING = BusinessDayConventions.FOLLOWING;
protected static final BusinessDayConvention MOD_FOLLOWING = BusinessDayConventions.MODIFIED_FOLLOWING;
//standard CDS settings
protected static final boolean PAY_ACC_ON_DEFAULT = true;
protected static final Period PAYMENT_INTERVAL = Period.ofMonths(3);
protected static final StubConvention STUB = StubConvention.SHORT_INITIAL;
protected static final boolean PROCTECTION_START = true;
protected static final double RECOVERY_RATE = 0.4;
protected static IsdaCompliantYieldCurveBuild makeYieldCurveBuilder(final LocalDate today, final LocalDate spotDate, final String[] maturities, final String[] type, final DayCount moneyMarketDCC,
final DayCount swapDCC, final Period swapInterval) {
return makeYieldCurveBuilder(today, spotDate, maturities, type, moneyMarketDCC, swapDCC, swapInterval, DEFAULT_CALENDAR);
}
protected static IsdaCompliantYieldCurveBuild makeYieldCurveBuilder(final LocalDate today, final LocalDate spotDate, final String[] maturities, final String[] type, final DayCount moneyMarketDCC,
final DayCount swapDCC, final Period swapInterval, final HolidayCalendar calendar) {
final DayCount curveDCC = ACT365F;
final int nInstruments = maturities.length;
ArgChecker.isTrue(nInstruments == type.length, "type length {} does not match maturities length {}", type.length, nInstruments);
final Period[] tenors = new Period[nInstruments];
final IsdaInstrumentTypes[] types = new IsdaInstrumentTypes[nInstruments];
for (int i = 0; i < nInstruments; i++) {
String temp = maturities[i];
if (temp.endsWith("M")) {
temp = temp.split("M")[0];
tenors[i] = Period.ofMonths(Integer.valueOf(temp));
} else if (temp.endsWith("Y")) {
temp = temp.split("Y")[0];
tenors[i] = Period.ofYears(Integer.valueOf(temp));
} else {
throw new IllegalArgumentException("cannot parse " + temp);
}
temp = type[i];
if (temp.equalsIgnoreCase("M")) {
types[i] = IsdaInstrumentTypes.MONEY_MARKET;
} else if (temp.equalsIgnoreCase("S")) {
types[i] = IsdaInstrumentTypes.SWAP;
} else {
throw new IllegalArgumentException("cannot parse " + temp);
}
}
final IsdaCompliantYieldCurveBuild builder = new IsdaCompliantYieldCurveBuild(today, spotDate, types, tenors, moneyMarketDCC, swapDCC, swapInterval, curveDCC, MOD_FOLLOWING, calendar);
return builder;
}
protected static IsdaCompliantYieldCurve makeYieldCurve(final LocalDate today, final LocalDate spotDate, final String[] maturities, final String[] type, final double[] rates,
final DayCount moneyMarketDCC, final DayCount swapDCC, final Period swapInterval) {
return makeYieldCurve(today, spotDate, maturities, type, rates, moneyMarketDCC, swapDCC, swapInterval, DEFAULT_CALENDAR);
}
protected static IsdaCompliantYieldCurve makeYieldCurve(final LocalDate today, final LocalDate spotDate, final String[] maturities, final String[] type, final double[] rates,
final DayCount moneyMarketDCC, final DayCount swapDCC, final Period swapInterval, final HolidayCalendar calendar) {
final IsdaCompliantYieldCurveBuild builder = makeYieldCurveBuilder(today, spotDate, maturities, type, moneyMarketDCC, swapDCC, swapInterval, calendar);
return builder.build(rates);
}
protected static IsdaCompliantYieldCurve makeYieldCurve(final LocalDate today, final LocalDate spotDate, final String[] maturities, final String[] type, final double[] rates) {
final DayCount moneyMarketDCC = ACT360;
final DayCount swapDCC = D30360;
final Period swapInterval = Period.ofMonths(6);
return makeYieldCurve(today, spotDate, maturities, type, rates, moneyMarketDCC, swapDCC, swapInterval);
}
protected static LocalDate parseDateString(final String ddmmyyyy) {
ArgChecker.notNull(ddmmyyyy, "ddmmyyyy");
final String[] temp = ddmmyyyy.split("/");
ArgChecker.isTrue(temp.length == 3, "date formatt wrong: length");
final int day = Integer.valueOf(temp[0]);
final int month = Integer.valueOf(temp[1]);
final int year = Integer.valueOf(temp[2]);
ArgChecker.isTrue(year > 1900 && year < 2500, "date formatt wrong: year out of range - {}", year);
return LocalDate.of(year, month, day);
}
protected static LocalDate[] parseDateStrings(final String[] ddmmyyyy) {
ArgChecker.notNull(ddmmyyyy, "ddmmyyyy");
final int n = ddmmyyyy.length;
final LocalDate[] res = new LocalDate[n];
for (int i = 0; i < n; i++) {
res[i] = parseDateString(ddmmyyyy[i]);
}
return res;
}
}