/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.inflation.provider;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.index.GeneratorAttributeIR;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedInflationMaster;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedInflationZeroCoupon;
import com.opengamma.analytics.financial.instrument.index.IndexPrice;
import com.opengamma.analytics.financial.instrument.swap.SwapFixedInflationZeroCouponDefinition;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.datasets.StandardDataSetsInflationGBP;
import com.opengamma.analytics.financial.interestrate.datasets.StandardDataSetsMulticurveUSD;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap;
import com.opengamma.analytics.financial.provider.calculator.inflation.PresentValueDiscountingInflationCalculator;
import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle;
import com.opengamma.analytics.financial.provider.description.inflation.InflationProviderDiscount;
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;
import com.opengamma.util.tuple.Pair;
/**
* Tests the zero coupon inflation discounting method.
*/
@Test(groups = TestGroup.UNIT)
public class SwapInflationZeroCouponDiscountingMethodE2ETest {
private static final IndexPrice[] INDEX_IBOR_LIST = StandardDataSetsInflationGBP.indexONArray();
private static final IndexPrice GBP_RPI_PRICE_INDEX = INDEX_IBOR_LIST[0];
private static final Calendar CALENDAR = StandardDataSetsMulticurveUSD.calendarArray()[0];
private static final Currency CUR = GBP_RPI_PRICE_INDEX.getCurrency();
private static final PresentValueDiscountingInflationCalculator PVDIC = PresentValueDiscountingInflationCalculator.getInstance();
// Test with standard data - harcoded numbers
private static final ZonedDateTime STD_REFERENCE_DATE = DateUtils.getUTCDate(2014, 4, 11);
private static final Pair<InflationProviderDiscount, CurveBuildingBlockBundle> MULTICURVE_PAIR_STD = StandardDataSetsInflationGBP.getCurvesGBPRpiAndSonia();
private static final InflationProviderDiscount INFLATION_MULTICURVE_STD = MULTICURVE_PAIR_STD.getFirst();
// Instrument description
private static final ZonedDateTime STD_ACCRUAL_START_DATE = DateUtils.getUTCDate(2014, 4, 2);
private static final double STD_NOTIONAL = 10000000; //-10m
private static final GeneratorAttributeIR RPI_GBP_ATTR = new GeneratorAttributeIR(Period.ofYears(5));
private static final GeneratorSwapFixedInflationZeroCoupon GENERATOR_INFLATION_SWAP = GeneratorSwapFixedInflationMaster.getInstance().getGenerator("UKRPI");
private static final double RATE_FIXED_LEG = 0.02506;
private static final SwapFixedInflationZeroCouponDefinition SWAP_DEFINITION = GENERATOR_INFLATION_SWAP.generateInstrument(STD_ACCRUAL_START_DATE, RATE_FIXED_LEG, STD_NOTIONAL, RPI_GBP_ATTR);
private static final ZonedDateTimeDoubleTimeSeries TS_PRICE_INDEX_USD_WITH_TODAY = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC(new ZonedDateTime[] {DateUtils.getUTCDate(2013, 12, 31),
DateUtils.getUTCDate(2014, 1, 31), DateUtils.getUTCDate(2014, 2, 28) }, new double[] {253.4, 252.6, 254.2 });
private static final InstrumentDerivative SWAP = convert(SWAP_DEFINITION);
// Data
private static final double STD_TOLERANCE_PV = 1.0e-2;
private static InstrumentDerivative convert(final InstrumentDefinition<?> instrument) {
InstrumentDerivative ird;
if (instrument instanceof SwapFixedInflationZeroCouponDefinition) {
final Annuity<? extends Payment> ird1 = ((SwapFixedInflationZeroCouponDefinition) instrument).getFirstLeg().toDerivative(STD_REFERENCE_DATE);
final Annuity<? extends Payment> ird2 = ((SwapFixedInflationZeroCouponDefinition) instrument).getSecondLeg().toDerivative(STD_REFERENCE_DATE, TS_PRICE_INDEX_USD_WITH_TODAY);
ird = new Swap<>(ird1, ird2);
}
else {
ird = instrument.toDerivative(STD_REFERENCE_DATE);
}
return ird;
}
@Test
/**
* Test different results with a standard set of data against hardcoded values. Can be used for platform testing or regression testing.
*/
public void presentValue() {
// Present Value
final MultipleCurrencyAmount pvComputed = SWAP.accept(PVDIC, INFLATION_MULTICURVE_STD);
final MultipleCurrencyAmount pvExpected = MultipleCurrencyAmount.of(Currency.GBP, -21922.072817862267);
assertEquals("ForwardRateAgreementDiscountingMethod: present value from standard curves", pvExpected.getAmount(CUR), pvComputed.getAmount(CUR), 5.00);
}
}