/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.future.method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.InterestRateCurveSensitivity;
import com.opengamma.analytics.financial.interestrate.YieldCurveBundle;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureSecurity;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.util.money.CurrencyAmount;
import com.opengamma.util.tuple.DoublesPair;
/**
* Method to compute the price for an interest rate future with discounting (like a forward).
* No convexity adjustment is done.
* @deprecated Use {@link com.opengamma.analytics.financial.interestrate.future.provider.InterestRateFutureSecurityDiscountingMethodDeprecated}
*/
@Deprecated
public final class InterestRateFutureSecurityDiscountingMethod extends InterestRateFutureSecurityMethod {
/**
* The unique instance of the calculator.
*/
private static final InterestRateFutureSecurityDiscountingMethod INSTANCE = new InterestRateFutureSecurityDiscountingMethod();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static InterestRateFutureSecurityDiscountingMethod getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private InterestRateFutureSecurityDiscountingMethod() {
}
/**
* Computes the price of a future from the curves using an estimation of the future rate without convexity adjustment.
* @param future The future.
* @param curves The yield curves. Should contain the forward curve associated.
* @return The price.
*/
public double price(final InterestRateFutureSecurity future, final YieldCurveBundle curves) {
Validate.notNull(future, "Future");
Validate.notNull(curves, "Curves");
final YieldAndDiscountCurve forwardCurve = curves.getCurve(future.getForwardCurveName());
final double forward = (forwardCurve.getDiscountFactor(future.getFixingPeriodStartTime()) / forwardCurve.getDiscountFactor(future.getFixingPeriodEndTime()) - 1)
/ future.getFixingPeriodAccrualFactor();
final double price = 1.0 - forward;
return price;
}
/**
* Compute the price sensitivity to rates of an interest rate future by discounting.
* @param future The future.
* @param curves The yield curves. Should contain the forward curve associated.
* @return The price rate sensitivity.
*/
@Override
public InterestRateCurveSensitivity priceCurveSensitivity(final InterestRateFutureSecurity future, final YieldCurveBundle curves) {
Validate.notNull(future, "Future");
Validate.notNull(curves, "Curves");
final YieldAndDiscountCurve forwardCurve = curves.getCurve(future.getForwardCurveName());
final double dfForwardStart = forwardCurve.getDiscountFactor(future.getFixingPeriodStartTime());
final double dfForwardEnd = forwardCurve.getDiscountFactor(future.getFixingPeriodEndTime());
// Partials - XBar => d(price)/dX
final double priceBar = 1.0;
final double forwardBar = -priceBar;
final double dfForwardEndBar = -dfForwardStart / (dfForwardEnd * dfForwardEnd) / future.getFixingPeriodAccrualFactor() * forwardBar;
final double dfForwardStartBar = 1.0 / (future.getFixingPeriodAccrualFactor() * dfForwardEnd) * forwardBar;
final Map<String, List<DoublesPair>> resultMap = new HashMap<>();
final List<DoublesPair> listForward = new ArrayList<>();
final List<DoublesPair> listFunding = new ArrayList<>();
listForward.add(DoublesPair.of(future.getFixingPeriodStartTime(), -future.getFixingPeriodStartTime() * dfForwardStart * dfForwardStartBar));
listForward.add(DoublesPair.of(future.getFixingPeriodEndTime(), -future.getFixingPeriodEndTime() * dfForwardEnd * dfForwardEndBar));
resultMap.put(future.getDiscountingCurveName(), listFunding);
resultMap.put(future.getForwardCurveName(), listForward);
final InterestRateCurveSensitivity result = new InterestRateCurveSensitivity(resultMap);
return result;
}
/**
* Computes the future rate (1-price) from the curves using an estimation of the future rate without convexity adjustment.
* @param future The future.
* @param curves The yield curves. Should contain the forward curve associated.
* @return The rate.
*/
public double parRate(final InterestRateFutureSecurity future, final YieldCurveBundle curves) {
Validate.notNull(future, "Future");
Validate.notNull(curves, "Curves");
final YieldAndDiscountCurve forwardCurve = curves.getCurve(future.getForwardCurveName());
final double forward = (forwardCurve.getDiscountFactor(future.getFixingPeriodStartTime()) / forwardCurve.getDiscountFactor(future.getFixingPeriodEndTime()) - 1)
/ future.getFixingPeriodAccrualFactor();
return forward;
}
/**
* Computes the future rate (1-price) curve sensitivity from the curves using an estimation of the future rate without convexity adjustment.
* @param future The future.
* @param curves The yield curves. Should contain the forward curve associated.
* @return The rate curve sensitivity.
*/
public InterestRateCurveSensitivity parRateCurveSensitivity(final InterestRateFutureSecurity future, final YieldCurveBundle curves) {
Validate.notNull(future, "Future");
Validate.notNull(curves, "Curves");
final String curveName = future.getForwardCurveName();
final YieldAndDiscountCurve curve = curves.getCurve(curveName);
final double ta = future.getFixingPeriodStartTime();
final double tb = future.getFixingPeriodEndTime();
final double ratio = curve.getDiscountFactor(ta) / curve.getDiscountFactor(tb) / future.getFixingPeriodAccrualFactor();
final DoublesPair s1 = DoublesPair.of(ta, -ta * ratio);
final DoublesPair s2 = DoublesPair.of(tb, tb * ratio);
final List<DoublesPair> temp = new ArrayList<>();
temp.add(s1);
temp.add(s2);
final Map<String, List<DoublesPair>> result = new HashMap<>();
result.put(curveName, temp);
return new InterestRateCurveSensitivity(result);
}
@Override
public CurrencyAmount presentValue(final InstrumentDerivative instrument, final YieldCurveBundle curves) {
throw new UnsupportedOperationException("Present value not supported for STIR futures securities");
}
@Override
public InterestRateCurveSensitivity presentValueCurveSensitivity(final InterestRateFutureSecurity future, final YieldCurveBundle curves) {
return presentValueCurveSensitivity(future, priceCurveSensitivity(future, curves));
}
}