/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.credit.converter; import static com.opengamma.analytics.financial.credit.isdastandardmodel.IMMDateLogic.getPrevIMMDate; import org.threeten.bp.LocalDate; import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalytic; import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalyticFactory; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.core.region.RegionSource; import com.opengamma.financial.analytics.conversion.CalendarUtils; import com.opengamma.financial.analytics.isda.credit.CreditCurveData; import com.opengamma.financial.analytics.model.credit.IMMDateGenerator; import com.opengamma.financial.convention.IsdaCreditCurveConvention; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.security.credit.StandardCDSSecurity; import com.opengamma.id.ExternalId; import com.opengamma.sesame.Environment; import com.opengamma.sesame.credit.IsdaCreditCurve; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.result.Result; /** * Converts a standard cds to its analytics type, {@link CDSAnalytic}. */ public class DefaultStandardCdsConverterFn implements StandardCdsConverterFn { private final RegionSource _regionSource; private final HolidaySource _holidaySource; /** * Creates an instance * * @param regionSource the region source for resolving holiday calendars * @param holidaySource the holiday source for resolving holiday calendars */ public DefaultStandardCdsConverterFn(RegionSource regionSource, HolidaySource holidaySource) { _regionSource = ArgumentChecker.notNull(regionSource, "regionSource"); _holidaySource = ArgumentChecker.notNull(holidaySource, "holidaySource"); } @Override public Result<CDSAnalytic> toCdsAnalytic(Environment env, StandardCDSSecurity cds, IsdaCreditCurve curve) { CreditCurveData curveData = curve.getCurveData(); IsdaCreditCurveConvention convention = curveData.getCurveConventionLink().resolve(); ExternalId regionId = convention.getRegionId(); Calendar calendar; if (regionId == null) { calendar = new MondayToFridayCalendar("weekday calendar"); } else { calendar = CalendarUtils.getCalendar(_regionSource, _holidaySource, regionId); } LocalDate prevImm = convention.getBusinessDayConvention().adjustDate(calendar, getPrevIMMDate(cds.getTradeDate())); CDSAnalyticFactory factory = new CDSAnalyticFactory() .with(convention.getBusinessDayConvention()) .with(calendar) .with(convention.getCouponInterval()) .with(convention.getStubType()) .withAccrualDCC(convention.getAccrualDayCount()) .withCashSettle(convention.getCashSettle()) .withCurveDCC(convention.getCurveDayCount()) .withPayAccOnDefault(convention.isPayAccOnDefault()) .withProtectionStart(convention.isProtectFromStartOfDay()) .withRecoveryRate(curveData.getRecoveryRate()) .withStepIn(convention.getStepIn()); CDSAnalytic cdsAnalytic = factory.makeCDS(cds.getTradeDate(), prevImm, cds.getMaturityDate()); return Result.success(cdsAnalytic); } }