@Override public void collectIndices(ImmutableSet.Builder<Index> builder) { builder.add(getIndex()); }
@Override public double rate( IborAveragedRateComputation computation, LocalDate startDate, LocalDate endDate, RatesProvider provider) { IborIndexRates rates = provider.iborIndexRates(computation.getIndex()); // take (rate * weight) for each fixing and divide by total weight double weightedRate = computation.getFixings().stream() .mapToDouble(fixing -> weightedRate(fixing, rates)) .sum(); return weightedRate / computation.getTotalWeight(); }
@Override public PointSensitivityBuilder rateSensitivity( IborAveragedRateComputation computation, LocalDate startDate, LocalDate endDate, RatesProvider provider) { IborIndexRates rates = provider.iborIndexRates(computation.getIndex()); // combine the weighted sensitivity to each fixing // omit fixed rates as they have no sensitivity to a curve return computation.getFixings().stream() .filter(fixing -> !fixing.getFixedRate().isPresent()) .map(fixing -> weightedSensitivity(fixing, computation.getTotalWeight(), rates)) .reduce(PointSensitivityBuilder.none(), PointSensitivityBuilder::combinedWith); }
@Override public double explainRate( IborAveragedRateComputation computation, LocalDate startDate, LocalDate endDate, RatesProvider provider, ExplainMapBuilder builder) { IborIndexRates rates = provider.iborIndexRates(computation.getIndex()); for (IborAveragedFixing fixing : computation.getFixings()) { rates.explainRate(fixing.getObservation(), builder, child -> child.put(ExplainKey.WEIGHT, fixing.getWeight())); } double rate = rate(computation, startDate, endDate, provider); builder.put(ExplainKey.COMBINED_RATE, rate); return rate; }