@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return curve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return curve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return curve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return curve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return curve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { return spreadCurve.getParameterMetadata(parameterIndex); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { if (parameterIndex < baseCurve.getParameterCount()) { return baseCurve.getParameterMetadata(parameterIndex); } return spreadCurve.getParameterMetadata(parameterIndex - baseCurve.getParameterCount()); }
@Override public ParameterMetadata getParameterMetadata(int parameterIndex) { if (parameterIndex == underlyingCurve.getParameterCount()) { return LabelParameterMetadata.of(shiftType + "Shift"); } return underlyingCurve.getParameterMetadata(parameterIndex); }
/** * Creates a parameter sensitivity instance for this curve when the sensitivity values are known. * <p> * In most cases, {@link #yValueParameterSensitivity(double)} should be used and manipulated. * However, it can be useful to create a {@link UnitParameterSensitivity} from pre-computed sensitivity values. * * @param sensitivities the sensitivity values, which must match the parameter count of the curve * @return the sensitivity */ public default UnitParameterSensitivity createParameterSensitivity(DoubleArray sensitivities) { List<ParameterMetadata> paramMeta = IntStream.range(0, getParameterCount()) .mapToObj(i -> getParameterMetadata(i)) .collect(toImmutableList()); return UnitParameterSensitivity.of(getName(), paramMeta, sensitivities); }
/** * Creates a parameter sensitivity instance for this curve when the sensitivity values are known. * <p> * In most cases, {@link #yValueParameterSensitivity(double)} should be used and manipulated. * However, it can be useful to create a {@link CurrencyParameterSensitivity} from pre-computed sensitivity values. * * @param currency the currency * @param sensitivities the sensitivity values, which must match the parameter count of the curve * @return the sensitivity */ public default CurrencyParameterSensitivity createParameterSensitivity(Currency currency, DoubleArray sensitivities) { List<ParameterMetadata> paramMeta = IntStream.range(0, getParameterCount()) .mapToObj(i -> getParameterMetadata(i)) .collect(toImmutableList()); return CurrencyParameterSensitivity.of(getName(), paramMeta, currency, sensitivities); }
@Override public CombinedCurve withPerturbation(ParameterPerturbation perturbation) { Curve newBaseCurve = baseCurve.withPerturbation( (idx, value, meta) -> perturbation.perturbParameter( idx, baseCurve.getParameter(idx), baseCurve.getParameterMetadata(idx))); int offset = baseCurve.getParameterCount(); Curve newSpreadCurve = spreadCurve.withPerturbation( (idx, value, meta) -> perturbation.perturbParameter( idx + offset, spreadCurve.getParameter(idx), spreadCurve.getParameterMetadata(idx))); List<ParameterMetadata> newParamMeta = Stream.concat( IntStream.range(0, newBaseCurve.getParameterCount()) .mapToObj(i -> newBaseCurve.getParameterMetadata(i)), IntStream.range(0, newSpreadCurve.getParameterCount()) .mapToObj(i -> newSpreadCurve.getParameterMetadata(i))) .collect(toImmutableList()); return CombinedCurve.of( newBaseCurve, newSpreadCurve, metadata.withParameterMetadata(newParamMeta)); }
private CrossGammaParameterSensitivity computeGammaForCurve( CurveName curveName, Curve curve, Currency sensitivityCurrency, Function<Curve, ImmutableLegalEntityDiscountingProvider> ratesProviderFn, Function<ImmutableLegalEntityDiscountingProvider, CurrencyParameterSensitivities> sensitivitiesFn) { Function<DoubleArray, DoubleArray> function = new Function<DoubleArray, DoubleArray>() { @Override public DoubleArray apply(DoubleArray t) { Curve newCurve = curve.withPerturbation((i, v, m) -> t.get(i)); ImmutableLegalEntityDiscountingProvider newRates = ratesProviderFn.apply(newCurve); CurrencyParameterSensitivities sensiMulti = sensitivitiesFn.apply(newRates); return sensiMulti.getSensitivity(curveName, sensitivityCurrency).getSensitivity(); } }; int nParams = curve.getParameterCount(); DoubleMatrix sensi = fd.differentiate(function).apply(DoubleArray.of(nParams, n -> curve.getParameter(n))); List<ParameterMetadata> metadata = IntStream.range(0, nParams) .mapToObj(i -> curve.getParameterMetadata(i)) .collect(toImmutableList()); return CrossGammaParameterSensitivity.of(curveName, metadata, sensitivityCurrency, sensi); }
CrossGammaParameterSensitivity computeGammaForCurve( Curve curve, Currency sensitivityCurrency, Function<Curve, ImmutableRatesProvider> ratesProviderFn, Function<ImmutableRatesProvider, CurrencyParameterSensitivities> sensitivitiesFn) { Function<DoubleArray, DoubleArray> function = new Function<DoubleArray, DoubleArray>() { @Override public DoubleArray apply(DoubleArray t) { Curve newCurve = replaceParameters(curve, t); ImmutableRatesProvider newRates = ratesProviderFn.apply(newCurve); CurrencyParameterSensitivities sensiMulti = sensitivitiesFn.apply(newRates); return sensiMulti.getSensitivity(newCurve.getName(), sensitivityCurrency).getSensitivity(); } }; int nParams = curve.getParameterCount(); DoubleMatrix sensi = fd.differentiate(function).apply(DoubleArray.of(nParams, n -> curve.getParameter(n))); List<ParameterMetadata> metadata = IntStream.range(0, nParams) .mapToObj(i -> curve.getParameterMetadata(i)) .collect(toImmutableList()); return CrossGammaParameterSensitivity.of(curve.getName(), metadata, sensitivityCurrency, sensi); }
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); }
CrossGammaParameterSensitivity computeGammaForCurve( CurrencyParameterSensitivity baseDeltaSingle, Curve curve, Function<Curve, ImmutableRatesProvider> ratesProviderFn, Function<ImmutableRatesProvider, CurrencyParameterSensitivities> sensitivitiesFn) { Function<DoubleArray, DoubleArray> function = new Function<DoubleArray, DoubleArray>() { @Override public DoubleArray apply(DoubleArray t) { Curve newCurve = replaceParameters(curve, t); ImmutableRatesProvider newRates = ratesProviderFn.apply(newCurve); CurrencyParameterSensitivities sensiMulti = sensitivitiesFn.apply(newRates); return sensiMulti.getSensitivity(baseDeltaSingle.getMarketDataName(), baseDeltaSingle.getCurrency()).getSensitivity(); } }; int nParams = curve.getParameterCount(); DoubleMatrix sensi = fd.differentiate(function).apply(DoubleArray.of(nParams, n -> curve.getParameter(n))); List<ParameterMetadata> metadata = IntStream.range(0, nParams) .mapToObj(i -> curve.getParameterMetadata(i)) .collect(toImmutableList()); return CrossGammaParameterSensitivity.of( baseDeltaSingle.getMarketDataName(), baseDeltaSingle.getParameterMetadata(), curve.getName(), metadata, baseDeltaSingle.getCurrency(), sensi); }
/** * 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 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))); }