/** * Finds a single sensitivity instance by name. * <p> * If the sensitivity is not found, optional empty is returned. * * @param name the curve name to find * @return the matching sensitivity */ public Optional<UnitParameterSensitivity> findSensitivity(MarketDataName<?> name) { return sensitivities.stream() .filter(sens -> sens.getMarketDataName().equals(name)) .findFirst(); }
@Override @SuppressWarnings("unchecked") public <R> Set<MarketDataId<R>> findIds(MarketDataName<R> name) { Set<MarketDataId<R>> ids = underlying.findIds(name); if (id instanceof NamedMarketDataId) { NamedMarketDataId<?> named = (NamedMarketDataId<?>) id; if (named.getMarketDataName().equals(name)) { return ImmutableSet.<MarketDataId<R>>builder().addAll(ids).add((MarketDataId<R>) id).build(); } } return ids; }
@Override @SuppressWarnings("unchecked") public <R> Set<MarketDataId<R>> findIds(MarketDataName<R> name) { Set<MarketDataId<R>> ids = underlying.findIds(name); if (id instanceof NamedMarketDataId) { NamedMarketDataId<?> named = (NamedMarketDataId<?>) id; if (named.getMarketDataName().equals(name)) { return ImmutableSet.<MarketDataId<R>>builder().addAll(ids).add((MarketDataId<R>) id).build(); } } return ids; }
@Override @SuppressWarnings("unchecked") public <T> Set<MarketDataId<T>> findIds(MarketDataName<T> name) { // no type check against id.getMarketDataType() as checked in factory return values.keySet().stream() .filter(id -> id instanceof NamedMarketDataId) .filter(id -> ((NamedMarketDataId<?>) id).getMarketDataName().equals(name)) .map(id -> (MarketDataId<T>) id) .collect(toImmutableSet()); }
@Override @SuppressWarnings("unchecked") public <T> Set<MarketDataId<T>> findIds(MarketDataName<T> name) { // no type check against id.getMarketDataType() as checked in factory return values.keySet().stream() .filter(id -> id instanceof NamedMarketDataId) .filter(id -> ((NamedMarketDataId<?>) id).getMarketDataName().equals(name)) .map(id -> (MarketDataId<T>) id) .collect(toImmutableSet()); }
/** * Returns an instance with the specified sensitivity array added to the array in this instance. * <p> * The specified instance must have the same name, metadata and parameter split as this instance. * * @param otherSensitivty the other parameter sensitivity * @return an instance based on this one, with the other instance added * @throws IllegalArgumentException if the market data name, metadata or parameter split differs */ public UnitParameterSensitivity plus(UnitParameterSensitivity otherSensitivty) { if (!marketDataName.equals(otherSensitivty.marketDataName) || !parameterMetadata.equals(otherSensitivty.parameterMetadata) || (parameterSplit != null && !parameterSplit.equals(otherSensitivty.parameterSplit))) { throw new IllegalArgumentException("Two sensitivity instances can only be added if name, metadata and split are equal"); } return plus(otherSensitivty.getSensitivity()); }
/** * Finds a single sensitivity instance by name and currency. * <p> * If the sensitivity is not found, optional empty is returned. * * @param name the curve name to find * @param currency the currency to find * @return the matching sensitivity */ public Optional<CurrencyParameterSensitivity> findSensitivity(MarketDataName<?> name, Currency currency) { return sensitivities.stream() .filter(sens -> sens.getMarketDataName().equals(name) && sens.getCurrency().equals(currency)) .findFirst(); }
/** * Finds a single sensitivity instance by name and currency. * <p> * If the sensitivity is not found, optional empty is returned. * * @param name the curve name to find * @param currency the currency to find * @return the matching sensitivity */ public Optional<CrossGammaParameterSensitivity> findSensitivity(MarketDataName<?> name, Currency currency) { return sensitivities.stream() .filter(sens -> sens.getMarketDataName().equals(name) && sens.getCurrency().equals(currency)) .findFirst(); }
/** * Returns an instance with the specified sensitivity array added to the array in this instance. * <p> * The specified instance must have the same name, metadata, currency and parameter split as this instance. * * @param otherSensitivty the other parameter sensitivity * @return an instance based on this one, with the other instance added * @throws IllegalArgumentException if the market data name, metadata or parameter split differs */ public CurrencyParameterSensitivity plus(CurrencyParameterSensitivity otherSensitivty) { if (!marketDataName.equals(otherSensitivty.marketDataName) || !parameterMetadata.equals(otherSensitivty.parameterMetadata) || !currency.equals(otherSensitivty.currency) || (parameterSplit != null && !parameterSplit.equals(otherSensitivty.parameterSplit))) { throw new IllegalArgumentException("Two sensitivity instances can only be added if name, metadata and split are equal"); } return plus(otherSensitivty.getSensitivity()); }
private Pair<Integer, List<? extends ParameterMetadata>> findStartIndexAndMetadata(MarketDataName<?> name) { int startIndex = 0; for (Pair<MarketDataName<?>, List<? extends ParameterMetadata>> entry : order) { if (entry.getFirst().equals(name)) { return Pair.of(startIndex, entry.getSecond()); } startIndex += entry.getSecond().size(); } throw new IllegalArgumentException(Messages.format("Unable to find sensitivity: {} and {}", marketDataName, name)); }
private void test_from_functions_one_curve_all_dates( Function<LocalDate, ParameterMetadata> parameterMetadataFunction, Function<CurrencyParameterSensitivities, CurrencyParameterSensitivities> rebucketFunction) { List<ParameterMetadata> pmdInput = new ArrayList<>(); double[] sensiExpected = new double[TARGET_DATES.size()]; for (int loopdate = 0; loopdate < SENSITIVITY_DATES.size(); loopdate++) { pmdInput.add(parameterMetadataFunction.apply(SENSITIVITY_DATES.get(loopdate))); sensiExpected[WEIGHTS_START[loopdate]] += WEIGHTS_HC[loopdate] * SENSITIVITY_AMOUNT; sensiExpected[WEIGHTS_START[loopdate] + 1] += (1.0d - WEIGHTS_HC[loopdate]) * SENSITIVITY_AMOUNT; } DoubleArray sens = DoubleArray.of(SENSITIVITY_DATES.size(), (d) -> SENSITIVITY_AMOUNT); CurrencyParameterSensitivity s = CurrencyParameterSensitivity.of(NAME_1, pmdInput, CCY_1, sens); CurrencyParameterSensitivities s2 = CurrencyParameterSensitivities.of(s); CurrencyParameterSensitivities sTarget = rebucketFunction.apply(s2); assertTrue(sTarget.getSensitivities().size() == 1); CurrencyParameterSensitivity sTarget1 = sTarget.getSensitivities().get(0); assertTrue(sTarget1.getMarketDataName().equals(NAME_1)); assertTrue(sTarget1.getCurrency().equals(CCY_1)); assertTrue(sTarget1.getSensitivity().size() == TARGET_DATES.size()); for (int looptarget = 0; looptarget < TARGET_DATES.size(); looptarget++) { assertEquals(sTarget1.getSensitivity().get(looptarget), sensiExpected[looptarget], TOLERANCE_SENSI); } }
private void test_from_functions_one_curve_one_date( Function<LocalDate, ParameterMetadata> parameterMetadataFunction, Function<CurrencyParameterSensitivities, CurrencyParameterSensitivities> rebucketFunction) { for (int loopdate = 0; loopdate < SENSITIVITY_DATES.size(); loopdate++) { List<ParameterMetadata> pmdInput = new ArrayList<>(); pmdInput.add(parameterMetadataFunction.apply(SENSITIVITY_DATES.get(loopdate))); CurrencyParameterSensitivity s = CurrencyParameterSensitivity.of(NAME_1, pmdInput, CCY_1, DoubleArray.of(SENSITIVITY_AMOUNT)); CurrencyParameterSensitivities s2 = CurrencyParameterSensitivities.of(s); CurrencyParameterSensitivities sTarget = rebucketFunction.apply(s2); assertTrue(sTarget.getSensitivities().size() == 1); CurrencyParameterSensitivity sTarget1 = sTarget.getSensitivities().get(0); assertTrue(sTarget1.getMarketDataName().equals(NAME_1)); assertTrue(sTarget1.getCurrency().equals(CCY_1)); assertTrue(sTarget1.getSensitivity().size() == TARGET_DATES.size()); assertEquals(sTarget1.getSensitivity().get(WEIGHTS_START[loopdate]), WEIGHTS_HC[loopdate] * SENSITIVITY_AMOUNT, TOLERANCE_SENSI); assertEquals(sTarget1.getSensitivity().get(WEIGHTS_START[loopdate] + 1), (1.0d - WEIGHTS_HC[loopdate]) * SENSITIVITY_AMOUNT, TOLERANCE_SENSI); } }
assertTrue(sTarget.getSensitivities().size() == 2); CurrencyParameterSensitivity sTarget1 = sTarget.getSensitivities().get(0); assertTrue(sTarget1.getMarketDataName().equals(NAME_1)); assertTrue(sTarget1.getCurrency().equals(CCY_1)); assertTrue(sTarget1.getSensitivity().size() == TARGET_DATES.size()); (1.0d - WEIGHTS_HC[loopdate]) * SENSITIVITY_AMOUNT, TOLERANCE_SENSI); CurrencyParameterSensitivity sTarget2 = sTarget.getSensitivities().get(1); assertTrue(sTarget2.getMarketDataName().equals(NAME_2)); assertTrue(sTarget2.getCurrency().equals(CCY_2)); assertTrue(sTarget2.getSensitivity().size() == TARGET_DATES.size());
public void calibration_transition_coherence_par_rate() { RatesProvider provider = CALIBRATOR.calibrate(CURVE_GROUP_DEFN, ALL_QUOTES, REF_DATA); ImmutableList<ResolvedTrade> dscTrades = CURVE_GROUP_DEFN.resolvedTrades(ALL_QUOTES, REF_DATA); for (int loopnode = 0; loopnode < dscTrades.size(); loopnode++) { PointSensitivities pts = SWAP_PRICER.parRateSensitivity( ((ResolvedSwapTrade) dscTrades.get(loopnode)).getProduct(), provider).build(); CurrencyParameterSensitivities ps = provider.parameterSensitivity(pts); CurrencyParameterSensitivities mqs = MQC.sensitivity(ps, provider); assertEquals(mqs.size(), 1); CurrencyParameterSensitivity mqsDsc = mqs.getSensitivity(ALL_CURVE_NAME, BRL); assertTrue(mqsDsc.getMarketDataName().equals(ALL_CURVE_NAME)); assertTrue(mqsDsc.getCurrency().equals(BRL)); DoubleArray mqsData = mqsDsc.getSensitivity(); assertEquals(mqsData.size(), dscTrades.size()); for (int i = 0; i < mqsData.size(); i++) { assertEquals(mqsData.get(i), (i == loopnode) ? 1.0 : 0.0, TOLERANCE_DELTA); } } }
assertEquals(mqs.size(), 3); // Calibration of all curves simultaneously CurrencyParameterSensitivity mqsDsc = mqs.getSensitivity(CalibrationEurStandard.DSCON_CURVE_NAME, EUR); assertTrue(mqsDsc.getMarketDataName().equals(CalibrationEurStandard.DSCON_CURVE_NAME)); assertTrue(mqsDsc.getCurrency().equals(EUR)); DoubleArray mqsData = mqsDsc.getSensitivity();