@Override public ResolvedCapitalIndexedBondTrade resolve(ReferenceData refData) { ResolvedCapitalIndexedBond resolved = product.resolve(refData); return new ResolvedCapitalIndexedBondTrade(info, resolved, getQuantity(), null); }
/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(CapitalIndexedBond beanToCopy) { this.securityId = beanToCopy.getSecurityId(); this.currency = beanToCopy.getCurrency(); this.notional = beanToCopy.getNotional(); this.accrualSchedule = beanToCopy.getAccrualSchedule(); this.rateCalculation = beanToCopy.getRateCalculation(); this.dayCount = beanToCopy.getDayCount(); this.yieldConvention = beanToCopy.getYieldConvention(); this.legalEntityId = beanToCopy.getLegalEntityId(); this.settlementDateOffset = beanToCopy.getSettlementDateOffset(); this.exCouponPeriod = beanToCopy.getExCouponPeriod(); }
@Override public ResolvedCapitalIndexedBondTrade resolve(ReferenceData refData) { ResolvedCapitalIndexedBond resolvedProduct = product.resolve(refData); LocalDate settlementDate = calculateSettlementDate(refData); double accruedInterest = resolvedProduct.accruedInterest(settlementDate) / product.getNotional(); if (settlementDate.isBefore(resolvedProduct.getStartDate())) { throw new IllegalArgumentException("Settlement date must not be before bond starts"); if (product.getYieldConvention().equals(CapitalIndexedBondYieldConvention.GB_IL_FLOAT)) { settlePeriod = KnownAmountBondPaymentPeriod.of( Payment.of(product.getCurrency(), -product.getNotional() * quantity * (price + accruedInterest), settlementDate), SchedulePeriod.of( resolvedProduct.getStartDate(), settlementDate, product.getAccrualSchedule().getStartDate(), settlementDate)); } else { RateComputation rateComputation = product.getRateCalculation().createRateComputation(settlementDate); settlePeriod = CapitalIndexedBondPaymentPeriod.builder() .startDate(resolvedProduct.getStartDate()) .unadjustedStartDate(product.getAccrualSchedule().getStartDate()) .endDate(settlementDate) .rateComputation(rateComputation) .currency(product.getCurrency()) .notional(-product.getNotional() * quantity * (price + accruedInterest)) .realCoupon(1d) .build();
static ResolvedCapitalIndexedBond sut2() { return ResolvedCapitalIndexedBond.builder() .securityId(CapitalIndexedBondTest.sut2().getSecurityId()) .dayCount(NL_365) .legalEntityId(LegalEntityId.of("OG-Ticker", "US-Govt1")) .nominalPayment(PERIODIC[1].withUnitCoupon(PERIODIC[0].getStartDate(), PERIODIC[0].getUnadjustedStartDate())) .periodicPayments(PERIODIC[0], PERIODIC[1]) .frequency(CapitalIndexedBondTest.sut2().getAccrualSchedule().getFrequency()) .rollConvention(CapitalIndexedBondTest.sut2().getAccrualSchedule().calculatedRollConvention()) .settlementDateOffset(DaysAdjustment.ofBusinessDays(3, GBLO)) .yieldConvention(GB_IL_FLOAT) .rateCalculation(CapitalIndexedBondTest.sut2().getRateCalculation()) .build(); }
public void test_builder() { CapitalIndexedBondSecurity test = sut(); assertEquals(test.getInfo(), INFO); assertEquals(test.getSecurityId(), PRODUCT.getSecurityId()); assertEquals(test.getCurrency(), PRODUCT.getCurrency()); assertEquals(test.getUnderlyingIds(), ImmutableSet.of()); assertEquals(test.getFirstIndexValue(), PRODUCT.getFirstIndexValue()); }
.settlementDateOffset(SETTLE_OFFSET) .yieldConvention(US_IL_REAL) .rateCalculation(base.getRateCalculation()) .build(); assertEquals(base.resolve(REF_DATA), expected);
static ResolvedCapitalIndexedBond sut() { return ResolvedCapitalIndexedBond.builder() .securityId(CapitalIndexedBondTest.sut().getSecurityId()) .dayCount(ACT_ACT_ISDA) .legalEntityId(LEGAL_ENTITY) .nominalPayment(NOMINAL) .periodicPayments(PERIODIC) .frequency(CapitalIndexedBondTest.sut().getAccrualSchedule().getFrequency()) .rollConvention(CapitalIndexedBondTest.sut().getAccrualSchedule().calculatedRollConvention()) .settlementDateOffset(SETTLE_OFFSET) .yieldConvention(US_IL_REAL) .rateCalculation(RATE_CALC) .build(); }
@Override public SecurityId getSecurityId() { return product.getSecurityId(); }
@Override public Currency getCurrency() { return product.getCurrency(); }
private LocalDate calculateSettlementDate(ReferenceData refData) { if (info.getSettlementDate().isPresent()) { return info.getSettlementDate().get(); } if (info.getTradeDate().isPresent()) { LocalDate tradeDate = info.getTradeDate().get(); return product.getSettlementDateOffset().adjust(tradeDate, refData); } throw new IllegalStateException("CapitalIndexedBondTrade.resolve() requires either trade date or settlement date"); }
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 1574023291: // securityId return ((CapitalIndexedBond) bean).getSecurityId(); case 575402001: // currency return ((CapitalIndexedBond) bean).getCurrency(); case 1585636160: // notional return ((CapitalIndexedBond) bean).getNotional(); case 304659814: // accrualSchedule return ((CapitalIndexedBond) bean).getAccrualSchedule(); case -521703991: // rateCalculation return ((CapitalIndexedBond) bean).getRateCalculation(); case 1905311443: // dayCount return ((CapitalIndexedBond) bean).getDayCount(); case -1895216418: // yieldConvention return ((CapitalIndexedBond) bean).getYieldConvention(); case 866287159: // legalEntityId return ((CapitalIndexedBond) bean).getLegalEntityId(); case 135924714: // settlementDateOffset return ((CapitalIndexedBond) bean).getSettlementDateOffset(); case 1408037338: // exCouponPeriod return ((CapitalIndexedBond) bean).getExCouponPeriod(); } return super.propertyGet(bean, propertyName, quiet); }
public void test_resolve() { ResolvedCapitalIndexedBondTrade expected = ResolvedCapitalIndexedBondTrade.builder() .info(POSITION_INFO) .product(PRODUCT.resolve(REF_DATA)) .quantity(QUANTITY) .build(); assertEquals(sut().resolve(REF_DATA), expected); }
public void test_builder_full() { CapitalIndexedBond test = sut(); assertEquals(test.getSecurityId(), SECURITY_ID); assertEquals(test.getCurrency(), USD); assertEquals(test.getDayCount(), ACT_ACT_ISDA); assertEquals(test.getExCouponPeriod(), EX_COUPON); assertEquals(test.getLegalEntityId(), LEGAL_ENTITY); assertEquals(test.getNotional(), NOTIONAL); assertEquals(test.getAccrualSchedule(), SCHEDULE); assertEquals(test.getRateCalculation(), RATE_CALC); assertEquals(test.getFirstIndexValue(), RATE_CALC.getFirstIndexValue().getAsDouble()); assertEquals(test.getSettlementDateOffset(), SETTLE_OFFSET); assertEquals(test.getYieldConvention(), US_IL_REAL); }
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); }
public void test_builder_min() { CapitalIndexedBond test = CapitalIndexedBond.builder() .securityId(SECURITY_ID) .notional(NOTIONAL) .currency(USD) .dayCount(ACT_ACT_ISDA) .rateCalculation(RATE_CALC) .legalEntityId(LEGAL_ENTITY) .yieldConvention(US_IL_REAL) .settlementDateOffset(SETTLE_OFFSET) .accrualSchedule(SCHEDULE) .build(); assertEquals(test.getSecurityId(), SECURITY_ID); assertEquals(test.getCurrency(), USD); assertEquals(test.getDayCount(), ACT_ACT_ISDA); assertEquals(test.getExCouponPeriod(), DaysAdjustment.NONE); assertEquals(test.getLegalEntityId(), LEGAL_ENTITY); assertEquals(test.getNotional(), NOTIONAL); assertEquals(test.getAccrualSchedule(), SCHEDULE); assertEquals(test.getRateCalculation(), RATE_CALC); assertEquals(test.getSettlementDateOffset(), SETTLE_OFFSET); assertEquals(test.getYieldConvention(), US_IL_REAL); }
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); }
static CapitalIndexedBondSecurity createSecurity(CapitalIndexedBond product) { return CapitalIndexedBondSecurity.builder() .info(SecurityInfo.of(product.getSecurityId(), INFO.getPriceInfo())) .currency(product.getCurrency()) .notional(product.getNotional()) .accrualSchedule(product.getAccrualSchedule()) .rateCalculation(product.getRateCalculation()) .dayCount(product.getDayCount()) .yieldConvention(product.getYieldConvention()) .legalEntityId(product.getLegalEntityId()) .settlementDateOffset(product.getSettlementDateOffset()) .exCouponPeriod(product.getExCouponPeriod()) .build(); }
public void test_presentValueFromCleanPrice_late() { CurrencyAmount computed = PRICER.presentValueFromCleanPrice( TRADE_LATE, RATES_PROVIDER, ISSUER_RATES_PROVIDER, REF_DATA, TRADE_PRICE); CurrencyAmount netAmount = PRICER.netAmount(TRADE_LATE, RATES_PROVIDER); CapitalIndexedBondPaymentPeriod period = PRODUCT.resolve(REF_DATA).getPeriodicPayments().get(17); double pvDiff = PERIOD_PRICER.presentValue(period, RATES_PROVIDER, ISSUER_DISCOUNT_FACTORS) * QUANTITY; double df1 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_LATE); double df2 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_STANDARD); double expected1 = netAmount.getAmount() * df1; double expected2 = pvDiff + QUANTITY * df2 * PRICER.forecastValueStandardFromCleanPrice( RPRODUCT, RATES_PROVIDER, SETTLEMENT_STANDARD, TRADE_PRICE).getAmount(); assertEquals(computed.getAmount(), expected1 + expected2, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPrice_early() { CurrencyAmount computed = PRICER.presentValueFromCleanPrice( TRADE_EARLY, RATES_PROVIDER, ISSUER_RATES_PROVIDER, REF_DATA, TRADE_PRICE); CurrencyAmount netAmount = PRICER.netAmount(TRADE_EARLY, RATES_PROVIDER); CapitalIndexedBondPaymentPeriod period = PRODUCT.resolve(REF_DATA).getPeriodicPayments().get(16); double pvDiff = PERIOD_PRICER.presentValue(period, RATES_PROVIDER, ISSUER_DISCOUNT_FACTORS) * QUANTITY; double df1 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_EARLY); double df2 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_STANDARD); double expected1 = netAmount.getAmount() * df1; double expected2 = -pvDiff + QUANTITY * df2 * PRICER.forecastValueStandardFromCleanPrice(RPRODUCT, RATES_PROVIDER, SETTLEMENT_STANDARD, TRADE_PRICE).getAmount(); assertEquals(computed.getAmount(), expected1 + expected2, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPriceWithZSpread_early() { CurrencyAmount computed = PRICER.presentValueFromCleanPriceWithZSpread( TRADE_EARLY, RATES_PROVIDER, ISSUER_RATES_PROVIDER, REF_DATA, TRADE_PRICE, Z_SPREAD, CONTINUOUS, 0); CurrencyAmount netAmount = PRICER.netAmount(TRADE_EARLY, RATES_PROVIDER); CapitalIndexedBondPaymentPeriod period = PRODUCT.resolve(REF_DATA).getPeriodicPayments().get(16); double pvDiff = PERIOD_PRICER.presentValueWithZSpread( period, RATES_PROVIDER, ISSUER_DISCOUNT_FACTORS, Z_SPREAD, CONTINUOUS, 0) * QUANTITY; double df1 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_EARLY); double df2 = ISSUER_RATES_PROVIDER.repoCurveDiscountFactors(SECURITY_ID, LEGAL_ENTITY, USD) .discountFactor(SETTLEMENT_STANDARD); double expected1 = netAmount.getAmount() * df1; double expected2 = -pvDiff + QUANTITY * df2 * PRICER.forecastValueStandardFromCleanPrice( RPRODUCT, RATES_PROVIDER, SETTLEMENT_STANDARD, TRADE_PRICE).getAmount(); assertEquals(computed.getAmount(), expected1 + expected2, NOTIONAL * QUANTITY * TOL); }