/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.curve;
import static com.opengamma.strata.basics.date.DayCounts.ACT_365F;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.market.ValueType;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolator;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolators;
import com.opengamma.strata.market.param.LabelDateParameterMetadata;
import com.opengamma.strata.market.param.ParameterMetadata;
import com.opengamma.strata.market.param.UnitParameterSensitivity;
/**
* Test {@link AddFixedCurve}.
*/
@Test
public class AddFixedCurveTest {
private static final String NAME_FIXED = "FixedCurve";
private static final String NAME_SPREAD = "SpreadCurve";
private static final CurveName FIXED_CURVE_NAME = CurveName.of(NAME_FIXED);
private static final CurveName SPREAD_CURVE_NAME = CurveName.of(NAME_SPREAD);
private static final CurveMetadata METADATA_FIXED = Curves.zeroRates(FIXED_CURVE_NAME, ACT_365F);
private static final String LABEL_1 = "Node1";
private static final String LABEL_2 = "Node2";
private static final String LABEL_3 = "Node3";
private static final List<ParameterMetadata> PARAM_METADATA_SPREAD = new ArrayList<>();
static {
PARAM_METADATA_SPREAD.add(LabelDateParameterMetadata.of(LocalDate.of(2015, 1, 1), LABEL_1));
PARAM_METADATA_SPREAD.add(LabelDateParameterMetadata.of(LocalDate.of(2015, 2, 1), LABEL_2));
PARAM_METADATA_SPREAD.add(LabelDateParameterMetadata.of(LocalDate.of(2015, 3, 1), LABEL_3));
}
private static final CurveMetadata METADATA_SPREAD = DefaultCurveMetadata.builder()
.curveName(SPREAD_CURVE_NAME)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ZERO_RATE)
.dayCount(ACT_365F)
.parameterMetadata(PARAM_METADATA_SPREAD)
.build();
private static final DoubleArray XVALUES_FIXED = DoubleArray.of(1d, 2d, 3d, 4d);
private static final DoubleArray YVALUES_FIXED = DoubleArray.of(0.05d, 0.07d, 0.08d, 0.09d);
private static final DoubleArray XVALUES_SPREAD = DoubleArray.of(1.5d, 2.5d, 4.5d);
private static final DoubleArray YVALUES_SPREAD = DoubleArray.of(0.04d, 0.045d, 0.05d);
private static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR;
private static final double[] X_SAMPLE = {0.5d, 1.0d, 1.5d, 1.75d, 10.0d};
private static final int NB_X_SAMPLE = X_SAMPLE.length;
private static final InterpolatedNodalCurve FIXED_CURVE =
InterpolatedNodalCurve.of(METADATA_FIXED, XVALUES_FIXED, YVALUES_FIXED, INTERPOLATOR);
private static final InterpolatedNodalCurve SPREAD_CURVE =
InterpolatedNodalCurve.of(METADATA_SPREAD, XVALUES_SPREAD, YVALUES_SPREAD, INTERPOLATOR);
private static final AddFixedCurve ADD_FIXED_CURVE = AddFixedCurve.of(FIXED_CURVE, SPREAD_CURVE);
private static final double TOLERANCE_Y = 1.0E-10;
public void test_invalid() {
// null fixed
assertThrowsIllegalArg(() -> AddFixedCurve.of(null, SPREAD_CURVE));
// null spread
assertThrowsIllegalArg(() -> AddFixedCurve.of(FIXED_CURVE, null));
}
public void getter() {
assertEquals(ADD_FIXED_CURVE.getMetadata(), METADATA_SPREAD);
assertEquals(ADD_FIXED_CURVE.getParameterCount(), XVALUES_SPREAD.size());
assertEquals(ADD_FIXED_CURVE.getParameter(0), ADD_FIXED_CURVE.getSpreadCurve().getParameter(0));
assertEquals(ADD_FIXED_CURVE.getParameterMetadata(0), ADD_FIXED_CURVE.getSpreadCurve().getParameterMetadata(0));
assertEquals(ADD_FIXED_CURVE.withParameter(0, 9d), AddFixedCurve.of(FIXED_CURVE, SPREAD_CURVE.withParameter(0, 9d)));
assertEquals(ADD_FIXED_CURVE.withPerturbation((i, v, m) -> v + 1d),
AddFixedCurve.of(FIXED_CURVE, SPREAD_CURVE.withPerturbation((i, v, m) -> v + 1d)));
assertEquals(ADD_FIXED_CURVE.withMetadata(METADATA_FIXED),
AddFixedCurve.of(FIXED_CURVE, SPREAD_CURVE.withMetadata(METADATA_FIXED)));
}
public void yValue() {
for (int i = 0; i < NB_X_SAMPLE; i++) {
double yComputed = ADD_FIXED_CURVE.yValue(X_SAMPLE[i]);
double yExpected = FIXED_CURVE.yValue(X_SAMPLE[i]) + SPREAD_CURVE.yValue(X_SAMPLE[i]);
assertEquals(yComputed, yExpected, TOLERANCE_Y);
}
}
public void firstDerivative() {
for (int i = 0; i < NB_X_SAMPLE; i++) {
double dComputed = ADD_FIXED_CURVE.firstDerivative(X_SAMPLE[i]);
double dExpected = FIXED_CURVE.firstDerivative(X_SAMPLE[i]) + SPREAD_CURVE.firstDerivative(X_SAMPLE[i]);
assertEquals(dComputed, dExpected, TOLERANCE_Y);
}
}
public void yParameterSensitivity() {
for (int i = 0; i < X_SAMPLE.length; i++) {
UnitParameterSensitivity dComputed = ADD_FIXED_CURVE.yValueParameterSensitivity(X_SAMPLE[i]);
UnitParameterSensitivity dExpected = SPREAD_CURVE.yValueParameterSensitivity(X_SAMPLE[i]);
assertTrue(dComputed.compareKey(dExpected) == 0);
assertTrue(dComputed.getSensitivity().equalWithTolerance(dExpected.getSensitivity(), TOLERANCE_Y));
}
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(ADD_FIXED_CURVE);
coverBeanEquals(ADD_FIXED_CURVE, AddFixedCurve.of(SPREAD_CURVE, FIXED_CURVE));
}
}