/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.commodity.multicurvecommodity.provider; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.CommodityFutureSecurity; import com.opengamma.analytics.financial.provider.description.commodity.CommodityProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.commodity.CommoditySensitivity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.DoublesPair; /** * Method to compute the price for an interest rate future with discounting (like a forward). */ public final class CommodityFutureSecurityForwardMethod extends CommodityFutureSecurityMethod { /** * The unique instance of the calculator. */ private static final CommodityFutureSecurityForwardMethod INSTANCE = new CommodityFutureSecurityForwardMethod(); /** * Gets the calculator instance. * @return The calculator. */ public static CommodityFutureSecurityForwardMethod getInstance() { return INSTANCE; } /** * Constructor. */ private CommodityFutureSecurityForwardMethod() { } /** * Computes the price of a future from the curves using an estimation of the futures rate without convexity adjustment. * @param future The future. * @param multicurves The multi-curve provider. * @return The price. */ @Override public double price(final CommodityFutureSecurity future, final CommodityProviderInterface multicurves) { ArgumentChecker.notNull(future, "Futures"); ArgumentChecker.notNull(multicurves, "Multi-curves provider"); return multicurves.getForwardValue(future.getUnderlying(), future.getSettlementTime()); } @Override double netAmount(final CommodityFutureSecurity future, final CommodityProviderInterface multicurve) { return price(future, multicurve) / multicurve.getDiscountFactor(future.getCurrency(), future.getSettlementTime()); } /** * Compute the price sensitivity to rates of a commodity future . * @param future The future. * @param multicurves The multi-curve provider. * @return The price rate sensitivity. */ @Override public CommoditySensitivity priceCurveSensitivity(final CommodityFutureSecurity future, final CommodityProviderInterface multicurves) { ArgumentChecker.notNull(future, "Future"); ArgumentChecker.notNull(multicurves, "Multi-curves provider"); // Backward sweep final double pvBar = 1.0; final double forwardBar = pvBar; final Map<String, List<DoublesPair>> resultMapCommodity = new HashMap<>(); final List<DoublesPair> listPrice = new ArrayList<>(); listPrice.add(DoublesPair.of(future.getSettlementTime(), forwardBar)); resultMapCommodity.put(multicurves.getName(future.getUnderlying()), listPrice); return CommoditySensitivity.ofCommodityForwardValue(resultMapCommodity); } }