/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.measure.credit;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.data.MarketData;
import com.opengamma.strata.data.scenario.CurrencyScenarioArray;
import com.opengamma.strata.data.scenario.DoubleScenarioArray;
import com.opengamma.strata.data.scenario.ScenarioArray;
import com.opengamma.strata.data.scenario.ScenarioMarketData;
import com.opengamma.strata.market.param.CurrencyParameterSensitivities;
import com.opengamma.strata.pricer.credit.CdsRecoveryRate;
import com.opengamma.strata.pricer.credit.IsdaCdsPricer;
import com.opengamma.strata.pricer.credit.IsdaCreditCurveInputs;
import com.opengamma.strata.pricer.credit.IsdaIndexCreditCurveInputsId;
import com.opengamma.strata.pricer.credit.IsdaIndexRecoveryRateId;
import com.opengamma.strata.pricer.credit.IsdaSingleNameCreditCurveInputsId;
import com.opengamma.strata.pricer.credit.IsdaSingleNameRecoveryRateId;
import com.opengamma.strata.pricer.credit.IsdaYieldCurveInputs;
import com.opengamma.strata.pricer.credit.IsdaYieldCurveInputsId;
import com.opengamma.strata.product.credit.IndexReferenceInformation;
import com.opengamma.strata.product.credit.ReferenceInformation;
import com.opengamma.strata.product.credit.ResolvedCds;
import com.opengamma.strata.product.credit.ResolvedCdsTrade;
import com.opengamma.strata.product.credit.SingleNameReferenceInformation;
/**
* Multi-scenario measure calculations for CSD trades.
* <p>
* Each method corresponds to a measure, typically calculated by one or more calls to the pricer.
*/
final class CdsMeasureCalculations {
/**
* The pricer to use.
*/
private static final IsdaCdsPricer PRICER = IsdaCdsPricer.DEFAULT;
// restricted constructor
private CdsMeasureCalculations() {
}
//-------------------------------------------------------------------------
// calculates present value for all scenarios
static CurrencyScenarioArray presentValue(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculatePresentValue(trade, marketData.scenario(i)));
}
// present value for one scenario
private static CurrencyAmount calculatePresentValue(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.presentValue(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates IR01 for all scenarios
static CurrencyScenarioArray ir01ParallelZero(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateIr01ParallelZero(trade, marketData.scenario(i)));
}
// IR01 for one scenario
private static CurrencyAmount calculateIr01ParallelZero(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.ir01ParallelZero(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates bucketed IR01 for all scenarios
static ScenarioArray<CurrencyParameterSensitivities> ir01BucketedZero(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return ScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateIr01BucketedZero(trade, marketData.scenario(i)));
}
// bucketed IR01 for one scenario
private static CurrencyParameterSensitivities calculateIr01BucketedZero(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.ir01BucketedZero(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates IR01 for all scenarios
static CurrencyScenarioArray ir01ParallelPar(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateIr01ParallelPar(trade, marketData.scenario(i)));
}
// IR01 for one scenario
private static CurrencyAmount calculateIr01ParallelPar(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.ir01ParallelPar(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates bucketed IR01 for all scenarios
static ScenarioArray<CurrencyParameterSensitivities> ir01BucketedPar(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return ScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateIr01BucketedPar(trade, marketData.scenario(i)));
}
// bucketed IR01 for one scenario
private static CurrencyParameterSensitivities calculateIr01BucketedPar(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.ir01BucketedPar(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates CS01 for all scenarios
static CurrencyScenarioArray cs01ParallelPar(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateCs01ParallelPar(trade, marketData.scenario(i)));
}
// present value for one scenario
private static CurrencyAmount calculateCs01ParallelPar(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.cs01ParallelPar(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates bucketed CS01 for all scenarios
static ScenarioArray<CurrencyParameterSensitivities> cs01BucketedPar(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return ScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateCs01BucketedPar(trade, marketData.scenario(i)));
}
// bucketed CS01 for one scenario
private static CurrencyParameterSensitivities calculateCs01BucketedPar(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.cs01BucketedPar(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates CS01 for all scenarios
static CurrencyScenarioArray cs01ParallelHazard(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateCs01ParallelHazard(trade, marketData.scenario(i)));
}
// CS01 for one scenario
private static CurrencyAmount calculateCs01ParallelHazard(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.cs01ParallelHazard(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates bucketed CS01 for all scenarios
static ScenarioArray<CurrencyParameterSensitivities> cs01BucketedHazard(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return ScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateCs01BucketedHazard(trade, marketData.scenario(i)));
}
// bucketed CS01 for one scenario
private static CurrencyParameterSensitivities calculateCs01BucketedHazard(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.cs01BucketedHazard(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates recovery01 for all scenarios
static CurrencyScenarioArray recovery01(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateRecovery01(trade, marketData.scenario(i)));
}
// recovery01 for one scenario
private static CurrencyAmount calculateRecovery01(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.recovery01(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// calculates jump to default for all scenarios
static CurrencyScenarioArray jumpToDefault(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return CurrencyScenarioArray.of(
marketData.getScenarioCount(),
i -> calculateJumpToDefault(trade, marketData.scenario(i)));
}
// jump to default for one scenario
private static CurrencyAmount calculateJumpToDefault(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.jumpToDefault(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate,
creditCurveInputs.getScalingFactor());
}
//-------------------------------------------------------------------------
// obtains the credit curve inputs
private static IsdaCreditCurveInputs creditCurveInputs(ResolvedCdsTrade trade, MarketData marketData) {
ReferenceInformation refInfo = trade.getProduct().getReferenceInformation();
if (refInfo instanceof SingleNameReferenceInformation) {
return marketData.getValue(IsdaSingleNameCreditCurveInputsId.of((SingleNameReferenceInformation) refInfo));
} else if (refInfo instanceof IndexReferenceInformation) {
return marketData.getValue(IsdaIndexCreditCurveInputsId.of((IndexReferenceInformation) refInfo));
} else {
throw new IllegalStateException("Unknown reference information type: " + refInfo.getType());
}
}
// obtains the recovey rate
private static CdsRecoveryRate cdsRecoveryRate(ResolvedCdsTrade trade, MarketData marketData) {
ReferenceInformation refInfo = trade.getProduct().getReferenceInformation();
if (refInfo instanceof SingleNameReferenceInformation) {
return marketData.getValue(IsdaSingleNameRecoveryRateId.of((SingleNameReferenceInformation) refInfo));
} else if (refInfo instanceof IndexReferenceInformation) {
return marketData.getValue(IsdaIndexRecoveryRateId.of((IndexReferenceInformation) refInfo));
} else {
throw new IllegalStateException("Unknown reference information type: " + refInfo.getType());
}
}
//-------------------------------------------------------------------------
// calculates par rate for all scenarios
static DoubleScenarioArray parRate(
ResolvedCdsTrade trade,
ScenarioMarketData marketData) {
return DoubleScenarioArray.of(
marketData.getScenarioCount(),
index -> calculateParRate(trade, marketData.scenario(index)));
}
// par rate for one scenario
private static double calculateParRate(
ResolvedCdsTrade trade,
MarketData marketData) {
ResolvedCds product = trade.getProduct();
IsdaYieldCurveInputs yieldCurveInputs = marketData.getValue(IsdaYieldCurveInputsId.of(product.getCurrency()));
IsdaCreditCurveInputs creditCurveInputs = creditCurveInputs(trade, marketData);
double recoveryRate = cdsRecoveryRate(trade, marketData).getRecoveryRate();
return PRICER.parRate(
product,
yieldCurveInputs,
creditCurveInputs,
marketData.getValuationDate(),
recoveryRate);
}
}