/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.bond.provider;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondCapitalIndexedTransaction;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Coupon;
import com.opengamma.analytics.financial.provider.calculator.inflation.PresentValueCurveSensitivityDiscountingInflationCalculator;
import com.opengamma.analytics.financial.provider.calculator.inflation.PresentValueDiscountingInflationCalculator;
import com.opengamma.analytics.financial.provider.description.inflation.InflationProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.inflation.MultipleCurrencyInflationSensitivity;
import com.opengamma.util.money.MultipleCurrencyAmount;
/**
* Pricing method for inflation bond transaction. The price is computed by index estimation and discounting. (without issuer)
*/
public final class BondCapitalIndexedTransactionDiscountingMethodWithoutIssuer {
/**
* The unique instance of the class.
*/
private static final BondCapitalIndexedTransactionDiscountingMethodWithoutIssuer INSTANCE = new BondCapitalIndexedTransactionDiscountingMethodWithoutIssuer();
/**
* Return the class instance.
* @return The instance.
*/
public static BondCapitalIndexedTransactionDiscountingMethodWithoutIssuer getInstance() {
return INSTANCE;
}
/**
* The present value inflation calculator (for the different parts of the bond transaction).
*/
private static final PresentValueDiscountingInflationCalculator PVIC = PresentValueDiscountingInflationCalculator.getInstance();
private static final PresentValueCurveSensitivityDiscountingInflationCalculator PVCSIC = PresentValueCurveSensitivityDiscountingInflationCalculator.getInstance();
/**
* The method used for security computation.
*/
private static final BondCapitalIndexedSecurityDiscountingMethodWithoutIssuer METHOD_SECURITY = new BondCapitalIndexedSecurityDiscountingMethodWithoutIssuer();
/**
* Computes the present value of a capital indexed bound transaction by index estimation and discounting.
* @param bond The bond transaction.
* @param provider The provider.
* @return The present value.
*/
public MultipleCurrencyAmount presentValue(final BondCapitalIndexedTransaction<?> bond, final InflationProviderInterface provider) {
final MultipleCurrencyAmount pvBond = METHOD_SECURITY.presentValue(bond.getBondTransaction(), provider);
final MultipleCurrencyAmount pvSettlement = bond.getBondTransaction().getSettlement().accept(PVIC, provider).multipliedBy(
bond.getQuantity() * bond.getBondTransaction().getCoupon().getNthPayment(0).getNotional());
return pvBond.multipliedBy(bond.getQuantity()).plus(pvSettlement);
}
/**
* Computes the security present value from a quoted clean real price.
* @param bond The bond transaction.
* @param provider The provider.
* @param cleanPriceReal The clean price.
* @return The present value.
*/
public MultipleCurrencyAmount presentValueFromCleanPriceReal(final BondCapitalIndexedTransaction<Coupon> bond, final InflationProviderInterface provider, final double cleanPriceReal) {
Validate.notNull(bond, "Coupon");
Validate.notNull(provider, "Provider");
final MultipleCurrencyAmount pvBond = METHOD_SECURITY.presentValueFromCleanPriceReal(bond.getBondTransaction(), provider, cleanPriceReal);
final MultipleCurrencyAmount pvSettlement = bond.getBondTransaction().getSettlement().accept(PVIC, provider).multipliedBy(
bond.getQuantity() * bond.getBondTransaction().getCoupon().getNthPayment(0).getNotional());
return pvBond.plus(pvSettlement);
}
/**
* Computes the present value of a capital indexed bound transaction by index estimation and discounting.
* @param bond The bond transaction.
* @param provider The provider.
* @return The present value.
*/
public MultipleCurrencyInflationSensitivity presentValueCurveSensitivity(final BondCapitalIndexedTransaction<?> bond, final InflationProviderInterface provider) {
final MultipleCurrencyInflationSensitivity sensitivityBond = METHOD_SECURITY.presentValueCurveSensitivity(bond.getBondTransaction(), provider);
final MultipleCurrencyInflationSensitivity sensitivitySettlement = bond.getBondTransaction().getSettlement().accept(PVCSIC, provider).multipliedBy(
bond.getQuantity() * bond.getBondTransaction().getCoupon().getNthPayment(0).getNotional());
return sensitivityBond.multipliedBy(bond.getQuantity()).plus(sensitivitySettlement);
}
}