Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.09 KB | None | 0 0
  1. package de.solactive.business.modules.calculation.bond;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  10. import org.assertj.core.api.SoftAssertions;
  11. import org.joda.time.DateTime;
  12. import org.junit.After;
  13. import org.junit.Before;
  14. import org.junit.Test;
  15. import org.junit.runner.RunWith;
  16.  
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.test.context.ContextConfiguration;
  19. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  20.  
  21. import de.solactive.business.utils.ExchangeRateTestUtils;
  22. import de.solactive.calculation.common.container.CalculationContext;
  23. import de.solactive.calculation.common.container.CalculationFlags;
  24. import de.solactive.calculation.common.container.CalculationProviderRepository;
  25. import de.solactive.calculation.common.container.StatefulCalculator;
  26. import de.solactive.calculation.common.container.StatefulIndexCalculationResult;
  27. import de.solactive.calculation.common.container.impl.CalculatorFactory;
  28. import de.solactive.calculation.common.container.impl.PrefilledBondCalculationProvider;
  29. import de.solactive.calculation.common.container.impl.PrefilledClosingDataProvider;
  30. import de.solactive.calculation.common.container.impl.PrefilledTickDataProvider;
  31. import de.solactive.exceltestutils.model.ExcelImportUtils;
  32. import de.solactive.exceltestutils.model.indices.bond.BondExcelTestUtilsNew;
  33. import de.solactive.exceltestutils.model.instruments.ExcelInstrumentImportUtils;
  34. import de.solactive.excelutils.ExcelUtils;
  35. import de.solactive.model.SimpleDate;
  36. import de.solactive.model.index.IndexCalculationResult;
  37. import de.solactive.model.index.IndexDefinition;
  38. import de.solactive.model.index.IndexTick;
  39. import de.solactive.model.index.PrefilledCalculationDaysProvider;
  40. import de.solactive.model.index.bond.BondCalculation;
  41. import de.solactive.model.instrument.BondInstrument;
  42.  
  43.  
  44. @RunWith(SpringJUnit4ClassRunner.class)
  45. @ContextConfiguration
  46. public class BondCalculationIT
  47. {
  48. private SimpleDate today;
  49. private SimpleDate previousDate;
  50. private HSSFWorkbook workbook;
  51. private IndexDefinition index;
  52. private Map<Long, BondInstrument> bondInstruments;
  53. private IndexTick previousIndexTick;
  54. private IndexTick expectedIndexTick;
  55. private List<BondCalculation> bondCalculationList;
  56. private List<SimpleDate> nonCalculationDays;
  57. private List<SimpleDate> calculationDays;
  58.  
  59.  
  60. @Before
  61. public void init()
  62. {
  63. }
  64.  
  65. @After
  66. public void cleanUp()
  67. {
  68. }
  69.  
  70. private void setupData(String fileName) throws Exception
  71. {
  72.  
  73. workbook = ExcelUtils.getWorkbook(fileName);
  74.  
  75. //read index definition
  76. index = BondExcelTestUtilsNew.createBondIndexFromExcel(ExcelUtils.getStream(fileName), "Index");
  77.  
  78. //read bond instruments
  79. bondInstruments = ExcelInstrumentImportUtils.createBondInstrumentsFromExcel(ExcelUtils.getStream(fileName), "Bonds");
  80.  
  81. //read bond members
  82. index.bondMembers = BondExcelTestUtilsNew.createBondIndexMembershipFromExcel(ExcelUtils.getStream(fileName), "Memberships", index, bondInstruments);
  83.  
  84. //read previous indexTick
  85. previousIndexTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "PreviousIndexTick", index);
  86.  
  87. expectedIndexTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "IndexTick", index);
  88.  
  89. //Bond calculations
  90. bondCalculationList = BondExcelTestUtilsNew.createBondCalculationsFromBondExcelImport(ExcelUtils.getStream(fileName), "BondCalculations");
  91.  
  92. nonCalculationDays = BondExcelTestUtilsNew.createDaysFromBondExcelImport(ExcelUtils.getStream(fileName), "NonCalculationDays");
  93. Collections.sort(nonCalculationDays);
  94. calculationDays = setCalculationDays(nonCalculationDays);
  95. }
  96.  
  97. @Test
  98. public void calculateDefaultBondMustWork() throws Exception
  99. {
  100. Collection<Object> repoCollection = new ArrayList<>();
  101. setupData("/testfiles/bond/filegeneration/Default151_2018-02-05.xls");
  102.  
  103. //set calculation days
  104. PrefilledCalculationDaysProvider calculationDaysProvider = new PrefilledCalculationDaysProvider();
  105.  
  106. calculationDaysProvider.setNonCalculationDays(index.getUniqueIdentifier(), nonCalculationDays);
  107. calculationDaysProvider.setCalculationDaysWithPreviousAndNext(index.getUniqueIdentifier(), calculationDays);
  108.  
  109. //Previous Index Tick
  110. PrefilledClosingDataProvider closingDataProvider = new PrefilledClosingDataProvider();
  111. closingDataProvider.addClosingCalculation(previousIndexTick);
  112.  
  113. PrefilledTickDataProvider tickDataProviderForRecalculation = new PrefilledTickDataProvider(previousIndexTick);
  114. tickDataProviderForRecalculation.setInstrumentsPricesFromFeedMap(expectedIndexTick.extractRawInstrumentTicksFromMetadata(), true);
  115.  
  116. //Bond Calculations
  117. PrefilledBondCalculationProvider bondCalculationProvider = new PrefilledBondCalculationProvider();
  118. bondCalculationProvider.setBondCalculations(bondCalculationList);
  119.  
  120. //Add providers to repo collection
  121. repoCollection.add(ExchangeRateTestUtils.getExchangeRatePoolProvider(workbook));
  122. repoCollection.add(calculationDaysProvider);
  123. repoCollection.add(closingDataProvider);
  124. repoCollection.add(bondCalculationProvider);
  125.  
  126. CalculationProviderRepository calculatorProviderRepository = CalculationProviderRepository.ofEmpty().replace(repoCollection);
  127. calculatorProviderRepository.currentTimeProvider = () -> new DateTime(expectedIndexTick.calculationTimestamp).getSecondOfDay();
  128.  
  129. final StatefulCalculator calculator = CalculatorFactory.getCalculator(index, tickDataProviderForRecalculation, calculatorProviderRepository);
  130.  
  131. final CalculationContext context = new CalculationContext();
  132. context.currentDate = new SimpleDate(expectedIndexTick.calculationTimestamp);
  133. context.previousClosingDate = new SimpleDate(previousIndexTick.calculationTimestamp);
  134. calculator.initialize(context);
  135.  
  136. StatefulIndexCalculationResult calculation = calculator.calculate(new CalculationFlags(true));
  137. IndexCalculationResult finalCalculationResult = calculation.transform(calculation.flags, calculation.index);
  138.  
  139. IndexTick calculatedIndexTick = IndexTick.fromIndexCalculation(finalCalculationResult);
  140.  
  141. SoftAssertions assertion = new SoftAssertions();
  142.  
  143. assertion.assertThat(calculatedIndexTick.tickValue).isEqualTo(expectedIndexTick.tickValue);
  144.  
  145. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePrices, expectedIndexTick.extractTradePrices().tradePrices, "Base trade prices");
  146. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().bondTradePricesById, expectedIndexTick.extractTradePrices().bondTradePricesById, "Trade prices: Bonds");
  147. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractTradePrices().financialInstrumentTradePricesById, "Trade prices: Financial instruments");
  148. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesByQualifier, expectedIndexTick.extractTradePrices().tradePricesByQualifier, "Trade prices: Qualifier");
  149. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractTradePrices().tradePricesForFXRatePool, "Trade prices: FX Rate pool");
  150.  
  151. setSameListAssertions(assertion, calculatedIndexTick.extractBondInstrumentRatios(), expectedIndexTick.extractBondInstrumentRatios(), "Bond Instrument Ratios");
  152. setSameListAssertions(assertion, calculatedIndexTick.extractRawInstrumentTicksFromMetadata(), expectedIndexTick.extractRawInstrumentTicksFromMetadata(), "Raw Instrument Ticks");
  153. setSameListAssertions(assertion, calculatedIndexTick.extractParameters(), expectedIndexTick.extractParameters(), "Parameters");
  154.  
  155. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePrices, expectedIndexTick.extractAdditionalTradePrices().tradePrices, "Base additional Trade prices");
  156. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().bondTradePricesById, expectedIndexTick.extractAdditionalTradePrices().bondTradePricesById, "Additional Trade prices: Bonds");
  157. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, "Additional Trade prices: Financial instruments");
  158. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, expectedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, "Additional Trade prices: Qualifier");
  159. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, "Additional Trade prices: FX Rate pool");
  160.  
  161. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCas(), expectedIndexTick.extractBondPaidCashComponents().getCashCas(), "Bond Paid Cash Components: Cash ca");
  162. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashSinks(), expectedIndexTick.extractBondPaidCashComponents().getCashSinks(), "Bond Paid Cash Components: Cash sinks");
  163. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCoupons(), expectedIndexTick.extractBondPaidCashComponents().getCashCoupons(), "Bond Paid Cash Components: Cash coupons");
  164.  
  165. setSameListAssertions(assertion, calculatedIndexTick.extractCashComponents(), expectedIndexTick.extractCashComponents(), "Cash Components");
  166. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTickData(), expectedIndexTick.extractAdditionalTickData(), "Additional Tick data");
  167.  
  168. assertion.assertAll();
  169. }
  170.  
  171. @Test
  172. public void calculateBmvBondMustWork() throws Exception
  173. {
  174. String fileName = "/testfiles/bond/filegeneration/BMV151_2018-02-05.xls";
  175. Collection<Object> repoCollection = new ArrayList<>();
  176.  
  177. setupData(fileName);
  178.  
  179. PrefilledCalculationDaysProvider calculationDaysProvider = new PrefilledCalculationDaysProvider();
  180. calculationDaysProvider.setNonCalculationDays(index.getUniqueIdentifier(), nonCalculationDays);
  181. calculationDaysProvider.setCalculationDaysWithPreviousAndNext(index.getUniqueIdentifier(), calculationDays);
  182.  
  183. //Previous Index Tick
  184. PrefilledClosingDataProvider closingDataProvider = new PrefilledClosingDataProvider();
  185. closingDataProvider.addClosingCalculation(previousIndexTick);
  186.  
  187. //Last rebalancing tick
  188. final IndexTick lastRebalancingTick = ExcelImportUtils.createClosingTickFromExcel(ExcelUtils.getStream(fileName), "LastRebalancingIndexTick", index);
  189. closingDataProvider.addClosingCalculation(lastRebalancingTick);
  190.  
  191. //Bond Calculations
  192. PrefilledBondCalculationProvider bondCalculationProvider = new PrefilledBondCalculationProvider();
  193. bondCalculationProvider.setBondCalculations(bondCalculationList);
  194.  
  195. //Add providers to repo collection
  196. repoCollection.add(ExchangeRateTestUtils.getExchangeRatePoolProvider(workbook));
  197. repoCollection.add(calculationDaysProvider);
  198. repoCollection.add(closingDataProvider);
  199. repoCollection.add(bondCalculationProvider);
  200.  
  201. PrefilledTickDataProvider tickDataProviderForRecalculation = new PrefilledTickDataProvider();
  202. tickDataProviderForRecalculation.setInstrumentsPricesFromFeedMap(expectedIndexTick.extractRawInstrumentTicksFromMetadata(), true);
  203.  
  204. //todo:
  205. //tickDataProviderForRecalculation.setExchangeRatesFromFeedMap(expectedIndexTick.extractExchangeRates());
  206.  
  207. CalculationProviderRepository calculatorProviderRepository = CalculationProviderRepository.ofEmpty().replace(repoCollection);
  208. calculatorProviderRepository.currentTimeProvider = () -> new DateTime(expectedIndexTick.calculationTimestamp).getSecondOfDay();
  209.  
  210.  
  211. final StatefulCalculator calculator = CalculatorFactory.getCalculator(index, tickDataProviderForRecalculation, calculatorProviderRepository);
  212.  
  213. final CalculationContext context = new CalculationContext();
  214. context.currentDate = new SimpleDate(expectedIndexTick.calculationTimestamp);
  215. context.previousClosingDate = new SimpleDate(previousIndexTick.calculationTimestamp);
  216. calculator.initialize(context);
  217.  
  218. StatefulIndexCalculationResult calculation = calculator.calculate(new CalculationFlags(true));
  219. IndexCalculationResult finalCalculationResult = calculation.transform(calculation.flags, calculation.index);
  220.  
  221. IndexTick calculatedIndexTick = IndexTick.fromIndexCalculation(finalCalculationResult);
  222.  
  223. SoftAssertions assertion = new SoftAssertions();
  224.  
  225. assertion.assertThat(calculatedIndexTick.tickValue).isEqualTo(expectedIndexTick.tickValue);
  226.  
  227. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePrices, expectedIndexTick.extractTradePrices().tradePrices, "Base trade prices");
  228. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().bondTradePricesById, expectedIndexTick.extractTradePrices().bondTradePricesById, "Trade prices: Bonds");
  229. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractTradePrices().financialInstrumentTradePricesById, "Trade prices: Financial instruments");
  230. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesByQualifier, expectedIndexTick.extractTradePrices().tradePricesByQualifier, "Trade prices: Qualifier");
  231. setSameListAssertions(assertion, calculatedIndexTick.extractTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractTradePrices().tradePricesForFXRatePool, "Trade prices: FX Rate pool");
  232.  
  233. setSameListAssertions(assertion, calculatedIndexTick.extractBondInstrumentRatios(), expectedIndexTick.extractBondInstrumentRatios(), "Bond Instrument Ratios");
  234. setSameListAssertions(assertion, calculatedIndexTick.extractRawInstrumentTicksFromMetadata(), expectedIndexTick.extractRawInstrumentTicksFromMetadata(), "Raw Instrument Ticks");
  235. setSameListAssertions(assertion, calculatedIndexTick.extractParameters(), expectedIndexTick.extractParameters(), "Parameters");
  236.  
  237. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePrices, expectedIndexTick.extractAdditionalTradePrices().tradePrices, "Base additional Trade prices");
  238. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().bondTradePricesById, expectedIndexTick.extractAdditionalTradePrices().bondTradePricesById, "Additional Trade prices: Bonds");
  239. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, expectedIndexTick.extractAdditionalTradePrices().financialInstrumentTradePricesById, "Additional Trade prices: Financial instruments");
  240. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, expectedIndexTick.extractAdditionalTradePrices().tradePricesByQualifier, "Additional Trade prices: Qualifier");
  241. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, expectedIndexTick.extractAdditionalTradePrices().tradePricesForFXRatePool, "Additional Trade prices: FX Rate pool");
  242.  
  243. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCas(), expectedIndexTick.extractBondPaidCashComponents().getCashCas(), "Bond Paid Cash Components: Cash ca");
  244. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashSinks(), expectedIndexTick.extractBondPaidCashComponents().getCashSinks(), "Bond Paid Cash Components: Cash sinks");
  245. setSameListAssertions(assertion, calculatedIndexTick.extractBondPaidCashComponents().getCashCoupons(), expectedIndexTick.extractBondPaidCashComponents().getCashCoupons(), "Bond Paid Cash Components: Cash coupons");
  246.  
  247. setSameListAssertions(assertion, calculatedIndexTick.extractCashComponents(), expectedIndexTick.extractCashComponents(), "Cash Components");
  248. setSameListAssertions(assertion, calculatedIndexTick.extractAdditionalTickData(), expectedIndexTick.extractAdditionalTickData(), "Additional Tick data");
  249.  
  250.  
  251. assertion.assertAll();
  252. }
  253.  
  254. /**
  255. * Helper function that sets assertions for (map1 contained in map2) and (map2 contained in map1)
  256. * @param assertion
  257. * @param actual
  258. * @param expected
  259. */
  260. private <T, R> void setSameListAssertions(SoftAssertions assertion, Map<T, R> actual, Map<T, R> expected, String description)
  261. {
  262. if(actual != null && expected != null)
  263. {
  264. assertion.assertThat(actual).as(String.format("Actual -> Expected: %s", description)).containsAllEntriesOf(expected);
  265. assertion.assertThat(expected).as(String.format("Expected -> Actual: %s", description)).containsAllEntriesOf(actual);
  266. }
  267. }
  268.  
  269. private List<SimpleDate> setCalculationDays(List<SimpleDate> nonCalculationDays)
  270. {
  271. // create the calculationDays
  272. List<SimpleDate> calculationDays = new ArrayList<>();
  273. SimpleDate tmpDate = nonCalculationDays.get(0);
  274. tmpDate = tmpDate.getNextDay();
  275. int i = 1;
  276. SimpleDate actualNonCalculationDay = nonCalculationDays.get(i);
  277. while (tmpDate.isBefore(nonCalculationDays.get(nonCalculationDays.size()-1)))
  278. {
  279. if (tmpDate.equals(actualNonCalculationDay))
  280. {
  281. i++;
  282. actualNonCalculationDay = nonCalculationDays.get(i);
  283. }
  284. else
  285. {
  286. calculationDays.add(tmpDate);
  287. }
  288. tmpDate = tmpDate.getNextDay();
  289. }
  290. return calculationDays;
  291. }
  292.  
  293.  
  294. @Configuration
  295. static class Config
  296. {
  297. }
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement