/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.credit.measures; import com.opengamma.analytics.financial.credit.isdastandardmodel.AccrualOnDefaultFormulae; import com.opengamma.analytics.financial.credit.isdastandardmodel.AnalyticCDSPricer; import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalytic; import com.opengamma.analytics.financial.credit.isdastandardmodel.PriceType; import com.opengamma.sesame.credit.CdsData; import com.opengamma.sesame.credit.IsdaCompliantCreditCurveFn; import com.opengamma.sesame.credit.IsdaCreditCurve; import com.opengamma.sesame.credit.converter.IndexCdsConverterFn; import com.opengamma.sesame.credit.converter.LegacyCdsConverterFn; import com.opengamma.sesame.credit.converter.StandardCdsConverterFn; import com.opengamma.sesame.credit.market.IndexCdsMarketDataResolverFn; import com.opengamma.sesame.credit.market.LegacyCdsMarketDataResolverFn; import com.opengamma.sesame.credit.market.StandardCdsMarketDataResolverFn; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.CurrencyAmount; import com.opengamma.util.result.Result; /** * Default implementation of the credit PV function */ public class DefaultCreditPvFn extends AbstractCreditRiskMeasureFn<CurrencyAmount> implements CreditPvFn { /** * Calculator for CDS measures */ private final AnalyticCDSPricer _calculator; /** * Enumerate the types of PV that can be returned (usually clean or dirty) */ private final PriceType _priceType; /** * Creates an instance. * * @param legacyCdsConverterFn a legacy cds converter * @param standardCdsConverterFn a standard cds converter * @param indexCdsConverterFn a index cds converter * @param standardCdsMarketDataResolverFn a market data resolver for standard cds * @param legacyCdsMarketDataResolverFn a market data resolver for legacy cds * @param creditCurveFn the credit curve function * @param priceType the type of PV that will be returned * @param accrualOnDefaultFormulae the accrual on default formulae to use */ public DefaultCreditPvFn(LegacyCdsConverterFn legacyCdsConverterFn, StandardCdsConverterFn standardCdsConverterFn, IndexCdsConverterFn indexCdsConverterFn, StandardCdsMarketDataResolverFn standardCdsMarketDataResolverFn, LegacyCdsMarketDataResolverFn legacyCdsMarketDataResolverFn, IndexCdsMarketDataResolverFn indexCdsMarketDataResolverFn, IsdaCompliantCreditCurveFn creditCurveFn, PriceType priceType, AccrualOnDefaultFormulae accrualOnDefaultFormulae) { super(legacyCdsConverterFn, standardCdsConverterFn, indexCdsConverterFn, indexCdsMarketDataResolverFn, standardCdsMarketDataResolverFn, legacyCdsMarketDataResolverFn, creditCurveFn); ArgumentChecker.notNull(accrualOnDefaultFormulae, "accrualOnDefaultFormulae"); _priceType = ArgumentChecker.notNull(priceType, "priceType"); _calculator = new AnalyticCDSPricer(accrualOnDefaultFormulae); } @Override protected Result<CurrencyAmount> price(CdsData cdsData, CDSAnalytic cds, IsdaCreditCurve curve) { double pv = _calculator.pv(cds, curve.getYieldCurve().getCalibratedCurve(), curve.getCalibratedCurve(), cdsData.getCoupon(), _priceType); int sign = cdsData.isBuy() ? 1 : -1; double adjusted = pv * cdsData.getInterestRateNotional().getAmount() * sign; CurrencyAmount currencyAmount = CurrencyAmount.of(cdsData.getInterestRateNotional().getCurrency(), adjusted); return Result.success(currencyAmount); } }