public void test_of() { ResolvedCapitalIndexedBondSettlement test = sut(); assertEquals(test.getSettlementDate(), SETTLE_DATE); assertEquals(test.getPrice(), PRICE); assertEquals(test.getPayment(), SETTLE_PERIOD); }
static ResolvedCapitalIndexedBondSettlement sut() { return ResolvedCapitalIndexedBondSettlement.of(SETTLE_DATE, PRICE, SETTLE_PERIOD); }
/** * Obtains an instance from the settlement date, price and amount. * * @param settlementDate the settlement date * @param price the price at which the trade was agreed * @param amount the amount of the settlement * @return the settlement information */ public static ResolvedCapitalIndexedBondSettlement of(LocalDate settlementDate, double price, BondPaymentPeriod amount) { return new ResolvedCapitalIndexedBondSettlement(settlementDate, price, amount); }
private PointSensitivityBuilder netAmountSensitivity( ResolvedCapitalIndexedBondSettlement settlement, RatesProvider ratesProvider) { BondPaymentPeriod settlePeriod = settlement.getPayment(); if (settlePeriod instanceof KnownAmountBondPaymentPeriod) { return PointSensitivityBuilder.none(); } else if (settlePeriod instanceof CapitalIndexedBondPaymentPeriod) { CapitalIndexedBondPaymentPeriod casted = (CapitalIndexedBondPaymentPeriod) settlePeriod; return productPricer.getPeriodPricer().forecastValueSensitivity(casted, ratesProvider); } throw new UnsupportedOperationException("unsupported settlement type"); }
private LocalDate settlementDate(ResolvedCapitalIndexedBondTrade trade, LocalDate valuationDate) { return trade.getSettlement() .map(settle -> settle.getSettlementDate()) .orElse(valuationDate); }
private CurrencyAmount presentValueSettlement( ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider) { if (!trade.getSettlement().isPresent()) { // position has no settlement, thus it has no value return CurrencyAmount.zero(trade.getProduct().getCurrency()); } BondPaymentPeriod settlePeriod = trade.getSettlement().get().getPayment(); ResolvedCapitalIndexedBond product = trade.getProduct(); CurrencyAmount netAmount = netAmount(trade, ratesProvider); RepoCurveDiscountFactors repoDf = DiscountingCapitalIndexedBondProductPricer.repoCurveDf(product, discountingProvider); return netAmount.multipliedBy(repoDf.discountFactor(settlePeriod.getPaymentDate())); }
static ResolvedCapitalIndexedBondSettlement sut2() { return ResolvedCapitalIndexedBondSettlement.of(SETTLE_DATE2, PRICE2, SETTLE_PERIOD2); }
/** * Calculates the net amount of the settlement of the bond trade. * <p> * Since the sign of the settlement notional is opposite to that of the product, negative amount will be returned * for positive quantity of trade. * * @param trade the trade * @param ratesProvider the rates provider, used to determine price index values * @return the net amount */ public CurrencyAmount netAmount( ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider) { if (!trade.getSettlement().isPresent()) { // position has no settlement, thus it has no value return CurrencyAmount.zero(trade.getProduct().getCurrency()); } BondPaymentPeriod settlePeriod = trade.getSettlement().get().getPayment(); if (settlePeriod instanceof KnownAmountBondPaymentPeriod) { Payment payment = ((KnownAmountBondPaymentPeriod) settlePeriod).getPayment(); return payment.getValue(); } else if (settlePeriod instanceof CapitalIndexedBondPaymentPeriod) { CapitalIndexedBondPaymentPeriod casted = (CapitalIndexedBondPaymentPeriod) settlePeriod; double netAmount = productPricer.getPeriodPricer().forecastValue(casted, ratesProvider); return CurrencyAmount.of(casted.getCurrency(), netAmount); } throw new UnsupportedOperationException("unsupported settlement type"); }
public void test_resolve() { ResolvedCapitalIndexedBondTrade test = sut().resolve(REF_DATA); ResolvedCapitalIndexedBondTrade expected = ResolvedCapitalIndexedBondTrade.builder() .info(TRADE_INFO) .product(PRODUCT.resolve(REF_DATA)) .quantity(QUANTITY) .settlement(ResolvedCapitalIndexedBondSettlement.of(SETTLEMENT_DATE, PRICE, SETTLEMENT)) .build(); assertEquals(test, expected); }
/** * Calculates the current cash of the bond trade. * * @param trade the trade * @param ratesProvider the rates provider, used to determine price index values * @return the current cash */ public CurrencyAmount currentCash( ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider) { LocalDate valuationDate = ratesProvider.getValuationDate(); LocalDate settlementDate = settlementDate(trade, valuationDate); CurrencyAmount cashProduct = productPricer.currentCash(trade.getProduct(), ratesProvider, settlementDate); if (!trade.getSettlement().isPresent()) { return cashProduct; } BondPaymentPeriod settlePeriod = trade.getSettlement().get().getPayment(); double cashSettle = settlePeriod.getPaymentDate().isEqual(valuationDate) ? netAmount(trade, ratesProvider).getAmount() : 0d; return cashProduct.plus(cashSettle); }
public void test_resolve1() { ResolvedCapitalIndexedBondTrade test = sut1().resolve(REF_DATA); ResolvedCapitalIndexedBondTrade expected = ResolvedCapitalIndexedBondTrade.builder() .info(TRADE_INFO) .product(PRODUCT1.resolve(REF_DATA)) .quantity(QUANTITY) .settlement(ResolvedCapitalIndexedBondSettlement.of(SETTLEMENT_DATE, PRICE, SETTLEMENT1)) .build(); assertEquals(test, expected); }
private PointSensitivityBuilder presentValueSensitivitySettlement( ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider) { if (!trade.getSettlement().isPresent()) { // position has no settlement, thus it has no sensitivity return PointSensitivityBuilder.none(); } ResolvedCapitalIndexedBondSettlement settlement = trade.getSettlement().get(); BondPaymentPeriod settlePeriod = settlement.getPayment(); ResolvedCapitalIndexedBond product = trade.getProduct(); RepoCurveDiscountFactors repoDf = DiscountingCapitalIndexedBondProductPricer.repoCurveDf(product, discountingProvider); double df = repoDf.discountFactor(settlePeriod.getPaymentDate()); double netAmount = netAmount(trade, ratesProvider).getAmount(); PointSensitivityBuilder dfSensi = repoDf.zeroRatePointSensitivity(settlePeriod.getPaymentDate()).multipliedBy(netAmount); PointSensitivityBuilder naSensi = netAmountSensitivity(settlement, ratesProvider).multipliedBy(df); return dfSensi.combinedWith(naSensi); }
.product(resolvedProduct) .quantity(quantity) .settlement(ResolvedCapitalIndexedBondSettlement.of(settlementDate, price, settlePeriod)) .build();