/**
* Copyright (C) 2011 - 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.util.test.TestGroup;
/**
* Tests related to the seasonal curve. Usually used in a multiplicative way for PriceIndexCurve construction.
*/
@Test(groups = TestGroup.UNIT)
public class SeasonalCurveTest {
//TODO: seasonal curve have been modified, so this test have to be modified.
final static double[] MONTHLY_FACTORS = new double[] {1.0010, 1.0010, 1.0020, 0.9990, 0.9990, 0.9990, 0.9990, 1.0000, 1.0010, 1.0010, 1.005 };
static double[] STEPS = new double[] {0.0, 1.0 / 12, 2.0 / 12, 3.0 / 12, 4.0 / 12, 5.0 / 12, 6.0 / 12, 7.0 / 12, 8.0 / 12, 9.0 / 12, 10.0 / 12, 11.0 / 12, 12.0 / 12, 13.0 / 12,
14.0 / 12, 15.0 / 12, 16.0 / 12, 17.0 / 12, 18.0 / 12, 19.0 / 12, 20.0 / 12, 21.0 / 12, 22.0 / 12, 23.0 / 12, 24.0 / 12, 25.0 / 12, 26.0 / 12, 27.0 / 12, 28.0 / 12,
29.0 / 12, 30.0 / 12, 31.0 / 12, 32.0 / 12, 33.0 / 12, 34.0 / 12, 35.0 / 12, 36.0 / 12, 37.0 / 12, 38.0 / 12, 39.0 / 12, 40.0 / 12, 41.0 / 12, 42.0 / 12, 43.0 / 12,
44.0 / 12, 45.0 / 12, 46.0 / 12, 47.0 / 12, 48.0 / 12, 49.0 / 12, 50.0 / 12, 51.0 / 12, 52.0 / 12, 53.0 / 12, 54.0 / 12, 55.0 / 12, 56.0 / 12, 57.0 / 12, 58.0 / 12,
59.0 / 12, 60.0 / 12, 61.0 / 12, 62.0 / 12 };
final static SeasonalCurve SEASONAL_CURVE = new SeasonalCurve(STEPS, MONTHLY_FACTORS, false);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSteps() {
new SeasonalCurve(null, MONTHLY_FACTORS, false);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullFactor() {
new SeasonalCurve(STEPS, null, false);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testIncorrectNbFactor() {
new SeasonalCurve(STEPS, new double[10], false);
}
@Test
public void valuesXYearAppart() {
double[] time = new double[] {0.25, 1.45 };
double[] shift = new double[] {1.0, 2.0, 3.0 }; // Shift in years
for (int looptime = 0; looptime < time.length; looptime++) {
for (int loopshift = 0; loopshift < shift.length; loopshift++) {
assertEquals("Values x years appart", SEASONAL_CURVE.getFunction().evaluate(time[looptime]), SEASONAL_CURVE.getFunction().evaluate(time[looptime] + shift[loopshift]), 1.0E-10);
}
}
}
@Test
public void values() {
double[] factors = new double[12];
double product = 1;
for (int looptime = 0; looptime < 11; looptime++) {
factors[looptime] = MONTHLY_FACTORS[looptime];
product = product * MONTHLY_FACTORS[looptime];
}
factors[11] = 1 / product;
double[] cumulativeFactors = new double[12];
cumulativeFactors[0] = 1.0;
for (int loopmonth = 1; loopmonth < 12; loopmonth++) {
cumulativeFactors[loopmonth] = cumulativeFactors[loopmonth - 1] * factors[loopmonth - 1];
}
for (int looptime = 0; looptime < 12; looptime++) {
assertEquals("Values x month appart " + looptime + "-" + 1, SEASONAL_CURVE.getFunction().evaluate(looptime / 12.0),
cumulativeFactors[looptime], 1.0E-10);
}
}
@Test
public void valuesMonthly() {
double[] factors = new double[12];
double product = 1;
for (int looptime = 0; looptime < 11; looptime++) {
factors[looptime] = MONTHLY_FACTORS[looptime];
product = product * MONTHLY_FACTORS[looptime];
}
factors[11] = 1 / product;
for (int looptime = 0; looptime < STEPS.length - 1; looptime++) {
double x = SEASONAL_CURVE.getFunction().evaluate(looptime / 12.0);
assertEquals("Values x month appart " + looptime + "-" + 1, SEASONAL_CURVE.getFunction().evaluate(looptime / 12.0) * factors[looptime % 12],
SEASONAL_CURVE.getFunction().evaluate((looptime + 1) / 12.0), 1.0E-10);
}
}
}