/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.curve; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve; import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurveYieldImplied; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve; import com.opengamma.analytics.math.curve.ConstantDoublesCurve; import com.opengamma.analytics.math.curve.FunctionalDoublesCurve; import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve; import com.opengamma.analytics.math.function.Function1D; import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolator; import com.opengamma.analytics.math.interpolation.DoubleQuadraticInterpolator1D; import com.opengamma.analytics.math.interpolation.FlatExtrapolator1D; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class ForwardCurveTest { private static final DoubleQuadraticInterpolator1D INTERPOLATOR_1D = new DoubleQuadraticInterpolator1D(); private static final CombinedInterpolatorExtrapolator EXTRAPOLATOR_1D = new CombinedInterpolatorExtrapolator(INTERPOLATOR_1D, new FlatExtrapolator1D()); private static double DRIFT = 0.05; private static final double[] EXPIRIES = new double[] {0.0, 7. / 365, 14 / 365., 21 / 365., 1 / 12., 3 / 12., 0.5, 0.75, 1, 5, 10 }; private static final double SPOT = 1.34; private static final double[] FORWARDS; private static final ForwardCurve FORWARD_CURVE; static { final int n = EXPIRIES.length; FORWARDS = new double[n]; for (int i = 0; i < n; i++) { FORWARDS[i] = SPOT * Math.exp(DRIFT * EXPIRIES[i]); } FORWARD_CURVE = new ForwardCurve(InterpolatedDoublesCurve.from(EXPIRIES, FORWARDS, EXTRAPOLATOR_1D)); } @Test public void testFlat() { final ForwardCurve fc = new ForwardCurve(SPOT); assertEquals(SPOT, fc.getForward(4.56), 1e-9); assertEquals(0.0, fc.getDrift(1.4), 1e-9); } @Test public void testConstDrift() { final ForwardCurve fc = new ForwardCurve(SPOT, DRIFT); final double t = 5.67; assertEquals(SPOT * Math.exp(t * DRIFT), fc.getForward(t), 1e-9); assertEquals(DRIFT, fc.getDrift(1.4), 1e-9); } @Test public void testFunctional() { final Function1D<Double, Double> f = new Function1D<Double, Double>() { @Override public Double evaluate(final Double t) { return SPOT * (1 + 0.1 * t); } }; final ForwardCurve fc = new ForwardCurve(FunctionalDoublesCurve.from(f)); final double t = 5.67; assertEquals(f.evaluate(t), fc.getForward(t), 1e-9); assertEquals(0.1 / (1 + 0.1 * t), fc.getDrift(t), 1e-9); } @Test public void testDriftCurve() { final ForwardCurve fc = new ForwardCurve(SPOT, ConstantDoublesCurve.from(DRIFT)); final double t = 5.67; assertEquals(SPOT * Math.exp(t * DRIFT), fc.getForward(t), 1e-9); assertEquals(DRIFT, fc.getDrift(t), 1e-9); } @Test public void testTwoCurves() { final double rate = 0.05; final double cc = 0.02; final YieldAndDiscountCurve r = YieldCurve.from(ConstantDoublesCurve.from(rate)); final YieldAndDiscountCurve q = YieldCurve.from(ConstantDoublesCurve.from(cc)); final ForwardCurve fc = new ForwardCurveYieldImplied(SPOT, r, q); final double t = 5.67; assertEquals(SPOT * Math.exp(t * (rate - cc)), fc.getForward(t), 1e-9); assertEquals(rate - cc, fc.getDrift(t), 1e-9); } @Test public void testShift() { final double shift = 0.1; final ForwardCurve shifedCurve = FORWARD_CURVE.withFractionalShift(shift); assertEquals(SPOT * (1 + shift), shifedCurve.getSpot(), 0.0); for (int i = 0; i < EXPIRIES.length - 1; i++) { final double t = EXPIRIES[i]; assertEquals("time " + i, SPOT * (1 + shift) * Math.exp(DRIFT * t), shifedCurve.getForward(t), 1e-9); } } }