@Override public ZeroRateDiscountFactors withParameter(int parameterIndex, double newValue) { return withCurve(curve.withParameter(parameterIndex, newValue)); }
@Override public ZeroRatePeriodicDiscountFactors withParameter(int parameterIndex, double newValue) { return withCurve(curve.withParameter(parameterIndex, newValue)); }
@Override public SimpleDiscountFactors withParameter(int parameterIndex, double newValue) { return withCurve(curve.withParameter(parameterIndex, newValue)); }
@Override public BlackFxOptionFlatVolatilities withParameter(int parameterIndex, double newValue) { return new BlackFxOptionFlatVolatilities( currencyPair, valuationDateTime, curve.withParameter(parameterIndex, newValue)); }
@Override public SimpleIborIndexRates withParameter(int parameterIndex, double newValue) { return withCurve(curve.withParameter(parameterIndex, newValue)); }
@Override public AddFixedCurve withParameter(int parameterIndex, double newValue) { return new AddFixedCurve(fixedCurve, spreadCurve.withParameter(parameterIndex, newValue)); }
@Override public CombinedCurve withParameter(int parameterIndex, double newValue) { if (parameterIndex < baseCurve.getParameterCount()) { return new CombinedCurve( baseCurve.withParameter(parameterIndex, newValue), spreadCurve, metadata); } return new CombinedCurve( baseCurve, spreadCurve.withParameter(parameterIndex - baseCurve.getParameterCount(), newValue), metadata); }
@Override public ParallelShiftedCurve withParameter(int parameterIndex, double newValue) { if (parameterIndex == underlyingCurve.getParameterCount()) { return new ParallelShiftedCurve(underlyingCurve, shiftType, newValue); } return new ParallelShiftedCurve(underlyingCurve.withParameter(parameterIndex, newValue), shiftType, shiftAmount); }
private <T> CurrencyParameterSensitivities sensitivity( ImmutableRatesProvider provider, Map<T, Curve> baseCurves, BiFunction<ImmutableRatesProvider, Map<T, Curve>, ImmutableRatesProvider> storeBumpedFn, Function<ImmutableRatesProvider, CurrencyAmount> valueFn, CurrencyAmount valueInit) { CurrencyParameterSensitivities result = CurrencyParameterSensitivities.empty(); for (Entry<T, Curve> entry : baseCurves.entrySet()) { Curve curve = entry.getValue(); DoubleArray sensitivity = DoubleArray.of(curve.getParameterCount(), i -> { Curve dscBumped = curve.withParameter(i, curve.getParameter(i) + shift); Map<T, Curve> mapBumped = new HashMap<>(baseCurves); mapBumped.put(entry.getKey(), dscBumped); ImmutableRatesProvider providerDscBumped = storeBumpedFn.apply(provider, mapBumped); return (valueFn.apply(providerDscBumped).getAmount() - valueInit.getAmount()) / shift; }); result = result.combinedWith(curve.createParameterSensitivity(valueInit.getCurrency(), sensitivity)); } return result; }
private <T> CurrencyParameterSensitivities sensitivity( ImmutableLegalEntityDiscountingProvider provider, Function<ImmutableLegalEntityDiscountingProvider, CurrencyAmount> valueFn, MetaProperty<ImmutableMap<Pair<T, Currency>, DiscountFactors>> metaProperty, CurrencyAmount valueInit) { ImmutableMap<Pair<T, Currency>, DiscountFactors> baseCurves = metaProperty.get(provider); CurrencyParameterSensitivities result = CurrencyParameterSensitivities.empty(); for (Pair<T, Currency> key : baseCurves.keySet()) { DiscountFactors discountFactors = baseCurves.get(key); Curve curve = checkDiscountFactors(discountFactors); int paramCount = curve.getParameterCount(); double[] sensitivity = new double[paramCount]; for (int i = 0; i < paramCount; i++) { Curve dscBumped = curve.withParameter(i, curve.getParameter(i) + shift); Map<Pair<T, Currency>, DiscountFactors> mapBumped = new HashMap<>(baseCurves); mapBumped.put(key, createDiscountFactors(discountFactors, dscBumped)); ImmutableLegalEntityDiscountingProvider providerDscBumped = provider.toBuilder().set(metaProperty, mapBumped).build(); sensitivity[i] = (valueFn.apply(providerDscBumped).getAmount() - valueInit.getAmount()) / shift; } result = result.combinedWith( curve.createParameterSensitivity(valueInit.getCurrency(), DoubleArray.copyOf(sensitivity))); } return result; }
private <T> CurrencyParameterSensitivities sensitivity( ImmutableRatesProvider provider, Map<T, Curve> baseCurves, BiFunction<ImmutableRatesProvider, Map<T, Curve>, ImmutableRatesProvider> storeBumpedFn, Function<ImmutableRatesProvider, CurrencyAmount> valueFn, CurrencyAmount valueInit) { CurrencyParameterSensitivities result = CurrencyParameterSensitivities.empty(); for (Entry<T, Curve> entry : baseCurves.entrySet()) { Curve curve = entry.getValue(); DoubleArray sensitivity = DoubleArray.of(curve.getParameterCount(), i -> { Curve dscUp = curve.withParameter(i, curve.getParameter(i) + EPS); Curve dscDw = curve.withParameter(i, curve.getParameter(i) - EPS); HashMap<T, Curve> mapUp = new HashMap<>(baseCurves); HashMap<T, Curve> mapDw = new HashMap<>(baseCurves); mapUp.put(entry.getKey(), dscUp); mapDw.put(entry.getKey(), dscDw); ImmutableRatesProvider providerUp = storeBumpedFn.apply(provider, mapUp); ImmutableRatesProvider providerDw = storeBumpedFn.apply(provider, mapDw); return (valueFn.apply(providerUp).getAmount() + valueFn.apply(providerDw).getAmount() - 2d * valueInit.getAmount()) / EPS / EPS; }); result = result.combinedWith(curve.createParameterSensitivity(valueInit.getCurrency(), sensitivity)); } return result; }
private <T> CurrencyParameterSensitivities sensitivityDiscountCurve( ImmutableCreditRatesProvider provider, Function<ImmutableCreditRatesProvider, CurrencyAmount> valueFn, MetaProperty<ImmutableMap<T, CreditDiscountFactors>> metaProperty, CurrencyAmount valueInit) { ImmutableMap<T, CreditDiscountFactors> baseCurves = metaProperty.get(provider); CurrencyParameterSensitivities result = CurrencyParameterSensitivities.empty(); for (T key : baseCurves.keySet()) { CreditDiscountFactors creditDiscountFactors = baseCurves.get(key); DiscountFactors discountFactors = creditDiscountFactors.toDiscountFactors(); Curve curve = checkDiscountFactors(discountFactors); int paramCount = curve.getParameterCount(); double[] sensitivity = new double[paramCount]; for (int i = 0; i < paramCount; i++) { Curve dscBumped = curve.withParameter(i, curve.getParameter(i) + shift); Map<T, CreditDiscountFactors> mapBumped = new HashMap<>(baseCurves); mapBumped.put(key, createCreditDiscountFactors(creditDiscountFactors, dscBumped)); ImmutableCreditRatesProvider providerDscBumped = provider.toBuilder().set(metaProperty, mapBumped).build(); sensitivity[i] = (valueFn.apply(providerDscBumped).getAmount() - valueInit.getAmount()) / shift; } result = result.combinedWith( curve.createParameterSensitivity(valueInit.getCurrency(), DoubleArray.copyOf(sensitivity))); } return result; }
private <T> CurrencyParameterSensitivities sensitivityCreidtCurve( ImmutableCreditRatesProvider provider, Function<ImmutableCreditRatesProvider, CurrencyAmount> valueFn, MetaProperty<ImmutableMap<T, LegalEntitySurvivalProbabilities>> metaProperty, CurrencyAmount valueInit) { ImmutableMap<T, LegalEntitySurvivalProbabilities> baseCurves = metaProperty.get(provider); CurrencyParameterSensitivities result = CurrencyParameterSensitivities.empty(); for (T key : baseCurves.keySet()) { LegalEntitySurvivalProbabilities credit = baseCurves.get(key); CreditDiscountFactors creditDiscountFactors = credit.getSurvivalProbabilities(); DiscountFactors discountFactors = creditDiscountFactors.toDiscountFactors(); Curve curve = checkDiscountFactors(discountFactors); int paramCount = curve.getParameterCount(); double[] sensitivity = new double[paramCount]; for (int i = 0; i < paramCount; i++) { Curve dscBumped = curve.withParameter(i, curve.getParameter(i) + shift); Map<T, LegalEntitySurvivalProbabilities> mapBumped = new HashMap<>(baseCurves); mapBumped.put(key, LegalEntitySurvivalProbabilities.of( credit.getLegalEntityId(), createCreditDiscountFactors(creditDiscountFactors, dscBumped))); ImmutableCreditRatesProvider providerDscBumped = provider.toBuilder().set(metaProperty, mapBumped).build(); sensitivity[i] = (valueFn.apply(providerDscBumped).getAmount() - valueInit.getAmount()) / shift; } result = result.combinedWith( curve.createParameterSensitivity(valueInit.getCurrency(), DoubleArray.copyOf(sensitivity))); } return result; }
int nParams = curve.getParameterCount(); DoubleArray sensitivity = DoubleArray.of(nParams, i -> { Curve dscBumped = curve.withParameter(i, curve.getParameter(i) + shift); Map<Currency, Curve> mapBumped = new HashMap<>(baseCurves); mapBumped.put(entry.getKey(), dscBumped);