/** * 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.collect.TestHelper.assertSerialization; import static com.opengamma.strata.collect.TestHelper.coverBeanEquals; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; import org.testng.annotations.Test; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.market.ShiftType; import com.opengamma.strata.market.curve.interpolator.CurveInterpolators; import com.opengamma.strata.market.param.LabelParameterMetadata; import com.opengamma.strata.market.param.ParameterMetadata; import com.opengamma.strata.market.param.UnitParameterSensitivity; @Test public class ParallelShiftedCurveTest { private static final CurveMetadata METADATA = DefaultCurveMetadata.of("Test"); private static final Curve CONSTANT_CURVE = ConstantCurve.of(METADATA, 3d); private static final Curve CONSTANT_CURVE2 = ConstantCurve.of(METADATA, 5d); //------------------------------------------------------------------------- public void absolute() { ParallelShiftedCurve test = ParallelShiftedCurve.absolute(CONSTANT_CURVE, 1d); assertThat(test.getUnderlyingCurve()).isEqualTo(CONSTANT_CURVE); assertThat(test.getShiftType()).isEqualTo(ShiftType.ABSOLUTE); assertThat(test.getShiftAmount()).isEqualTo(1d); assertThat(test.getMetadata()).isEqualTo(METADATA); assertThat(test.getName()).isEqualTo(METADATA.getCurveName()); assertThat(test.getParameterCount()).isEqualTo(2); assertThat(test.getParameter(0)).isEqualTo(3d); assertThat(test.getParameter(1)).isEqualTo(1d); assertThat(test.getParameterMetadata(0)).isEqualTo(ParameterMetadata.empty()); assertThat(test.getParameterMetadata(1)).isEqualTo(LabelParameterMetadata.of("AbsoluteShift")); assertThat(test.withParameter(0, 5d)).isEqualTo(ParallelShiftedCurve.absolute(CONSTANT_CURVE2, 1d)); assertThat(test.withParameter(1, 0.5d)).isEqualTo(ParallelShiftedCurve.absolute(CONSTANT_CURVE, 0.5d)); assertThat(test.withPerturbation((i, v, m) -> v + 2d)).isEqualTo(ParallelShiftedCurve.absolute(CONSTANT_CURVE2, 3d)); assertThat(test.yValue(0)).isEqualTo(4d); assertThat(test.yValue(1)).isEqualTo(4d); } public void relative() { ParallelShiftedCurve test = ParallelShiftedCurve.relative(CONSTANT_CURVE, 0.1d); assertThat(test.getUnderlyingCurve()).isEqualTo(CONSTANT_CURVE); assertThat(test.getShiftType()).isEqualTo(ShiftType.RELATIVE); assertThat(test.getShiftAmount()).isEqualTo(0.1d); assertThat(test.getMetadata()).isEqualTo(METADATA); assertThat(test.getName()).isEqualTo(METADATA.getCurveName()); assertThat(test.getParameterCount()).isEqualTo(2); assertThat(test.getParameter(0)).isEqualTo(3d); assertThat(test.getParameter(1)).isEqualTo(0.1d); assertThat(test.getParameterMetadata(0)).isEqualTo(ParameterMetadata.empty()); assertThat(test.getParameterMetadata(1)).isEqualTo(LabelParameterMetadata.of("RelativeShift")); assertThat(test.withParameter(0, 5d)).isEqualTo(ParallelShiftedCurve.relative(CONSTANT_CURVE2, 0.1d)); assertThat(test.withParameter(1, 0.5d)).isEqualTo(ParallelShiftedCurve.relative(CONSTANT_CURVE, 0.5d)); assertThat(test.withPerturbation((i, v, m) -> v + 2d)).isEqualTo(ParallelShiftedCurve.relative(CONSTANT_CURVE2, 2.1d)); assertThat(test.yValue(0)).isEqualTo(3.3d, offset(1e-10d)); assertThat(test.yValue(1)).isEqualTo(3.3d, offset(1e-10d)); } public void test_of() { Curve test = ParallelShiftedCurve.of(CONSTANT_CURVE, ShiftType.RELATIVE, 0.1d); assertThat(test.yValue(0)).isEqualTo(3.3d, offset(1e-10)); assertThat(test.yValue(1)).isEqualTo(3.3d, offset(1e-10)); assertThat(test.getName()).isEqualTo(METADATA.getCurveName()); assertThat(test.getParameterCount()).isEqualTo(2); assertThat(test.getParameter(0)).isEqualTo(3d); assertThat(test.getParameter(1)).isEqualTo(0.1d); assertThat(test.getParameterMetadata(0)).isEqualTo(ParameterMetadata.empty()); assertThat(test.getParameterMetadata(1)).isEqualTo(LabelParameterMetadata.of("RelativeShift")); assertThat(test.getMetadata()).isEqualTo(METADATA); } //------------------------------------------------------------------------- public void test_yValueParameterSensitivity() { InterpolatedNodalCurve curve = InterpolatedNodalCurve.of( METADATA, DoubleArray.of(0, 1), DoubleArray.of(2, 2.5), CurveInterpolators.LINEAR); Curve absoluteShiftedCurve = ParallelShiftedCurve.absolute(curve, 1); Curve relativeShiftedCurve = ParallelShiftedCurve.relative(curve, 0.2); UnitParameterSensitivity expected = curve.yValueParameterSensitivity(0.1); assertThat(absoluteShiftedCurve.yValueParameterSensitivity(0.1)).isEqualTo(expected); assertThat(relativeShiftedCurve.yValueParameterSensitivity(0.1)).isEqualTo(expected); } public void test_firstDerivative() { InterpolatedNodalCurve curve = InterpolatedNodalCurve.of( METADATA, DoubleArray.of(0, 1), DoubleArray.of(2, 2.5), CurveInterpolators.LINEAR); Curve absoluteShiftedCurve = ParallelShiftedCurve.absolute(curve, 1); Curve relativeShiftedCurve = ParallelShiftedCurve.relative(curve, 0.2); assertThat(curve.firstDerivative(0.1)).isEqualTo(0.5); assertThat(absoluteShiftedCurve.firstDerivative(0.1)).isEqualTo(0.5); assertThat(relativeShiftedCurve.firstDerivative(0.1)).isEqualTo(0.5 * 1.2); } //------------------------------------------------------------------------- public void coverage() { ParallelShiftedCurve test = ParallelShiftedCurve.absolute(CONSTANT_CURVE, 1); coverImmutableBean(test); ParallelShiftedCurve test2 = ParallelShiftedCurve.relative(CONSTANT_CURVE2, 0.2); coverBeanEquals(test, test2); } public void test_serialization() { ParallelShiftedCurve test = ParallelShiftedCurve.absolute(CONSTANT_CURVE, 1); assertSerialization(test); } }