/**
* 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 org.apache.commons.math.stat.descriptive.moment.Mean;
import org.apache.commons.math.stat.descriptive.rank.Min;
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.interestrate.future.derivative.BondFuturesYieldAverageSecurity;
import com.opengamma.analytics.financial.provider.description.interestrate.ParameterIssuerProviderInterface;
import com.opengamma.util.ArgumentChecker;
/**
* Computes the price for different types of futures. Calculator using a multi-curve and issuer provider.
*/
public final class FuturesPriceIssuerCalculator extends InstrumentDerivativeVisitorAdapter<ParameterIssuerProviderInterface, Double> {
/**
* The unique instance of the calculator.
*/
private static final FuturesPriceIssuerCalculator INSTANCE = new FuturesPriceIssuerCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static FuturesPriceIssuerCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private FuturesPriceIssuerCalculator() {
}
/** Method used to compute bond yield **/
private static final BondSecurityDiscountingMethod METHOD_BND = BondSecurityDiscountingMethod.getInstance();
/** Function to compute average of arrays **/
private static final Mean MEAN_FUNCTION = new Mean();
/** Function to compute average of arrays **/
private static final Min MIN_FUNCTION = new Min();
// ----- Futures -----
@Override
public Double visitBondFuturesYieldAverageSecurity(final BondFuturesYieldAverageSecurity futures, final ParameterIssuerProviderInterface multicurve) {
ArgumentChecker.notNull(futures, "futures");
ArgumentChecker.notNull(futures, "multi-curve provider");
final int nbBonds = futures.getDeliveryBasketAtDeliveryDate().length;
// Yield at theoretical delivery for each bond
final double[] yield = new double[nbBonds];
for (int loopbond = 0; loopbond < nbBonds; loopbond++) {
yield[loopbond] = METHOD_BND.yieldFromCurves(futures.getDeliveryBasketAtDeliveryDate()[loopbond], multicurve.getIssuerProvider());
}
final double yieldAverage = MEAN_FUNCTION.evaluate(yield); // Average yield
final double price = 1.0d - yieldAverage;
return price;
}
@Override
public Double 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];
for (int loopbasket = 0; loopbasket < futures.getDeliveryBasketAtDeliveryDate().length; loopbasket++) {
priceFromBond[loopbasket] = METHOD_BND.cleanPriceFromCurves(futures.getDeliveryBasketAtDeliveryDate()[loopbasket], multicurve.getIssuerProvider())
/ futures.getConversionFactor()[loopbasket];
}
final double priceFuture = MIN_FUNCTION.evaluate(priceFromBond);
return priceFuture;
}
}