/**
* 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 java.util.Set;
import org.threeten.bp.Period;
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.financial.analytics.isda.credit.CreditCurveData;
import com.opengamma.financial.convention.HolidaySourceCalendarAdapter;
import com.opengamma.financial.convention.IsdaCreditCurveConvention;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.frequency.PeriodFrequency;
import com.opengamma.financial.security.credit.LegacyCDSSecurity;
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 legacy cds security to its analytics type.
*/
public class DefaultLegacyCdsConverterFn implements LegacyCdsConverterFn {
private final HolidaySource _holidaySource;
/**
* Creates an instance.
*
* @param holidaySource the holiday source to use for calendar resolution
*/
public DefaultLegacyCdsConverterFn(HolidaySource holidaySource) {
_holidaySource = ArgumentChecker.notNull(holidaySource, "holidaySource");
}
@Override
public Result<CDSAnalytic> toCdsAnalytic(Environment env, LegacyCDSSecurity legacyCds, IsdaCreditCurve curve) {
CreditCurveData curveData = curve.getCurveData();
IsdaCreditCurveConvention convention = curveData.getCurveConventionLink().resolve();
Set<ExternalId> calendarIds = legacyCds.getCalendars();
Calendar calendar = new HolidaySourceCalendarAdapter(_holidaySource,
calendarIds.toArray(new ExternalId[calendarIds.size()]));
Period couponFreq = PeriodFrequency.convertToPeriodFrequency(legacyCds.getCouponFrequency()).getPeriod();
double recoveryRate;
//recovery rate is taken from the cds contract if one is specified,
//otherwise as observed on market data.
if (legacyCds.getFixedRecovery() != null) {
recoveryRate = legacyCds.getFixedRecovery();
} else {
recoveryRate = curveData.getRecoveryRate();
}
CDSAnalyticFactory cdsAnalyticFactory = new CDSAnalyticFactory()
.with(legacyCds.getBusinessDayConvention())
.with(calendar)
.with(couponFreq)
//note - could equally drive this off 30 day IMM rule
//if (first coupon date - trade date) < 30 days, FRONTLONG
//else FRONTSHORT
.with(convention.getStubType())
.withAccrualDCC(legacyCds.getDayCount())
.withCashSettle(convention.getCashSettle())
.withCurveDCC(convention.getCurveDayCount())
.withPayAccOnDefault(legacyCds.isAccruedOnDefault())
.withProtectionStart(convention.isProtectFromStartOfDay())
.withRecoveryRate(recoveryRate)
.withStepIn(convention.getStepIn());
CDSAnalytic cdsAnalytic = cdsAnalyticFactory.makeCDS(legacyCds.getTradeDate(),
legacyCds.getStartDate(),
legacyCds.getMaturityDate());
return Result.success(cdsAnalytic);
}
}