package com.opengamma.analytics.financial.credit.isdastandardmodel;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import org.threeten.bp.Period;
import com.opengamma.analytics.financial.schedule.NoHolidayCalendar;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.businessday.BusinessDayConventions;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.daycount.DayCounts;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class ISDABaseTest {
protected static final AccrualOnDefaultFormulae ORIGINAL_ISDA = AccrualOnDefaultFormulae.OrignalISDA;
protected static final AccrualOnDefaultFormulae MARKIT_FIX = AccrualOnDefaultFormulae.MarkitFix;
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 Calendar DEFAULT_CALENDAR = new MondayToFridayCalendar("Weekend_Only");
protected static final Calendar NO_HOLIDAY_CALENDAR = new NoHolidayCalendar();
protected static final DayCount ACT365F = DayCounts.ACT_365;
protected static final DayCount ACT360 = DayCounts.ACT_360;
protected static final DayCount D30360 = DayCounts.THIRTY_U_360;
protected static final DayCount ACT_ACT_ISDA = DayCounts.ACT_ACT_ISDA;
protected static final DayCount BUS_252 = DayCounts.BUSINESS_252;
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 StubType STUB = StubType.FRONTSHORT;
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 Calendar calendar) {
final DayCount curveDCC = ACT365F;
final int nInstruments = maturities.length;
ArgumentChecker.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.MoneyMarket;
} else if (temp.equalsIgnoreCase("S")) {
types[i] = ISDAInstrumentTypes.Swap;
} else {
throw new IllegalArgumentException("cannot parse " + temp);
}
}
// return ISDACompliantYieldCurveBuild.build(today, spotDate, types, tenors, rates, moneyMarketDCC, swapDCC, swapInterval, curveDCC, MOD_FOLLOWING);
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 Calendar 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) {
ArgumentChecker.notNull(ddmmyyyy, "ddmmyyyy");
final String[] temp = ddmmyyyy.split("/");
ArgumentChecker.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]);
ArgumentChecker.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) {
ArgumentChecker.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;
}
}