/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(Swap beanToCopy) { this.legs = beanToCopy.getLegs(); }
/** * Gets the currency of the swaption. * <p> * This is the currency of the underlying swap, which is not allowed to be cross-currency. * * @return the expiry date and time */ public Currency getCurrency() { return underlying.getLegs().stream() .map(leg -> leg.getCurrency()) .distinct() .reduce(ensureOnlyOne()) .get(); }
@Override @DerivedProperty public Currency getCurrency() { return underlyingSwap.getLegs().get(0).getCurrency(); }
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 3317797: // legs return ((Swap) bean).getLegs(); case -2129778896: // startDate return ((Swap) bean).getStartDate(); case -1607727319: // endDate return ((Swap) bean).getEndDate(); } return super.propertyGet(bean, propertyName, quiet); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { SwapTrade trade = template.createTrade(valuationDate, BuySell.BUY, 1, 1, refData); SwapLeg iborLeg = trade.getProduct().getLegs(SwapLegType.IBOR).get(1); // Select the 'second' Ibor leg, i.e. the flat floating leg ResolvedSwapLeg iborLegExpanded = iborLeg.resolve(refData); List<SwapPaymentPeriod> periods = iborLegExpanded.getPaymentPeriods(); int nbPeriods = periods.size(); RatePaymentPeriod lastPeriod = (RatePaymentPeriod) periods.get(nbPeriods - 1); List<RateAccrualPeriod> accruals = lastPeriod.getAccrualPeriods(); int nbAccruals = accruals.size(); IborRateComputation ibor = (IborRateComputation) accruals.get(nbAccruals - 1).getRateComputation(); return ibor.getFixingDate(); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { SwapTrade trade = template.createTrade(valuationDate, BuySell.BUY, 1, 1, refData); SwapLeg iborLeg = trade.getProduct().getLegs(SwapLegType.IBOR).get(0); ResolvedSwapLeg iborLegExpanded = iborLeg.resolve(refData); List<SwapPaymentPeriod> periods = iborLegExpanded.getPaymentPeriods(); int nbPeriods = periods.size(); RatePaymentPeriod lastPeriod = (RatePaymentPeriod) periods.get(nbPeriods - 1); List<RateAccrualPeriod> accruals = lastPeriod.getAccrualPeriods(); int nbAccruals = accruals.size(); IborRateComputation ibor = (IborRateComputation) accruals.get(nbAccruals - 1).getRateComputation(); return ibor.getFixingDate(); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { SwapTrade trade = template.createTrade(valuationDate, BuySell.BUY, 1, 1, refData); SwapLeg iborLeg = trade.getProduct().getLegs(SwapLegType.IBOR).get(0); ResolvedSwapLeg iborLegExpanded = iborLeg.resolve(refData); List<SwapPaymentPeriod> periods = iborLegExpanded.getPaymentPeriods(); int nbPeriods = periods.size(); RatePaymentPeriod lastPeriod = (RatePaymentPeriod) periods.get(nbPeriods - 1); List<RateAccrualPeriod> accruals = lastPeriod.getAccrualPeriods(); int nbAccruals = accruals.size(); IborRateComputation ibor = (IborRateComputation) accruals.get(nbAccruals - 1).getRateComputation(); return ibor.getFixingDate(); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { SwapTrade trade = template.createTrade(valuationDate, BuySell.BUY, 1, 1, 0, refData); SwapLeg iborLeg = trade.getProduct().getLegs(SwapLegType.IBOR).get(1); // Select the 'second' Ibor leg, i.e. the flat leg ResolvedSwapLeg iborLegExpanded = iborLeg.resolve(refData); List<SwapPaymentPeriod> periods = iborLegExpanded.getPaymentPeriods(); int nbPeriods = periods.size(); RatePaymentPeriod lastPeriod = (RatePaymentPeriod) periods.get(nbPeriods - 1); List<RateAccrualPeriod> accruals = lastPeriod.getAccrualPeriods(); int nbAccruals = accruals.size(); IborRateComputation ibor = (IborRateComputation) accruals.get(nbAccruals - 1).getRateComputation(); return ibor.getFixingDate(); }
public void test_getLegs_SwapLegType() { assertEquals(Swap.of(MOCK_GBP1, MOCK_USD1).getLegs(FIXED), ImmutableList.of(MOCK_GBP1)); assertEquals(Swap.of(MOCK_GBP1, MOCK_USD1).getLegs(IBOR), ImmutableList.of(MOCK_USD1)); assertEquals(Swap.of(MOCK_GBP1, MOCK_USD1).getLegs(OVERNIGHT), ImmutableList.of()); assertEquals(Swap.of(MOCK_GBP1, MOCK_USD1).getLegs(OTHER), ImmutableList.of()); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { SwapTrade trade = template.createTrade(valuationDate, BuySell.BUY, 1, 1, refData); SwapLeg iborLeg = trade.getProduct().getLegs(SwapLegType.IBOR).get(1); // Select the 'second' leg, i.e. the flat leg ResolvedSwapLeg iborLegExpanded = iborLeg.resolve(refData); List<SwapPaymentPeriod> periods = iborLegExpanded.getPaymentPeriods(); int nbPeriods = periods.size(); RatePaymentPeriod lastPeriod = (RatePaymentPeriod) periods.get(nbPeriods - 1); List<RateAccrualPeriod> accruals = lastPeriod.getAccrualPeriods(); int nbAccruals = accruals.size(); IborRateComputation ibor = (IborRateComputation) accruals.get(nbAccruals - 1).getRateComputation(); return ibor.getFixingDate(); }
public void test_of_list() { Swap test = Swap.of(ImmutableList.of(MOCK_GBP1, MOCK_USD1)); assertEquals(test.getLegs(), ImmutableList.of(MOCK_GBP1, MOCK_USD1)); assertEquals(ImmutableList.copyOf(test.getLegs()), ImmutableList.of(MOCK_GBP1, MOCK_USD1)); assertThrowsIllegalArg(() -> Swap.of((List<SwapLeg>) null)); }
@ImmutableValidator private void validate() { ArgChecker.inOrderOrEqual( expiryDate.getUnadjusted(), underlying.getStartDate().getUnadjusted(), "expiryDate", "underlying.startDate.unadjusted"); ArgChecker.isTrue(!underlying.isCrossCurrency(), "Underlying swap must not be cross-currency"); ArgChecker.isTrue(underlying.getLegs(SwapLegType.FIXED).size() == 1, "Underlying swap must have one fixed leg"); ArgChecker.isTrue(underlying.getLegs(SwapLegType.IBOR).size() == 1, "Underlying swap must have one Ibor leg"); ArgChecker.isTrue(underlying.allIndices().size() == 1, "Underlying swap must have one index"); ArgChecker.isTrue(underlying.allIndices().iterator().next() instanceof IborIndex, "Underlying swap must have one Ibor index"); }
public void test_builder_varargs() { Swap test = Swap.builder() .legs(MOCK_GBP1, MOCK_USD1) .build(); assertEquals(test.getLegs(), ImmutableList.of(MOCK_GBP1, MOCK_USD1)); }
public void test_builder_list() { Swap test = Swap.builder() .legs(ImmutableList.of(MOCK_GBP1, MOCK_USD1)) .build(); assertEquals(test.getLegs(), ImmutableList.of(MOCK_GBP1, MOCK_USD1)); assertEquals(test.isCrossCurrency(), true); assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(GBP, USD)); assertEquals(test.allCurrencies(), ImmutableSet.of(GBP, EUR, USD)); }
public void test_createTrade() { FixedInflationSwapTemplate base = FixedInflationSwapTemplate.of(TENOR_10Y, CONV); LocalDate tradeDate = LocalDate.of(2015, 5, 5); LocalDate startDate = date(2015, 5, 6); // T+1 LocalDate endDate = date(2025, 5, 6); SwapTrade test = base.createTrade(tradeDate, BUY, NOTIONAL_2M, 0.25d, REF_DATA); Swap expected = Swap.of( FIXED.toLeg(startDate, endDate, PAY, NOTIONAL_2M, 0.25d), INFL.toLeg(startDate, endDate, RECEIVE, NOTIONAL_2M)); assertEquals(test.getInfo().getTradeDate(), Optional.of(tradeDate)); assertEquals(test.getProduct().getLegs().get(0), expected.getLegs().get(0)); assertEquals(test.getProduct().getLegs().get(1), expected.getLegs().get(1)); assertEquals(test.getProduct(), expected); }
private static SwapTrade parseVariableRates(SwapTrade trade, List<CsvRow> variableRows) { ImmutableList.Builder<ValueStep> stepBuilder = ImmutableList.builder(); for (CsvRow row : variableRows) { LocalDate date = LoaderUtils.parseDate(row.getValue(START_DATE_FIELD)); row.findValue(FIXED_RATE_FIELD) .map(str -> LoaderUtils.parseDoublePercent(str)) .ifPresent(fixedRate -> stepBuilder.add(ValueStep.of(date, ValueAdjustment.ofReplace(fixedRate)))); } ImmutableList<ValueStep> varRates = stepBuilder.build(); if (varRates.isEmpty()) { return trade; } // adjust the trade, inserting the variable rates ImmutableList.Builder<SwapLeg> legBuilder = ImmutableList.builder(); for (SwapLeg swapLeg : trade.getProduct().getLegs()) { RateCalculationSwapLeg leg = (RateCalculationSwapLeg) swapLeg; if (leg.getCalculation() instanceof FixedRateCalculation) { FixedRateCalculation baseCalc = (FixedRateCalculation) leg.getCalculation(); FixedRateCalculation calc = baseCalc.toBuilder() .rate(ValueSchedule.of(baseCalc.getRate().getInitialValue(), varRates)) .build(); legBuilder.add(leg.toBuilder().calculation(calc).build()); } else { legBuilder.add(leg); } } return replaceLegs(trade, legBuilder.build()); }
private static SwapTrade parseVariableNotional(SwapTrade trade, List<CsvRow> variableRows) { // parse notionals ImmutableList.Builder<ValueStep> stepBuilder = ImmutableList.builder(); for (CsvRow row : variableRows) { LocalDate date = LoaderUtils.parseDate(row.getValue(START_DATE_FIELD)); row.findValue(NOTIONAL_FIELD) .map(str -> LoaderUtils.parseDouble(str)) .ifPresent(notional -> stepBuilder.add(ValueStep.of(date, ValueAdjustment.ofReplace(notional)))); } ImmutableList<ValueStep> varNotionals = stepBuilder.build(); if (varNotionals.isEmpty()) { return trade; } // adjust the trade, inserting the variable notionals ImmutableList.Builder<SwapLeg> legBuilder = ImmutableList.builder(); for (SwapLeg swapLeg : trade.getProduct().getLegs()) { RateCalculationSwapLeg leg = (RateCalculationSwapLeg) swapLeg; NotionalSchedule notionalSchedule = leg.getNotionalSchedule().toBuilder() .amount(ValueSchedule.of(leg.getNotionalSchedule().getAmount().getInitialValue(), varNotionals)) .build(); legBuilder.add(leg.toBuilder().notionalSchedule(notionalSchedule).build()); } return replaceLegs(trade, legBuilder.build()); }
@ImmutableValidator private void validate() { ArgChecker.isFalse(underlyingSwap.isCrossCurrency(), "Underlying swap must not be cross currency"); for (SwapLeg swapLeg : underlyingSwap.getLegs()) { if (swapLeg.getType().equals(SwapLegType.FIXED)) { ArgChecker.isTrue(swapLeg.getPayReceive().isReceive(), "Underlying swap must receive the fixed leg"); } if (swapLeg instanceof RateCalculationSwapLeg) { RateCalculationSwapLeg leg = (RateCalculationSwapLeg) swapLeg; ArgChecker.isTrue(Math.abs(leg.getNotionalSchedule().getAmount().getInitialValue()) == 1d, "Underlying swap must have a notional of 1"); } } }
@ImmutableValidator private void validate() { ArgChecker.inOrderOrEqual( deliveryDate, underlyingSwap.getStartDate().getUnadjusted(), "deliveryDate", "underlyingSwap.startDate.unadjusted"); ArgChecker.isFalse(underlyingSwap.isCrossCurrency(), "Underlying swap must not be cross currency"); for (SwapLeg swapLeg : underlyingSwap.getLegs()) { if (swapLeg.getType().equals(SwapLegType.FIXED)) { ArgChecker.isTrue(swapLeg.getPayReceive().isReceive(), "Underlying swap must receive the fixed leg"); } if (swapLeg instanceof RateCalculationSwapLeg) { RateCalculationSwapLeg leg = (RateCalculationSwapLeg) swapLeg; ArgChecker.isTrue(Math.abs(leg.getNotionalSchedule().getAmount().getInitialValue()) == 1d, "Underlying swap must have a notional of 1"); } } ArgChecker.inOrderOrEqual(lastTradeDate, deliveryDate, "lastTradeDate", "deliveryDate"); }