/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.interestrate.curve; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.analytics.math.curve.ConstantDoublesCurve; import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve; import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolatorFactory; import com.opengamma.analytics.math.interpolation.Interpolator1D; import com.opengamma.analytics.math.interpolation.Interpolator1DFactory; import com.opengamma.util.test.TestGroup; /** * Test {@link YieldSimpleCurve} */ @Test(groups = TestGroup.UNIT) public class YieldSimpleCurveTest { private static final Interpolator1D INTERPOLATOR_LINEAR = CombinedInterpolatorExtrapolatorFactory.getInterpolator( Interpolator1DFactory.LINEAR, Interpolator1DFactory.FLAT_EXTRAPOLATOR, Interpolator1DFactory.FLAT_EXTRAPOLATOR); private static final double[] TIME = new double[] {1.0, 2.0, 2.5, 3}; private static final int NB_TIME = TIME.length; private static final double[] YIELD = new double[] {0.01, 0.02, 0.02, 0.01}; private static final InterpolatedDoublesCurve RATE = InterpolatedDoublesCurve.from(TIME, YIELD, INTERPOLATOR_LINEAR); private static final String NAME = "SimpleRate"; private static final YieldAndDiscountCurve CURVE = new YieldSimpleCurve(NAME, RATE); private static final double CST = 0.01; private static final YieldAndDiscountCurve CURVE_CST = new YieldSimpleCurve(NAME, ConstantDoublesCurve.from(CST, NAME)); private static final double[] TIME_TEST = {0.5, 1.0, 1.0001, 2.5, 2.70, 3.0, 4.0 }; private static final int NB_TEST = TIME_TEST.length; private static final double TOLERANCE_RATE = 1.0E-10; private static final double TOLERANCE_SENSI = 1.0E-8; @Test(expectedExceptions = IllegalArgumentException.class) public void curve() { new YieldSimpleCurve(NAME, null); } @Test public void discountFactor() { for (int loopt = 0; loopt < NB_TEST; loopt++) { double r = RATE.getYValue(TIME_TEST[loopt]); double df = 1.0d / (1.0d + TIME_TEST[loopt] * r); assertEquals("YieldSimpleCurve: discount factor", df, CURVE.getDiscountFactor(TIME_TEST[loopt]), TOLERANCE_RATE); } } @Test public void continouslyCoompoundedRate() { for (int loopt = 0; loopt < NB_TEST; loopt++) { double df = CURVE.getDiscountFactor(TIME_TEST[loopt]); double rcc = -1.0d / TIME_TEST[loopt] * Math.log(df); assertEquals("YieldSimpleCurve: discount factor", rcc, CURVE.getInterestRate(TIME_TEST[loopt]), TOLERANCE_RATE); } } @Test public void numberParameters() { assertEquals("YieldSimpleCurve: parameters", CURVE.getNumberOfParameters(), RATE.size()); } @Test public void interestRateParameterSensitivity() { double shift = 1.0E-6; for (int looptest = 0; looptest < NB_TEST; looptest++) { double[] sensiComputed = CURVE.getInterestRateParameterSensitivity(TIME_TEST[looptest]); for (int loopnode = 0; loopnode < NB_TIME; loopnode++) { double[] rateBumpedPlus = YIELD.clone(); rateBumpedPlus[loopnode] += shift; InterpolatedDoublesCurve interpPlus = InterpolatedDoublesCurve.from(TIME, rateBumpedPlus, INTERPOLATOR_LINEAR); YieldAndDiscountCurve curvePlus = new YieldSimpleCurve(NAME, interpPlus); double rccPlus = curvePlus.getInterestRate(TIME_TEST[looptest]); double[] rateBumpedMinus = YIELD.clone(); rateBumpedMinus[loopnode] -= shift; InterpolatedDoublesCurve interpMinus = InterpolatedDoublesCurve .from(TIME, rateBumpedMinus, INTERPOLATOR_LINEAR); YieldAndDiscountCurve curveMinus = new YieldSimpleCurve(NAME, interpMinus); double rccMinus = curveMinus.getInterestRate(TIME_TEST[looptest]); double sensiFD = (rccPlus - rccMinus) / (2 * shift); assertEquals("YieldSimpleCurve: ParameterSensitivity", sensiFD, sensiComputed[loopnode], TOLERANCE_SENSI); } } } @Test public void interestRateParameterSensitivityCst() { double shift = 1.0E-6; for (int looptest = 0; looptest < NB_TEST; looptest++) { double[] sensiComputed = CURVE_CST.getInterestRateParameterSensitivity(TIME_TEST[looptest]); assertEquals("YieldSimpleCurve: ParameterSensitivity", 1, sensiComputed.length); YieldAndDiscountCurve curvePlus = new YieldSimpleCurve(NAME, ConstantDoublesCurve.from(CST + shift)); double rccPlus = curvePlus.getInterestRate(TIME_TEST[looptest]); YieldAndDiscountCurve curveMinus = new YieldSimpleCurve(NAME, ConstantDoublesCurve.from(CST - shift)); double rccMinus = curveMinus.getInterestRate(TIME_TEST[looptest]); double sensiFD = (rccPlus - rccMinus) / (2 * shift); assertEquals("YieldSimpleCurve: ParameterSensitivity", sensiFD, sensiComputed[0], TOLERANCE_SENSI); } } }