/** * Gets the curve name. * * @return the curve name */ public default CurveName getName() { return getMetadata().getCurveName(); }
@Override public UnitParameterSensitivity yValueParameterSensitivity(double x) { ImmutableList<ParameterMetadata> paramMeta = ImmutableList.of(getParameterMetadata(0)); return UnitParameterSensitivity.of(metadata.getCurveName(), paramMeta, SENSITIVITY); }
public void test_values() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); double x = 5.2; assertEquals(test.yValue(x), VALUE_FUNCTION.apply(PARAMETERS, x)); assertEquals(test.firstDerivative(x), DERIVATIVE_FUNCTION.apply(PARAMETERS, x)); assertEquals(test.yValueParameterSensitivity(x), UnitParameterSensitivity.of( METADATA.getCurveName(), METADATA.getParameterMetadata().get(), SENSITIVITY_FUNCTION.apply(PARAMETERS, x))); }
@Override public ConstantDiscountFactorCurve withParameter(int parameterIndex, double newValue) { return new ConstantDiscountFactorCurve(metadata.getCurveName().toString(), newValue); }
public void test_sensitivities() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); DoubleArray sensiVal = DoubleArray.of(1d, 2d, 3d); assertEquals(test.createParameterSensitivity(sensiVal), UnitParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), sensiVal)); assertEquals(test.createParameterSensitivity(USD, sensiVal), CurrencyParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), USD, sensiVal)); }
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_of() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); assertEquals(test.getValueFunction(), VALUE_FUNCTION); assertEquals(test.getDerivativeFunction(), DERIVATIVE_FUNCTION); assertEquals(test.getSensitivityFunction(), SENSITIVITY_FUNCTION); assertEquals(test.getMetadata(), METADATA); assertEquals(test.getName(), METADATA.getCurveName()); assertEquals(test.getParameter(2), PARAMETERS.get(2)); assertEquals(test.getParameterCount(), PARAMETERS.size()); assertEquals(test.getParameterMetadata(1), METADATA.getParameterMetadata(1)); assertEquals(test.getParameters(), PARAMETERS); }
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)); }
/** * Creates a curve as the sum of a base curve and a spread curve. * <p> * The metadata of the combined curve will be created form the base curve and spread curve. * * @param baseCurve the base curve * @param spreadCurve the spread curve * @return the combined curve */ public static CombinedCurve of(Curve baseCurve, Curve spreadCurve) { CurveMetadata baseMetadata = baseCurve.getMetadata(); CurveMetadata spreadMetadata = spreadCurve.getMetadata(); List<ParameterMetadata> paramMeta = Stream.concat( IntStream.range(0, baseCurve.getParameterCount()) .mapToObj(i -> baseCurve.getParameterMetadata(i)), IntStream.range(0, spreadCurve.getParameterCount()) .mapToObj(i -> spreadCurve.getParameterMetadata(i))) .collect(toImmutableList()); DefaultCurveMetadataBuilder metadataBuilder = DefaultCurveMetadata.builder() .curveName(baseCurve.getName().getName() + "+" + spreadMetadata.getCurveName().getName()) .xValueType(baseMetadata.getXValueType()) .yValueType(baseMetadata.getYValueType()) .parameterMetadata(paramMeta); if (baseMetadata.findInfo(CurveInfoType.DAY_COUNT).isPresent()) { metadataBuilder.addInfo( CurveInfoType.DAY_COUNT, baseMetadata.getInfo(CurveInfoType.DAY_COUNT)); } return of(baseCurve, spreadCurve, metadataBuilder.build()); }
public void regression() { double price = FUTURE_PRICER.price(FUTURE_PRODUCT, PROVIDER); assertEquals(price, 1.2106928633440506, TOL); PointSensitivities point = FUTURE_PRICER.priceSensitivity(FUTURE_PRODUCT, PROVIDER); CurrencyParameterSensitivities test = PROVIDER.parameterSensitivity(point); DoubleArray expectedIssuer = DoubleArray.of( -3.940585873921608E-4, -0.004161527192990392, -0.014331606019672717, -1.0229665443857998, -4.220553063715371, 0); DoubleArray actualIssuer = test.getSensitivity(METADATA_ISSUER.getCurveName(), USD).getSensitivity(); assertTrue(actualIssuer.equalWithTolerance(expectedIssuer, TOL)); DoubleArray expectedRepo = DoubleArray.of(0.14752541809405412, 0.20907575809356016, 0.0, 0.0, 0.0, 0.0); DoubleArray actualRepo = test.getSensitivity(METADATA_REPO.getCurveName(), USD).getSensitivity(); assertTrue(actualRepo.equalWithTolerance(expectedRepo, TOL)); }
public void test_load_all_curves() { ListMultimap<LocalDate, RatesCurveGroup> allGroups = RatesCurvesCsvLoader.loadAllDates( ResourceLocator.of(GROUPS_1), ResourceLocator.of(SETTINGS_1), ImmutableList.of(ResourceLocator.of(CURVES_1), ResourceLocator.of(CURVES_2), ResourceLocator.of(CURVES_3))); assertEquals(allGroups.size(), 2); assertCurves(allGroups.get(CURVE_DATE)); List<RatesCurveGroup> curves3 = allGroups.get(CURVE_DATE_CURVES_3); assertEquals(curves3.size(), 1); RatesCurveGroup group = curves3.get(0); // All curve points are set to 0 in test data to ensure these are really different curve instances Curve usdDisc = group.findDiscountCurve(Currency.USD).get(); InterpolatedNodalCurve usdDiscNodal = (InterpolatedNodalCurve) usdDisc; assertEquals(usdDiscNodal.getMetadata().getCurveName(), CurveName.of("USD-Disc")); assertTrue(usdDiscNodal.getYValues().equalZeroWithTolerance(0d)); Curve usd3ml = group.findForwardCurve(IborIndices.USD_LIBOR_3M).get(); InterpolatedNodalCurve usd3mlNodal = (InterpolatedNodalCurve) usd3ml; assertEquals(usd3mlNodal.getMetadata().getCurveName(), CurveName.of("USD-3ML")); assertTrue(usd3mlNodal.getYValues().equalZeroWithTolerance(0d)); }
public void regression_withZSpread_periodic() { double price = FUTURE_PRICER.priceWithZSpread(FUTURE_PRODUCT, PROVIDER, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); assertEquals(price, 1.1720190529653407, TOL); PointSensitivities point = FUTURE_PRICER.priceSensitivityWithZSpread(FUTURE_PRODUCT, PROVIDER, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); CurrencyParameterSensitivities test = PROVIDER.parameterSensitivity(point); DoubleArray expectedIssuer = DoubleArray.of( -3.9201229100932256E-4, -0.0041367134351306374, -0.014173323438217467, -0.9886444827927878, -4.07533109609094, 0); DoubleArray actualIssuer = test.getSensitivity(METADATA_ISSUER.getCurveName(), USD).getSensitivity(); assertTrue(actualIssuer.equalWithTolerance(expectedIssuer, TOL)); DoubleArray expectedRepo = DoubleArray.of(0.1428352116441475, 0.20242871054203687, 0.0, 0.0, 0.0, 0.0); DoubleArray actualRepo = test.getSensitivity(METADATA_REPO.getCurveName(), USD).getSensitivity(); assertTrue(actualRepo.equalWithTolerance(expectedRepo, TOL)); }
public void regressionCurveSensitivity() { double[] sensiDscExp = new double[] {0.0, 0.0, 0.0, 0.0, -1.1942174487944763E7, -1565567.6976298545}; double[] sensiFwdExp = new double[] {0.0, 0.0, 0.0, 0.0, -2.3978768078237808E8, 4.8392987803482056E8}; PointSensitivityBuilder point = PRICER.presentValueSensitivityRatesStickyModel(SWAPTION_PAY_LONG, RATE_PROVIDER, VOLS_REG); CurrencyParameterSensitivities sensi = RATE_PROVIDER.parameterSensitivity(point.build()); double[] sensiDscCmp = sensi.getSensitivity(SwaptionSabrRateVolatilityDataSet.META_DSC_EUR.getCurveName(), EUR) .getSensitivity().toArray(); double[] sensiFwdCmp = sensi.getSensitivity(SwaptionSabrRateVolatilityDataSet.META_FWD_EUR.getCurveName(), EUR) .getSensitivity().toArray(); assertTrue(DoubleArrayMath.fuzzyEquals(sensiDscCmp, sensiDscExp, TOL * NOTIONAL)); assertTrue(DoubleArrayMath.fuzzyEquals(sensiFwdCmp, sensiFwdExp, TOL * NOTIONAL)); }
public void regression() { CurrencyAmount pv = TRADE_PRICER.presentValue(FUTURE_TRADE, PROVIDER, SETTLE_PRICE); assertEquals(pv.getAmount(), -2937800.66334416, EPS * NOTIONAL * QUANTITY); PointSensitivities pvPoint = TRADE_PRICER.presentValueSensitivity(FUTURE_TRADE, PROVIDER); CurrencyParameterSensitivities test = PROVIDER.parameterSensitivity(pvPoint); DoubleArray expectedIssuer = DoubleArray.of( -48626.82968419264, -513532.4556150143, -1768520.182827613, -1.262340715772077E8, -5.208162480624767E8, 0); DoubleArray actualIssuer = test.getSensitivity(METADATA_ISSUER.getCurveName(), USD).getSensitivity(); assertTrue(actualIssuer.equalWithTolerance(expectedIssuer, TOL * NOTIONAL * QUANTITY)); DoubleArray expectedRepo = DoubleArray.of(1.8204636592806276E7, 2.5799948548745323E7, 0.0, 0.0, 0.0, 0.0); DoubleArray actualRepo = test.getSensitivity(METADATA_REPO.getCurveName(), USD).getSensitivity(); assertTrue(actualRepo.equalWithTolerance(expectedRepo, TOL * NOTIONAL * QUANTITY)); }
public void regression_withZSpread_periodic() { CurrencyAmount pv = TRADE_PRICER.presentValueWithZSpread( FUTURE_TRADE, PROVIDER, SETTLE_PRICE, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); assertEquals(pv.getAmount(), -7710148.864076961, EPS * NOTIONAL * QUANTITY); PointSensitivities pvPoint = TRADE_PRICER.presentValueSensitivityWithZSpread( FUTURE_TRADE, PROVIDER, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); CurrencyParameterSensitivities test = PROVIDER.parameterSensitivity(pvPoint); DoubleArray expectedIssuer = DoubleArray.of( -48374.31671055041, -510470.43789512076, -1748988.1122760356, -1.2199872917663E8, -5.0289585725762194E8, 0); DoubleArray actualIssuer = test.getSensitivity(METADATA_ISSUER.getCurveName(), USD).getSensitivity(); assertTrue(actualIssuer.equalWithTolerance(expectedIssuer, TOL * NOTIONAL * QUANTITY)); DoubleArray expectedRepo = DoubleArray.of(1.7625865116887797E7, 2.497970288088735E7, 0.0, 0.0, 0.0, 0.0); DoubleArray actualRepo = test.getSensitivity(METADATA_REPO.getCurveName(), USD).getSensitivity(); assertTrue(actualRepo.equalWithTolerance(expectedRepo, TOL * NOTIONAL * QUANTITY)); }
private void assertUsd3ml(Curve curve) { assertTrue(curve instanceof InterpolatedNodalCurve); InterpolatedNodalCurve nodalCurve = (InterpolatedNodalCurve) curve; assertEquals(nodalCurve.getMetadata().getCurveName(), CurveName.of("USD-3ML"));
@Test public void sensitivity_legalEntity_Simple() { CurrencyParameterSensitivities sensiComputed = FD_CALCULATOR.sensitivity( LegalEntityDiscountingProviderDataSets.ISSUER_REPO_SIMPLE, this::fn); DoubleArray timeIssuer = LegalEntityDiscountingProviderDataSets.ISSUER_TIME_USD; DoubleArray timesRepo = LegalEntityDiscountingProviderDataSets.REPO_TIME_USD; assertEquals(sensiComputed.size(), 2); DoubleArray sensiIssuer = sensiComputed.getSensitivity( LegalEntityDiscountingProviderDataSets.META_SIMPLE_ISSUER_USD.getCurveName(), USD).getSensitivity(); assertEquals(sensiIssuer.size(), timeIssuer.size()); for (int i = 0; i < timeIssuer.size(); i++) { assertEquals(timeIssuer.get(i), sensiIssuer.get(i), TOLERANCE_DELTA); } DoubleArray sensiRepo = sensiComputed.getSensitivity( LegalEntityDiscountingProviderDataSets.META_SIMPLE_REPO_USD.getCurveName(), USD).getSensitivity(); assertEquals(sensiRepo.size(), timesRepo.size()); for (int i = 0; i < timesRepo.size(); i++) { assertEquals(timesRepo.get(i), sensiRepo.get(i), TOLERANCE_DELTA); } }
@Test public void sensitivity_legalEntity_Zero() { CurrencyParameterSensitivities sensiComputed = FD_CALCULATOR.sensitivity( LegalEntityDiscountingProviderDataSets.ISSUER_REPO_ZERO, this::fn); DoubleArray timeIssuer = LegalEntityDiscountingProviderDataSets.ISSUER_TIME_USD; DoubleArray timesRepo = LegalEntityDiscountingProviderDataSets.REPO_TIME_USD; assertEquals(sensiComputed.size(), 2); DoubleArray sensiIssuer = sensiComputed.getSensitivity( LegalEntityDiscountingProviderDataSets.META_ZERO_ISSUER_USD.getCurveName(), USD).getSensitivity(); assertEquals(sensiIssuer.size(), timeIssuer.size()); for (int i = 0; i < timeIssuer.size(); i++) { assertEquals(timeIssuer.get(i), sensiIssuer.get(i), TOLERANCE_DELTA); } DoubleArray sensiRepo = sensiComputed.getSensitivity( LegalEntityDiscountingProviderDataSets.META_ZERO_REPO_USD.getCurveName(), USD).getSensitivity(); assertEquals(sensiRepo.size(), timesRepo.size()); for (int i = 0; i < timesRepo.size(); i++) { assertEquals(timesRepo.get(i), sensiRepo.get(i), TOLERANCE_DELTA); } }
public void test_of_noMetadata() { List<ParameterMetadata> combinedParamMeta = new ArrayList<>(); combinedParamMeta.addAll(PARAM_METADATA_BASE); combinedParamMeta.addAll(PARAM_METADATA_SPREAD); CurveMetadata expectedMetadata = DefaultCurveMetadata.builder() .curveName(BASE_NAME + "+" + SPREAD_NAME) .xValueType(YEAR_FRACTION) .yValueType(ZERO_RATE) .dayCount(ACT_365F) .parameterMetadata(combinedParamMeta) .build(); assertEquals(COMBINED_CURVE.getBaseCurve(), BASE_CURVE); assertEquals(COMBINED_CURVE.getSpreadCurve(), SPREAD_CURVE); assertEquals(COMBINED_CURVE.getMetadata(), expectedMetadata); assertEquals(COMBINED_CURVE.getName(), expectedMetadata.getCurveName()); assertEquals( COMBINED_CURVE.getParameterCount(), BASE_CURVE.getParameterCount() + SPREAD_CURVE.getParameterCount()); assertEquals(COMBINED_CURVE.getParameter(1), BASE_CURVE.getParameter(1)); assertEquals(COMBINED_CURVE.getParameter(6), SPREAD_CURVE.getParameter(3)); assertEquals(COMBINED_CURVE.getParameterMetadata(0), BASE_CURVE.getParameterMetadata(0)); assertEquals(COMBINED_CURVE.getParameterMetadata(4), SPREAD_CURVE.getParameterMetadata(1)); }