@Override public CurrencyParameterSensitivities createParameterSensitivity(Currency currency, DoubleArray sensitivities) { return CurrencyParameterSensitivities.of(curve.createParameterSensitivity(currency, sensitivities)); }
@Override public CurrencyParameterSensitivities createParameterSensitivity(Currency currency, DoubleArray sensitivities) { return CurrencyParameterSensitivities.of(curve.createParameterSensitivity(currency, sensitivities)); }
@Override public CurrencyParameterSensitivities createParameterSensitivity(Currency currency, DoubleArray sensitivities) { return CurrencyParameterSensitivities.of(curve.createParameterSensitivity(currency, sensitivities)); }
@Override public CurrencyParameterSensitivities createParameterSensitivity(Currency currency, DoubleArray sensitivities) { return CurrencyParameterSensitivities.of(curve.createParameterSensitivity(currency, sensitivities)); }
@Override public UnitParameterSensitivity createParameterSensitivity(DoubleArray sensitivities) { UnitParameterSensitivity baseSens = baseCurve.createParameterSensitivity( sensitivities.subArray(0, baseCurve.getParameterCount())); UnitParameterSensitivity spreadSens = spreadCurve.createParameterSensitivity( sensitivities.subArray(baseCurve.getParameterCount(), sensitivities.size())); return UnitParameterSensitivity.combine(getName(), baseSens, spreadSens); }
@Override public CurrencyParameterSensitivity createParameterSensitivity( Currency currency, DoubleArray sensitivities) { CurrencyParameterSensitivity baseSensi = baseCurve.createParameterSensitivity( currency, sensitivities.subArray(0, baseCurve.getParameterCount())); CurrencyParameterSensitivity spreadSensi = spreadCurve.createParameterSensitivity( currency, sensitivities.subArray(baseCurve.getParameterCount(), sensitivities.size())); return CurrencyParameterSensitivity.combine(getName(), baseSensi, spreadSensi); }
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; }
/** * Computes the "sum-of-column gamma" or "semi-parallel gamma" for a sensitivity function. * <p> * This implementation supports a single {@link Curve} on the zero-coupon rates. * By default the gamma is computed using a one basis-point shift and a forward finite difference. * The results themselves are not scaled (they represent the second order derivative). * * @param curve the single curve to be bumped * @param curveCurrency the currency of the curve and resulting sensitivity * @param sensitivitiesFn the function to convert the bumped curve to parameter sensitivities * @return the "sum-of-columns" or "semi-parallel" gamma vector */ public CurrencyParameterSensitivity calculateSemiParallelGamma( Curve curve, Currency curveCurrency, Function<Curve, CurrencyParameterSensitivity> sensitivitiesFn) { Delta deltaShift = new Delta(curve, sensitivitiesFn); Function<DoubleArray, DoubleMatrix> gammaFn = fd.differentiate(deltaShift); DoubleArray gamma = gammaFn.apply(DoubleArray.filled(1)).column(0); return curve.createParameterSensitivity(curveCurrency, gamma); }
public void test_createParameterSensitivity_currency() { Curve test = new TestingCurve(2d); assertEquals(test.createParameterSensitivity(USD, DoubleArray.of(2d)).getMarketDataName(), CURVE_NAME); assertEquals(test.createParameterSensitivity(USD, DoubleArray.of(2d)).getParameterCount(), 1); assertEquals(test.createParameterSensitivity(USD, DoubleArray.of(2d)).getParameterMetadata(), ImmutableList.of(PARAM_META)); assertEquals(test.createParameterSensitivity(USD, DoubleArray.of(2d)).getCurrency(), USD); assertEquals(test.createParameterSensitivity(USD, DoubleArray.of(2d)).getSensitivity(), DoubleArray.of(2d)); }
public void test_createParameterSensitivity_unit() { Curve test = new TestingCurve(2d); assertEquals(test.createParameterSensitivity(DoubleArray.of(2d)).getMarketDataName(), CURVE_NAME); assertEquals(test.createParameterSensitivity(DoubleArray.of(2d)).getParameterCount(), 1); assertEquals(test.createParameterSensitivity(DoubleArray.of(2d)).getParameterMetadata(), ImmutableList.of(PARAM_META)); assertEquals(test.createParameterSensitivity(DoubleArray.of(2d)).getSensitivity(), DoubleArray.of(2d)); }
CurveName curveName = entry.getKey(); CurrencyParameterSensitivity maketQuoteSens = provider.findData(curveName) .map(c -> c.createParameterSensitivity(paramSens.getCurrency(), entry.getValue())) .orElse(CurrencyParameterSensitivity.of(curveName, paramSens.getCurrency(), entry.getValue())); result = result.combinedWith(maketQuoteSens);
CurveName curveName = entry.getKey(); CurrencyParameterSensitivity maketQuoteSens = provider.findData(curveName) .map(c -> c.createParameterSensitivity(paramSens.getCurrency(), entry.getValue())) .orElse(CurrencyParameterSensitivity.of(curveName, paramSens.getCurrency(), entry.getValue())); result = result.combinedWith(maketQuoteSens);
CurveName curveName = entry.getKey(); CurrencyParameterSensitivity maketQuoteSens = provider.findData(curveName) .map(c -> c.createParameterSensitivity(paramSens.getCurrency(), entry.getValue())) .orElse(CurrencyParameterSensitivity.of(curveName, paramSens.getCurrency(), entry.getValue())); result = result.combinedWith(maketQuoteSens);
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 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 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 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; }
return (pvBumped - pvBase.getAmount()) / shift; }); result = result.combinedWith(curve.createParameterSensitivity(pvBase.getCurrency(), sensitivity));