/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.future.provider;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.future.FederalFundsFutureSecurityDefinition;
import com.opengamma.analytics.financial.instrument.future.FederalFundsFutureTransactionDefinition;
import com.opengamma.analytics.financial.instrument.index.IndexON;
import com.opengamma.analytics.financial.interestrate.future.derivative.FederalFundsFutureSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.FederalFundsFutureTransaction;
import com.opengamma.analytics.financial.provider.calculator.discounting.ParSpreadMarketQuoteDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.ParSpreadRateDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueCurveSensitivityDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueDiscountingCalculator;
import com.opengamma.analytics.financial.provider.description.MulticurveProviderDiscountDataSets;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ParameterSensitivityMulticurveDiscountInterpolatedFDCalculator;
import com.opengamma.analytics.financial.provider.sensitivity.parameter.ParameterSensitivityParameterCalculator;
import com.opengamma.analytics.financial.util.AssertSensitivityObjects;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.timeseries.precise.zdt.ImmutableZonedDateTimeDoubleTimeSeries;
import com.opengamma.timeseries.precise.zdt.ZonedDateTimeDoubleTimeSeries;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.MultipleCurrencyAmount;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test related to Fed Funds futures pricing.
*/
@Test(groups = TestGroup.UNIT)
public class FederalFundsFutureTransactionDiscountingMethodTest {
private static final MulticurveProviderDiscount MULTICURVES = MulticurveProviderDiscountDataSets.createMulticurveEurUsd();
private static final IndexON INDEX_FEDFUND = MulticurveProviderDiscountDataSets.getIndexesON()[0];
private static final Currency USD = INDEX_FEDFUND.getCurrency();
private static final Calendar NYC = MulticurveProviderDiscountDataSets.getUSDCalendar();
private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2012, 1, 30);
private static final ZonedDateTime MARCH_1 = DateUtils.getUTCDate(2012, 3, 1);
private static final double TRADE_PRICE = 0.99900;
private static final int QUANTITY = 123;
private static final FederalFundsFutureSecurityDefinition FUTURE_SECURITY_DEFINITION = FederalFundsFutureSecurityDefinition.fromFedFund(MARCH_1, INDEX_FEDFUND, NYC);
private static final FederalFundsFutureTransactionDefinition FUTURE_TRANSACTION_DEFINITION = new FederalFundsFutureTransactionDefinition(FUTURE_SECURITY_DEFINITION, QUANTITY, REFERENCE_DATE,
TRADE_PRICE);
private static final ZonedDateTime[] CLOSING_DATE = new ZonedDateTime[] {REFERENCE_DATE.minusDays(2), REFERENCE_DATE.minusDays(1), REFERENCE_DATE };
private static final double[] CLOSING_PRICE = new double[] {0.99895, 0.99905, 0.99915 };
private static final ZonedDateTimeDoubleTimeSeries CLOSING_TS = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC(CLOSING_DATE, CLOSING_PRICE);
private static final ZonedDateTime[] FIXING_DATE = new ZonedDateTime[] {REFERENCE_DATE.minusDays(2), REFERENCE_DATE.minusDays(1), REFERENCE_DATE };
private static final double[] FIXING_RATE = new double[] {0.0010, 0.0011, 0.0009 };
private static final ZonedDateTimeDoubleTimeSeries FIXING_TS = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC(FIXING_DATE, FIXING_RATE);
private static final ZonedDateTimeDoubleTimeSeries[] DATA = new ZonedDateTimeDoubleTimeSeries[] {FIXING_TS, CLOSING_TS };
private static final FederalFundsFutureSecurity FUTURE_SECURITY = FUTURE_SECURITY_DEFINITION.toDerivative(REFERENCE_DATE);
private static final FederalFundsFutureTransaction FUTURE_TRANSACTION = FUTURE_TRANSACTION_DEFINITION.toDerivative(REFERENCE_DATE, DATA);
private static final FederalFundsFutureSecurityDiscountingMethod METHOD_SECURITY = FederalFundsFutureSecurityDiscountingMethod.getInstance();
private static final FederalFundsFutureTransactionDiscountingMethod METHOD_TRANSACTION = FederalFundsFutureTransactionDiscountingMethod.getInstance();
private static final PresentValueDiscountingCalculator PVDC = PresentValueDiscountingCalculator.getInstance();
private static final PresentValueCurveSensitivityDiscountingCalculator PVCSDC = PresentValueCurveSensitivityDiscountingCalculator.getInstance();
private static final double SHIFT = 1.0E-6;
private static final ParameterSensitivityParameterCalculator<ParameterProviderInterface> PSC = new ParameterSensitivityParameterCalculator<>(PVCSDC);
private static final ParameterSensitivityMulticurveDiscountInterpolatedFDCalculator PSC_DSC_FD = new ParameterSensitivityMulticurveDiscountInterpolatedFDCalculator(PVDC, SHIFT);
private static final ParSpreadMarketQuoteDiscountingCalculator PSMQDC = ParSpreadMarketQuoteDiscountingCalculator.getInstance();
private static final ParSpreadRateDiscountingCalculator PSRDC = ParSpreadRateDiscountingCalculator.getInstance();
private static final double TOLERANCE_PV = 1.0E-2;
private static final double TOLERANCE_PV_DELTA = 1.0E+2;
private static final double TOLERANCE_RATE = 1.0E-8;
@Test
public void presentValueFromPrice() {
final double price = 0.99895;
final MultipleCurrencyAmount pv = METHOD_TRANSACTION.presentValueFromPrice(FUTURE_TRANSACTION, price);
final double pvExpected = (price - FUTURE_TRANSACTION.getReferencePrice()) * FUTURE_SECURITY_DEFINITION.getNotional() * FUTURE_SECURITY_DEFINITION.getMarginAccrualFactor() * QUANTITY;
assertEquals("Federal Funds Future transaction: present value", pvExpected, pv.getAmount(USD), TOLERANCE_PV);
}
@Test
public void presentValue() {
final MultipleCurrencyAmount pv = METHOD_TRANSACTION.presentValue(FUTURE_TRANSACTION, MULTICURVES);
final double price = METHOD_SECURITY.price(FUTURE_SECURITY, MULTICURVES);
final MultipleCurrencyAmount pvExpected = METHOD_TRANSACTION.presentValueFromPrice(FUTURE_TRANSACTION, price);
assertEquals("Federal Funds Future transaction: present value", pvExpected.getAmount(USD), pv.getAmount(USD), TOLERANCE_PV);
}
@Test
public void presentValueCurveSensitivity() {
final MultipleCurrencyParameterSensitivity pvpsDepositExact = PSC.calculateSensitivity(FUTURE_TRANSACTION, MULTICURVES, MULTICURVES.getAllNames());
final MultipleCurrencyParameterSensitivity pvpsDepositFD = PSC_DSC_FD.calculateSensitivity(FUTURE_TRANSACTION, MULTICURVES);
AssertSensitivityObjects.assertEquals("FederalFundsFutureTransactionDiscountingMethod: presentValueCurveSensitivity ", pvpsDepositExact, pvpsDepositFD, TOLERANCE_PV_DELTA);
}
@Test
/**
* Test the par spread to market quotes.
*/
public void parSpreadMarketQuote() {
final double parSpreadMQ = FUTURE_TRANSACTION.accept(PSMQDC, MULTICURVES);
final FederalFundsFutureTransaction futures0 = new FederalFundsFutureTransaction(FUTURE_SECURITY, QUANTITY, FUTURE_TRANSACTION.getReferencePrice() + parSpreadMQ);
final MultipleCurrencyAmount pv0 = METHOD_TRANSACTION.presentValue(futures0, MULTICURVES);
assertEquals("FederalFundsFutureTransactionDiscountingMethod: par spread market quote", pv0.getAmount(USD), 0, TOLERANCE_PV);
}
@Test
/**
* Test the par spread to rate.
*/
public void parSpreadRate() {
final double parSpreadRate = FUTURE_TRANSACTION.accept(PSRDC, MULTICURVES);
final double parSpreadMQ = FUTURE_TRANSACTION.accept(PSMQDC, MULTICURVES);
assertEquals("FederalFundsFutureTransactionDiscountingMethod: par spread market quote", -parSpreadMQ, parSpreadRate, TOLERANCE_RATE);
}
}