/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexIborMaster; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; import com.opengamma.analytics.financial.provider.curve.MulticurveCalibratedUSDDataSets; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.analytics.financial.schedule.ScheduleCalculator; import com.opengamma.analytics.util.time.TimeCalculator; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.convention.daycount.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; import com.opengamma.util.tuple.Pair; /** * Tests for the Utils function related to YieldAndDiscount curves and MulticurveProvider. */ @Test(groups = TestGroup.UNIT) public class YieldAndDiscountCurveUtilsTest { /** Calibrated curves **/ private static final Pair<MulticurveProviderDiscount, CurveBuildingBlockBundle> CURVE_PAIR = MulticurveCalibratedUSDDataSets.getCurvesUSD(); private static final IborIndex USDLIBOR6M = IndexIborMaster.getInstance().getIndex("USDLIBOR6M"); private static final IborIndex USDLIBOR3M = IndexIborMaster.getInstance().getIndex("USDLIBOR3M"); private static final MulticurveProviderDiscount MULTICURVE = CURVE_PAIR.getFirst(); private static final Calendar NYC = new MondayToFridayCalendar("NYC"); private static final ZonedDateTime CURVE_DATE = DateUtils.getUTCDate(2013, 6, 19); private static final double TOLERANCE_RATE = 1E-8; @Test public void forwardRateCurveTest() { final YieldAndDiscountCurve curve3M = MULTICURVE.getCurve(USDLIBOR3M); final ZonedDateTime fixingDate = DateUtils.getUTCDate(2013, 10, 28); final ZonedDateTime fixingPeriodStartDate = ScheduleCalculator.getAdjustedDate(fixingDate, USDLIBOR6M.getSpotLag(), NYC); final double fixingPeriodStartTime = TimeCalculator.getTimeBetween(CURVE_DATE, fixingPeriodStartDate); final ZonedDateTime fixingPeriodEndDate = ScheduleCalculator.getAdjustedDate(fixingDate, USDLIBOR6M, NYC); final double fixingPeriodEndTime = TimeCalculator.getTimeBetween(CURVE_DATE, fixingPeriodEndDate); final double accrualFixing = USDLIBOR6M.getDayCount().getDayCountFraction(fixingPeriodStartDate, fixingPeriodEndDate); final double dfStart = curve3M.getDiscountFactor(fixingPeriodStartTime); final double dfEnd = curve3M.getDiscountFactor(fixingPeriodEndTime); final double forwardExpected = (dfStart / dfEnd - 1.0d) / accrualFixing; final double forwardComputedCurve = YieldAndDiscountCurveUtils.forwardRateFromCurve(curve3M, CURVE_DATE, fixingDate, USDLIBOR6M, NYC); assertEquals("forwardRateCurve", forwardExpected, forwardComputedCurve, TOLERANCE_RATE); } @Test public void forwardRateProviderTest() { final YieldAndDiscountCurve curve3M = MULTICURVE.getCurve(USDLIBOR3M); final ZonedDateTime fixingDate = DateUtils.getUTCDate(2013, 10, 28); final ZonedDateTime fixingPeriodStartDate = ScheduleCalculator.getAdjustedDate(fixingDate, USDLIBOR3M.getSpotLag(), NYC); final double fixingPeriodStartTime = TimeCalculator.getTimeBetween(CURVE_DATE, fixingPeriodStartDate); final ZonedDateTime fixingPeriodEndDate = ScheduleCalculator.getAdjustedDate(fixingDate, USDLIBOR3M, NYC); final double fixingPeriodEndTime = TimeCalculator.getTimeBetween(CURVE_DATE, fixingPeriodEndDate); final double accrualFixing = USDLIBOR3M.getDayCount().getDayCountFraction(fixingPeriodStartDate, fixingPeriodEndDate); final double dfStart = curve3M.getDiscountFactor(fixingPeriodStartTime); final double dfEnd = curve3M.getDiscountFactor(fixingPeriodEndTime); final double forwardExpected = (dfStart / dfEnd - 1.0d) / accrualFixing; final double forwardComputedProvider = YieldAndDiscountCurveUtils.forwardRateFromProvider(MULTICURVE, CURVE_DATE, fixingDate, USDLIBOR3M, NYC); assertEquals("forwardRateProvider", forwardExpected, forwardComputedProvider, TOLERANCE_RATE); } @Test public void zeroCouponRatePeriodicTest() { final YieldAndDiscountCurve curve3M = MULTICURVE.getCurve(USDLIBOR3M); final ZonedDateTime paymentDate = DateUtils.getUTCDate(2013, 10, 28); final double timeCurve = TimeCalculator.getTimeBetween(CURVE_DATE, paymentDate); final double df = curve3M.getDiscountFactor(timeCurve); final DayCount dc = DayCounts.ACT_365; final double timeDc = dc.getDayCountFraction(CURVE_DATE, paymentDate); final int paymentPerYear = 4; final double rateExpected = paymentPerYear * (Math.pow(df, -1.0 / (paymentPerYear * timeDc)) - 1.0); final double rateComputed = YieldAndDiscountCurveUtils.zeroCouponRate(curve3M, CURVE_DATE, paymentDate, dc, paymentPerYear); assertEquals("zeroCouponRatePeriodic", rateExpected, rateComputed, TOLERANCE_RATE); } @Test public void zeroCouponRateContinuousTest() { final YieldAndDiscountCurve curve3M = MULTICURVE.getCurve(USDLIBOR3M); final ZonedDateTime paymentDate = DateUtils.getUTCDate(2013, 10, 28); final double timeCurve = TimeCalculator.getTimeBetween(CURVE_DATE, paymentDate); final double df = curve3M.getDiscountFactor(timeCurve); final DayCount dc = DayCounts.ACT_365; final double timeDc = dc.getDayCountFraction(CURVE_DATE, paymentDate); final double rateExpected = -Math.log(df) / timeDc; final double rateComputed = YieldAndDiscountCurveUtils.zeroCouponRate(curve3M, CURVE_DATE, paymentDate, dc, 0); assertEquals("zeroCouponRatePeriodic", rateExpected, rateComputed, TOLERANCE_RATE); } }