Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package de.solactive.business.modules.calculation.bond;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.List;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.assertj.core.api.SoftAssertions;
- import org.joda.time.DateTime;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import de.solactive.business.utils.ExchangeRateTestUtils;
- import de.solactive.calculation.common.container.CalculationContext;
- import de.solactive.calculation.common.container.CalculationFlags;
- import de.solactive.calculation.common.container.CalculationProviderRepository;
- import de.solactive.calculation.common.container.StatefulCalculator;
- import de.solactive.calculation.common.container.StatefulIndexCalculationResult;
- import de.solactive.calculation.common.container.impl.CalculatorFactory;
- import de.solactive.calculation.common.container.impl.PrefilledBondCalculationProvider;
- import de.solactive.calculation.common.container.impl.PrefilledClosingDataProvider;
- import de.solactive.calculation.common.container.impl.PrefilledTickDataProvider;
- import de.solactive.exceltestutils.model.ExcelImportUtils;
- import de.solactive.exceltestutils.model.indices.bond.BondExcelTestUtilsNew;
- import de.solactive.exceltestutils.model.instruments.ExcelInstrumentImportUtils;
- import de.solactive.excelutils.ExcelUtils;
- import de.solactive.model.SimpleDate;
- import de.solactive.model.index.IndexCalculationResult;
- import de.solactive.model.index.IndexDefinition;
- import de.solactive.model.index.IndexTick;
- import de.solactive.model.index.PrefilledCalculationDaysProvider;
- import de.solactive.model.index.bond.BondCalculation;
- import de.solactive.model.instrument.BondInstrument;
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration
- public class BondCalculationIT
- {
- private SimpleDate today;
- private SimpleDate previousDate;
- private HSSFWorkbook workbook;
- private IndexDefinition index;
- private Map<Long, BondInstrument> bondInstruments;
- private IndexTick previousIndexTick;
- private IndexTick expectedIndexTick;
- private List<BondCalculation> bondCalculationList;
- private List<SimpleDate> nonCalculationDays;
- private List<SimpleDate> calculationDays;
- @Before
- public void init()
- {
- }
- @After
- public void cleanUp()
- {
- }
- private void setupData(String fileName) throws Exception
- {
- workbook = ExcelUtils.getWorkbook(fileName);
- //read index definition
- index = BondExcelTestUtilsNew.createBondIndexFromExcel(ExcelUtils.getStream(fileName), "Index");
- //read bond instruments
- bondInstruments = ExcelInstrumentImportUtils.createBondInstrumentsFromExcel(ExcelUtils.getStream(fileName), "Bonds");
- //read bond members
- index.bondMembers = BondExcelTestUtilsNew.createBondIndexMembershipFromExcel(ExcelUtils.getStream(fileName), "Memberships", index, bondInstruments);
- //read previous indexTick
- previousIndexTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "PreviousIndexTick", index);
- expectedIndexTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "IndexTick", index);
- //Bond calculations
- bondCalculationList = BondExcelTestUtilsNew.createBondCalculationsFromBondExcelImport(ExcelUtils.getStream(fileName), "BondCalculations");
- nonCalculationDays = BondExcelTestUtilsNew.createDaysFromBondExcelImport(ExcelUtils.getStream(fileName), "NonCalculationDays");
- Collections.sort(nonCalculationDays);
- calculationDays = setCalculationDays(nonCalculationDays);
- }
- @Test
- public void calculateDefaultBondMustWork() throws Exception
- {
- Collection<Object> repoCollection = new ArrayList<>();
- setupData("/testfiles/bond/filegeneration/Default151_2018-02-05.xls");
- //set calculation days
- PrefilledCalculationDaysProvider calculationDaysProvider = new PrefilledCalculationDaysProvider();
- calculationDaysProvider.setNonCalculationDays(index.getUniqueIdentifier(), nonCalculationDays);
- calculationDaysProvider.setCalculationDaysWithPreviousAndNext(index.getUniqueIdentifier(), calculationDays);
- //Previous Index Tick
- PrefilledClosingDataProvider closingDataProvider = new PrefilledClosingDataProvider();
- closingDataProvider.addClosingCalculation(previousIndexTick);
- PrefilledTickDataProvider tickDataProviderForRecalculation = new PrefilledTickDataProvider(previousIndexTick);
- tickDataProviderForRecalculation.setInstrumentsPricesFromFeedMap(expectedIndexTick.extractRawInstrumentTicksFromMetadata(), true);
- //Bond Calculations
- PrefilledBondCalculationProvider bondCalculationProvider = new PrefilledBondCalculationProvider();
- bondCalculationProvider.setBondCalculations(bondCalculationList);
- //Add providers to repo collection
- repoCollection.add(ExchangeRateTestUtils.getExchangeRatePoolProvider(workbook));
- repoCollection.add(calculationDaysProvider);
- repoCollection.add(closingDataProvider);
- repoCollection.add(bondCalculationProvider);
- CalculationProviderRepository calculatorProviderRepository = CalculationProviderRepository.ofEmpty().replace(repoCollection);
- calculatorProviderRepository.currentTimeProvider = () -> new DateTime(expectedIndexTick.calculationTimestamp).getSecondOfDay();
- final StatefulCalculator calculator = CalculatorFactory.getCalculator(index, tickDataProviderForRecalculation, calculatorProviderRepository);
- final CalculationContext context = new CalculationContext();
- context.currentDate = new SimpleDate(expectedIndexTick.calculationTimestamp);
- context.previousClosingDate = new SimpleDate(previousIndexTick.calculationTimestamp);
- calculator.initialize(context);
- StatefulIndexCalculationResult calculation = calculator.calculate(new CalculationFlags(true));
- IndexCalculationResult finalCalculationResult = calculation.transform(calculation.flags, calculation.index);
- IndexTick calculatedIndexTick = IndexTick.fromIndexCalculation(finalCalculationResult);
- SoftAssertions assertion = new SoftAssertions();
- assertion.assertThat(calculatedIndexTick.tickValue).isEqualTo(expectedIndexTick.tickValue);
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePrices, expectedIndexTick.extractTradePrices().tradePrices, "Base trade prices");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().bondTradePricesById, expectedIndexTick.extractTradePrices().bondTradePricesById, "Trade prices: Bonds");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractTradePrices().financialInstrumentTradePricesById, "Trade prices: Financial instruments");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesByQualifier, expectedIndexTick.extractTradePrices().tradePricesByQualifier, "Trade prices: Qualifier");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractTradePrices().tradePricesForFXRatePool, "Trade prices: FX Rate pool");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondInstrumentRatios(), expectedIndexTick.extractBondInstrumentRatios(), "Bond Instrument Ratios");
- setSameListAssertions(assertion, calculatedIndexTick.extractRawInstrumentTicksFromMetadata(), expectedIndexTick.extractRawInstrumentTicksFromMetadata(), "Raw Instrument Ticks");
- setSameListAssertions(assertion, calculatedIndexTick.extractParameters(), expectedIndexTick.extractParameters(), "Parameters");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePrices, expectedIndexTick.extractAdditionalTradePrices().tradePrices, "Base additional Trade prices");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().bondTradePricesById, expectedIndexTick.extractAdditionalTradePrices().bondTradePricesById, "Additional Trade prices: Bonds");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, "Additional Trade prices: Financial instruments");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, expectedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, "Additional Trade prices: Qualifier");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, "Additional Trade prices: FX Rate pool");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCas(), expectedIndexTick.extractBondPaidCashComponents().getCashCas(), "Bond Paid Cash Components: Cash ca");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashSinks(), expectedIndexTick.extractBondPaidCashComponents().getCashSinks(), "Bond Paid Cash Components: Cash sinks");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCoupons(), expectedIndexTick.extractBondPaidCashComponents().getCashCoupons(), "Bond Paid Cash Components: Cash coupons");
- setSameListAssertions(assertion, calculatedIndexTick.extractCashComponents(), expectedIndexTick.extractCashComponents(), "Cash Components");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTickData(), expectedIndexTick.extractAdditionalTickData(), "Additional Tick data");
- assertion.assertAll();
- }
- @Test
- public void calculateBmvBondMustWork() throws Exception
- {
- String fileName = "/testfiles/bond/filegeneration/BMV151_2018-02-05.xls";
- Collection<Object> repoCollection = new ArrayList<>();
- setupData(fileName);
- PrefilledCalculationDaysProvider calculationDaysProvider = new PrefilledCalculationDaysProvider();
- calculationDaysProvider.setNonCalculationDays(index.getUniqueIdentifier(), nonCalculationDays);
- calculationDaysProvider.setCalculationDaysWithPreviousAndNext(index.getUniqueIdentifier(), calculationDays);
- //Previous Index Tick
- PrefilledClosingDataProvider closingDataProvider = new PrefilledClosingDataProvider();
- closingDataProvider.addClosingCalculation(previousIndexTick);
- //Last rebalancing tick
- final IndexTick lastRebalancingTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "LastRebalancingIndexTick", index);
- closingDataProvider.addClosingCalculation(lastRebalancingTick);
- //Bond Calculations
- PrefilledBondCalculationProvider bondCalculationProvider = new PrefilledBondCalculationProvider();
- bondCalculationProvider.setBondCalculations(bondCalculationList);
- //Add providers to repo collection
- repoCollection.add(ExchangeRateTestUtils.getExchangeRatePoolProvider(workbook));
- repoCollection.add(calculationDaysProvider);
- repoCollection.add(closingDataProvider);
- repoCollection.add(bondCalculationProvider);
- PrefilledTickDataProvider tickDataProviderForRecalculation = new PrefilledTickDataProvider();
- tickDataProviderForRecalculation.setInstrumentsPricesFromFeedMap(expectedIndexTick.extractRawInstrumentTicksFromMetadata(), true);
- //todo:
- //tickDataProviderForRecalculation.setExchangeRatesFromFeedMap(expectedIndexTick.extractExchangeRates());
- CalculationProviderRepository calculatorProviderRepository = CalculationProviderRepository.ofEmpty().replace(repoCollection);
- calculatorProviderRepository.currentTimeProvider = () -> new DateTime(expectedIndexTick.calculationTimestamp).getSecondOfDay();
- final StatefulCalculator calculator = CalculatorFactory.getCalculator(index, tickDataProviderForRecalculation, calculatorProviderRepository);
- final CalculationContext context = new CalculationContext();
- context.currentDate = new SimpleDate(expectedIndexTick.calculationTimestamp);
- context.previousClosingDate = new SimpleDate(previousIndexTick.calculationTimestamp);
- calculator.initialize(context);
- StatefulIndexCalculationResult calculation = calculator.calculate(new CalculationFlags(true));
- IndexCalculationResult finalCalculationResult = calculation.transform(calculation.flags, calculation.index);
- IndexTick calculatedIndexTick = IndexTick.fromIndexCalculation(finalCalculationResult);
- SoftAssertions assertion = new SoftAssertions();
- assertion.assertThat(calculatedIndexTick.tickValue).isEqualTo(expectedIndexTick.tickValue);
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePrices, expectedIndexTick.extractTradePrices().tradePrices, "Base trade prices");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().bondTradePricesById, expectedIndexTick.extractTradePrices().bondTradePricesById, "Trade prices: Bonds");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractTradePrices().financialInstrumentTradePricesById, "Trade prices: Financial instruments");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesByQualifier, expectedIndexTick.extractTradePrices().tradePricesByQualifier, "Trade prices: Qualifier");
- setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractTradePrices().tradePricesForFXRatePool, "Trade prices: FX Rate pool");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondInstrumentRatios(), expectedIndexTick.extractBondInstrumentRatios(), "Bond Instrument Ratios");
- setSameListAssertions(assertion, calculatedIndexTick.extractRawInstrumentTicksFromMetadata(), expectedIndexTick.extractRawInstrumentTicksFromMetadata(), "Raw Instrument Ticks");
- setSameListAssertions(assertion, calculatedIndexTick.extractParameters(), expectedIndexTick.extractParameters(), "Parameters");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePrices, expectedIndexTick.extractAdditionalTradePrices().tradePrices, "Base additional Trade prices");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().bondTradePricesById, expectedIndexTick.extractAdditionalTradePrices().bondTradePricesById, "Additional Trade prices: Bonds");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, "Additional Trade prices: Financial instruments");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, expectedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, "Additional Trade prices: Qualifier");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, "Additional Trade prices: FX Rate pool");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCas(), expectedIndexTick.extractBondPaidCashComponents().getCashCas(), "Bond Paid Cash Components: Cash ca");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashSinks(), expectedIndexTick.extractBondPaidCashComponents().getCashSinks(), "Bond Paid Cash Components: Cash sinks");
- setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCoupons(), expectedIndexTick.extractBondPaidCashComponents().getCashCoupons(), "Bond Paid Cash Components: Cash coupons");
- setSameListAssertions(assertion, calculatedIndexTick.extractCashComponents(), expectedIndexTick.extractCashComponents(), "Cash Components");
- setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTickData(), expectedIndexTick.extractAdditionalTickData(), "Additional Tick data");
- assertion.assertAll();
- }
- /**
- * Helper function that sets assertions for (map1 contained in map2) and (map2 contained in map1)
- * @param assertion
- * @param actual
- * @param expected
- */
- private <T, R> void setSameListAssertions(SoftAssertions assertion, Map<T, R> actual, Map<T, R> expected, String description)
- {
- if(actual != null && expected != null)
- {
- assertion.assertThat(actual).as(String.format("Actual -> Expected: %s", description)).containsAllEntriesOf(expected);
- assertion.assertThat(expected).as(String.format("Expected -> Actual: %s", description)).containsAllEntriesOf(actual);
- }
- }
- private List<SimpleDate> setCalculationDays(List<SimpleDate> nonCalculationDays)
- {
- // create the calculationDays
- List<SimpleDate> calculationDays = new ArrayList<>();
- SimpleDate tmpDate = nonCalculationDays.get(0);
- tmpDate = tmpDate.getNextDay();
- int i = 1;
- SimpleDate actualNonCalculationDay = nonCalculationDays.get(i);
- while (tmpDate.isBefore(nonCalculationDays.get(nonCalculationDays.size()-1)))
- {
- if (tmpDate.equals(actualNonCalculationDay))
- {
- i++;
- actualNonCalculationDay = nonCalculationDays.get(i);
- }
- else
- {
- calculationDays.add(tmpDate);
- }
- tmpDate = tmpDate.getNextDay();
- }
- return calculationDays;
- }
- @Configuration
- static class Config
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement