/**
* 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.google.common.collect.ImmutableSortedSet;
import com.opengamma.analytics.financial.credit.isdastandardmodel.AccrualOnDefaultFormulae;
import com.opengamma.analytics.financial.credit.isdastandardmodel.CDSAnalytic;
import com.opengamma.analytics.financial.credit.isdastandardmodel.FiniteDifferenceSpreadSensitivityCalculator;
import com.opengamma.financial.analytics.TenorLabelledMatrix1D;
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.result.Result;
import com.opengamma.util.time.Tenor;
/**
* Default implementation of the credit Bucketed CS01 function
*/
public class DefaultCreditBucketedCs01Fn extends AbstractCreditRiskMeasureFn<TenorLabelledMatrix1D> implements CreditBucketedCs01Fn {
/**
* The fraction bump amount, so a 1bp bump is 1e-4
*/
private static final double SCALE = 1e-4;
/**
* Calculator for CDS measures
*/
private final FiniteDifferenceSpreadSensitivityCalculator _calculator;
/**
* Creates an instance.
*
* @param legacyCdsConverterFn a legacy cds converter
* @param standardCdsConverterFn a standard 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 accrualOnDefaultFormulae the accrual on default formulae to use
*/
public DefaultCreditBucketedCs01Fn(LegacyCdsConverterFn legacyCdsConverterFn,
StandardCdsConverterFn standardCdsConverterFn,
IndexCdsConverterFn indexCdsConverterFn,
StandardCdsMarketDataResolverFn standardCdsMarketDataResolverFn,
LegacyCdsMarketDataResolverFn legacyCdsMarketDataResolverFn,
IndexCdsMarketDataResolverFn indexCdsMarketDataResolverFn,
IsdaCompliantCreditCurveFn creditCurveFn,
AccrualOnDefaultFormulae accrualOnDefaultFormulae) {
super(legacyCdsConverterFn,
standardCdsConverterFn,
indexCdsConverterFn,
indexCdsMarketDataResolverFn,
standardCdsMarketDataResolverFn,
legacyCdsMarketDataResolverFn,
creditCurveFn);
ArgumentChecker.notNull(accrualOnDefaultFormulae, "accrualOnDefaultFormulae");
_calculator = new FiniteDifferenceSpreadSensitivityCalculator(accrualOnDefaultFormulae);
}
@Override
protected Result<TenorLabelledMatrix1D> price(CdsData cdsData, CDSAnalytic cds, IsdaCreditCurve curve) {
ImmutableSortedSet<Tenor> tenors = cdsData.getTenors();
Tenor[] tenorArray = tenors.toArray(new Tenor[tenors.size()]);
CDSAnalytic[] cdsAnalytics = curve.getCalibratedCds().toArray(new CDSAnalytic[curve.getCalibratedCds().size()]);
double[] bucketedCs01 = _calculator.bucketedCS01FromCreditCurve(cds,
cdsData.getCoupon(),
cdsAnalytics,
curve.getYieldCurve().getCalibratedCurve(),
curve.getCalibratedCurve(),
SCALE);
int sign = cdsData.isBuy() ? 1 : -1;
double adjust = sign * cdsData.getInterestRateNotional().getAmount() * SCALE;
double[] adjustedBCS01 = new double[bucketedCs01.length];
for (int i = 0; i < bucketedCs01.length; i++) {
adjustedBCS01[i] = bucketedCs01[i] * adjust;
}
TenorLabelledMatrix1D matrix1D = new TenorLabelledMatrix1D(tenorArray, adjustedBCS01);
return Result.success(matrix1D);
}
}