/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.future.calculator;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.bond.provider.BondSecurityDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesSecurity;
import com.opengamma.analytics.financial.provider.description.interestrate.ParameterIssuerProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivity;
import com.opengamma.util.ArgumentChecker;
/**
* Computes the par rate for different instrument. The meaning of "par rate" is instrument dependent.
*/
public final class FuturesPriceCurveSensitivityIssuerCalculator extends InstrumentDerivativeVisitorAdapter<ParameterIssuerProviderInterface, MulticurveSensitivity> {
/**
* The unique instance of the calculator.
*/
private static final FuturesPriceCurveSensitivityIssuerCalculator INSTANCE = new FuturesPriceCurveSensitivityIssuerCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static FuturesPriceCurveSensitivityIssuerCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private FuturesPriceCurveSensitivityIssuerCalculator() {
}
/** Method used to compute bond yield **/
private static final BondSecurityDiscountingMethod METHOD_BND = BondSecurityDiscountingMethod.getInstance();
// ----- Futures -----
@Override
public MulticurveSensitivity visitBondFuturesSecurity(final BondFuturesSecurity futures, final ParameterIssuerProviderInterface multicurve) {
ArgumentChecker.notNull(futures, "Future");
ArgumentChecker.notNull(multicurve, "Issuer and multi-curves provider");
final double[] priceFromBond = new double[futures.getDeliveryBasketAtDeliveryDate().length];
int indexCTD = 0;
double priceMin = 2.0;
for (int loopbasket = 0; loopbasket < futures.getDeliveryBasketAtDeliveryDate().length; loopbasket++) {
priceFromBond[loopbasket] = (METHOD_BND.cleanPriceFromCurves(futures.getDeliveryBasketAtDeliveryDate()[loopbasket], multicurve.getIssuerProvider())) / futures.getConversionFactor()[loopbasket];
if (priceFromBond[loopbasket] < priceMin) {
priceMin = priceFromBond[loopbasket];
indexCTD = loopbasket;
}
}
final MulticurveSensitivity result = METHOD_BND.dirtyPriceCurveSensitivity(futures.getDeliveryBasketAtDeliveryDate()[indexCTD], multicurve.getIssuerProvider());
return result.multipliedBy(1.0 / futures.getConversionFactor()[indexCTD]);
}
}