/**
* Copyright (C) 2013 - 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.InterpolatedDoublesCurve;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.integration.RungeKuttaIntegrator1D;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class ForwardRateTest {
private static final RungeKuttaIntegrator1D INTEGRATOR = new RungeKuttaIntegrator1D();
private static final Interpolator1D INTERPOLATOR = Interpolator1DFactory.DOUBLE_QUADRATIC_INSTANCE;
private static final double[] T = new double[] {0.0, 0.05, 0.1, 0.2, 0.5, 1.0, 2, 3, 5, 7, 10 };
private static final double[] R = new double[] {0.01, 0.01, 0.012, 0.014, 0.02, 0.03, 0.03, 0.029, 0.024, 0.023, 0.02 };
private static final double[] P;
private static final YieldAndDiscountCurve YIELD_CURVE;
private static final YieldAndDiscountCurve DISCOUNT_CURVE;
static {
final int n = T.length;
P = new double[n];
for (int i = 0; i < n; i++) {
P[i] = Math.exp(-T[i] * R[i]);
}
final InterpolatedDoublesCurve ratesCurve = InterpolatedDoublesCurve.from(T, R, INTERPOLATOR);
final InterpolatedDoublesCurve disCurve = InterpolatedDoublesCurve.from(T, P, INTERPOLATOR);
YIELD_CURVE = new YieldCurve("yield curve", ratesCurve);
DISCOUNT_CURVE = new DiscountCurve("discount curve", disCurve);
}
@Test
public void test() {
final int n = T.length;
// final double range = T[n - 1] - T[0];
// for (int i = 0; i < 300; i++) {
// final double t = T[0] + (range) * i / (299.);
// final double r = YIELD_CURVE.getInterestRate(t);
// final double f = YIELD_CURVE.getForwardRate(t);
// System.out.println(t + "\t" + r + "\t" + f);
// }
final Function1D<Double, Double> fwd1 = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double t) {
return YIELD_CURVE.getForwardRate(t);
}
};
final Function1D<Double, Double> fwd2 = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double t) {
return DISCOUNT_CURVE.getForwardRate(t);
}
};
for (int i = 0; i < n; i++) {
final double df1 = Math.exp(-INTEGRATOR.integrate(fwd1, 0.0, T[i]));
final double df2 = Math.exp(-INTEGRATOR.integrate(fwd2, 0.0, T[i]));
assertEquals(P[i], df1, 1e-9);
assertEquals(P[i], df2, 1e-9);
}
}
}