/**
* Copyright (C) 2009 - 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.interpolation.LinearInterpolator1D;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class YieldAndDiscountAddZeroSpreadCurveTest {
private static final double[] TIME_YIELD = new double[] {1, 2, 2.5, 3};
private static final double[] TIME_DSC = new double[] {1, 2, 3};
private static final InterpolatedDoublesCurve R = InterpolatedDoublesCurve.from(TIME_YIELD, new double[] {0.03, 0.04, 0.04, 0.05}, new LinearInterpolator1D());
private static final InterpolatedDoublesCurve DF = InterpolatedDoublesCurve.from(TIME_DSC, new double[] {Math.exp(-0.03), Math.exp(-0.08), Math.exp(-0.15)}, new LinearInterpolator1D());
private static final YieldCurve YIELD = YieldCurve.from(R);
private static final DiscountCurve DISCOUNT = DiscountCurve.from(DF);
private static final YieldAndDiscountAddZeroSpreadCurve ZERO_ADD_SPREAD = new YieldAndDiscountAddZeroSpreadCurve("Spread", false, YIELD, DISCOUNT);
private static final double TOLERANCE_RATE = 1.0E-10;
@Test
/**
* Test the number of parameters.
*/
public void numberOfParameters() {
assertEquals("YieldAndDiscountAddZeroSpreadCurve: number of parameters", YIELD.getNumberOfParameters() + DISCOUNT.getNumberOfParameters(), ZERO_ADD_SPREAD.getNumberOfParameters(), TOLERANCE_RATE);
}
@Test
/**
* Test the interest rate for the spread curve.
*/
public void interestRate() {
int nbPt = 20;
YieldAndDiscountAddZeroSpreadCurve zeroSpreadSubstract = new YieldAndDiscountAddZeroSpreadCurve("Spread substract", true, YIELD, DISCOUNT);
for (int looppt = 0; looppt <= nbPt; looppt++) {
double time = TIME_YIELD[0] + looppt * (TIME_YIELD[TIME_YIELD.length - 1] - TIME_YIELD[0]) / nbPt;
assertEquals("YieldAndDiscountAddZeroSpreadCurve: zc rate ", YIELD.getInterestRate(time) + DISCOUNT.getInterestRate(time), ZERO_ADD_SPREAD.getInterestRate(time), TOLERANCE_RATE);
assertEquals("YieldAndDiscountAddZeroSpreadCurve: zc rate ", YIELD.getInterestRate(time) - DISCOUNT.getInterestRate(time), zeroSpreadSubstract.getInterestRate(time), TOLERANCE_RATE);
}
}
@Test
/**
* Test the parameter sensitivity.
*/
public void parameterSensitivity() {
int nbPt = 20;
YieldAndDiscountAddZeroSpreadCurve zeroSpreadSubstract = new YieldAndDiscountAddZeroSpreadCurve("Spread substract", true, YIELD, DISCOUNT);
int nbYield = YIELD.getNumberOfParameters();
int nbDsc = DISCOUNT.getNumberOfParameters();
for (int looppt = 0; looppt <= nbPt; looppt++) {
double time = TIME_YIELD[0] + looppt * (TIME_YIELD[TIME_YIELD.length - 1] - TIME_YIELD[0]) / nbPt;
double[] sensiAddSpread = ZERO_ADD_SPREAD.getInterestRateParameterSensitivity(time);
double[] sensiSubSpread = zeroSpreadSubstract.getInterestRateParameterSensitivity(time);
assertEquals("YieldAndDiscountAddZeroSpreadCurve: nb sensitivity to parameters - add", nbYield + nbDsc, sensiAddSpread.length);
assertEquals("YieldAndDiscountAddZeroSpreadCurve: nb sensitivity to parameters - substract", nbYield + nbDsc, sensiSubSpread.length);
double[] sensiYield = YIELD.getInterestRateParameterSensitivity(time);
double[] sensiDsc = DISCOUNT.getInterestRateParameterSensitivity(time);
for (int loops = 0; loops < nbYield; loops++) {
assertEquals("YieldAndDiscountAddZeroSpreadCurve: sensitivity to parameters - add " + loops, sensiYield[loops], sensiAddSpread[loops], TOLERANCE_RATE);
assertEquals("YieldAndDiscountAddZeroSpreadCurve: sensitivity to parameters- substract " + loops, sensiYield[loops], sensiSubSpread[loops], TOLERANCE_RATE);
}
for (int loops = 0; loops < nbDsc; loops++) {
assertEquals("YieldAndDiscountAddZeroSpreadCurve: sensitivity to parameters - add " + loops, sensiDsc[loops], sensiAddSpread[loops + nbYield], TOLERANCE_RATE);
assertEquals("YieldAndDiscountAddZeroSpreadCurve: sensitivity to parameters- substract " + loops, sensiDsc[loops], sensiSubSpread[loops + nbYield], TOLERANCE_RATE);
}
}
}
}