/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.issuer;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondCapitalIndexedTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedSecurity;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondSecurity;
import com.opengamma.analytics.financial.interestrate.bond.provider.BondSecurityDiscountingMethod;
import com.opengamma.analytics.financial.provider.description.interestrate.IssuerProviderInterface;
import com.opengamma.util.tuple.Pair;
/**
* Calculates the z-spread of instruments using issuer-specific curves.
*/
public final class ZSpreadIssuerCalculator extends
InstrumentDerivativeVisitorAdapter<Pair<IssuerProviderInterface, Double>, Double> {
private static final ZSpreadIssuerCalculator INSTANCE = new ZSpreadIssuerCalculator();
private static final BondSecurityDiscountingMethod METHOD_BOND_SEC = BondSecurityDiscountingMethod.getInstance();
private static final int SCALING_FACTOR = 100;
private ZSpreadIssuerCalculator() {}
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static ZSpreadIssuerCalculator getInstance() {
return INSTANCE;
}
/** necessary to scale twice, to scale up for the input price and the calculator output */
private Double getBondZSpreadPrice(BondSecurity bond, Pair<IssuerProviderInterface, Double> data) {
return SCALING_FACTOR * SCALING_FACTOR * METHOD_BOND_SEC.zSpreadFromCurvesAndClean(bond,
data.getFirst(),
data.getSecond());
}
//TODO add BondIborSecurity, BondInterestIndexedSecurity when clean price is supported
@Override
public Double visitBondFixedSecurity(BondFixedSecurity bond, Pair<IssuerProviderInterface, Double> data) {
return getBondZSpreadPrice(bond, data);
}
@Override
public Double visitBondFixedTransaction(BondFixedTransaction bond, Pair<IssuerProviderInterface, Double> data) {
return getBondZSpreadPrice(bond.getBondStandard(), data);
}
@Override
public Double visitBondCapitalIndexedTransaction(BondCapitalIndexedTransaction<?> bond,
Pair<IssuerProviderInterface, Double> data) {
return getBondZSpreadPrice(bond.getBondStandard(), data);
}
}